按钮光泽扫过 4 种特效(斜向扫光/双向扫光/镜面高光 CSS 源码)
按钮光泽扫过 4 种玩法:单道斜向扫光、双向相向扫光、常驻镜面高光、圆点光晕滚动,纯 CSS 伪元素实现,适合 CTA 按钮与营销落地页。
效果演示(真实可交互)
把鼠标移到按钮上,观察光泽扫过的方式差异。所有效果都由 ::before / ::after 伪元素完成,不需要改动 HTML 结构,直接复制 CSS 即可使用。
完整代码
HTML 结构:按钮就是一个普通的 <button class="sh-btn sh-sweep">,光泽层全部由伪元素承担:
<button class="sh-btn sh-sweep">单道扫过</button>
<button class="sh-btn sh-dual">双向扫过</button>
<button class="sh-btn sh-mirror">镜面高光</button>
<button class="sh-btn sh-glow">光晕扫过</button>
核心 CSS(以单道扫过为例):
.sh-sweep {
position: relative;
overflow: hidden; /* 关键:把光带裁在按钮内部 */
}
.sh-sweep::after {
content: '';
position: absolute;
top: 0; left: -80%;
width: 50%; height: 100%;
background: linear-gradient(105deg, transparent, rgba(255,255,255,.55), transparent);
transform: skewX(-20deg); /* 斜切出"扫过"的角度 */
transition: left .55s ease;
}
.sh-sweep:hover::after { left: 130%; } /* 从左侧滑到右侧外 */
/* 双向扫过:before/after 分别从左右相向而行 */
.sh-dual::before { left: -60%; }
.sh-dual::after { right: -60%; }
.sh-dual:hover::before { left: 130%; }
.sh-dual:hover::after { right: 130%; }
/* 圆点光晕:圆形渐变当作"光球"滚过按钮 */
.sh-glow::after {
position: absolute;
top: 50%; left: -60px;
width: 60px; height: 60px; margin-top: -30px;
border-radius: 50%;
background: radial-gradient(circle, rgba(255,255,255,.75), transparent 70%);
transition: left .6s cubic-bezier(.22, .61, .36, 1);
}
.sh-glow:hover::after { left: calc(100% + 10px); }
参数说明
| 参数 | 默认值 | 说明 |
|---|---|---|
| 光带宽度 | 50% | ::after 的宽度,越宽光泽越明显 |
| 光带透明度 | .55 | rgba(255,255,255,.55),越大越亮 |
| 倾斜角度 | -20deg | skewX 的斜切角,决定光带倾斜姿态 |
| 扫过时长 | .55s | 悬停到扫完的过渡时间 |
| 终点位置 | left: 130% | 光带滑出按钮的隐藏位置,大于 100% 即可 |
兼容性与性能
- 纯 CSS 实现,现代浏览器全部支持;
radial-gradient需要 Chrome 31+ / Safari 6.1+,无兼容问题 - 动画只改
left属性,虽然left会触发布局,但按钮数量少、区域小,开销可忽略 - 追求极致性能可把光带改造成
transform: translateX()驱动,避免布局计算 - 大量按钮同屏时建议统一时长,避免光带节奏杂乱影响观感
常见问题
Q: 为什么我的光带直接盖住了文字? 给 .sh-btn 的文本包一层 <span style="position: relative; z-index: 1">,或把伪元素设成 pointer-events: none,再检查伪元素 z-index 是否高于文字。
Q: 扫光方向想从右上到左下? 把 skewX 改成正值 20deg,并把 left 的起始/终点方向对调(起点 left: 130%,hover 后 left: -80%)即可。
Q: 想要循环自动扫光,不需要 hover? 把 transition 换成 animation:animation: sweep 2.5s ease-in-out infinite; 并在 keyframes 里定义 left 从 -80% 到 130%。
Q: 透明背景的幽灵按钮能加扫光吗? 可以,把渐变光带透明度调低(如 .35),并将光带颜色从白色换成品牌色或互补色,效果同样出彩。
许可与来源
- 许可证:自研原创 —— 粤喵自研原创,可免费用于个人与商业项目,无需署名。查看来源公示与许可清单
- 来源:粤喵团队原创自研(从效果思路到代码实现均为独立完成,未直接复制第三方代码)
- 首次发布:2026-09-01 · 最近更新:2026-09-01
- 修改日志:2026-09-01 首次发布;2026-09-13 补充许可证与来源标注、复制按钮说明与法务页入口
- 纠错:联系页面 / min@cactus.asia,2 个工作日内核实处理
常见问题
这个组件可以商用吗?
可以。本组件为粤喵自研原创,可免费用于个人和商业项目,无需署名。
浏览器兼容性如何?
支持所有现代浏览器(Chrome / Firefox / Safari / Edge 最新版本)。旧版 IE 不支持 CSS 动画相关特性。
怎么修改动画参数?
直接调整 CSS 中的 animation-duration(时长)、animation-timing-function(缓动曲线)等属性即可,代码中有注释说明。