box-shadow动画无反应主因是iteration-count默认为1且timing-function过缓;需设infinite循环、steps(1)/linear函数,并联动offset/blur/color变化;流光方向效果应改用background-gradient+mask实现。
直接套用 @keyframes 改 box-shadow 却没闪烁,大概率是动画没真正跑起来。CSS 动画默认只执行一次(animation-iteration-count: 1),且默认缓动函数 easing 会让颜色过渡“太顺”,看不出闪烁感。
实操建议:
animation-iteration-count: infinite,否则闪一下就停animation-timing-function: steps(1) 或 linear 配合高对比色阶,避免渐变模糊导致“不亮”box-shadow 的颜色——要连同 offset、blur 一起动,比如从 0 0 0 #fff 跳到 0 0 15px #ff0080,才有冲击力用 box-shadow: inset 做流光,光会“陷在按钮里”,看起来像内发光,不是边框流动感。真要模拟光扫过边缘,得靠多层 outset shadow 叠加位移 + 模糊变化。
常见错误:只写一层 box-shadow 动画,结果光带僵硬、无方向性。
立即学习“前端免费学习笔记(深入)”;
实操建议:
0 0 20px)做光晕,内层小偏移(如 0 0 5px 2px)做“光边”@keyframes 中让两层的 color 和 blur-radius 同步跳变,例如从透明→高亮→透明@keyframes glow { 0% { box-shadow: 0 0 5px 2px rgba(255,0,128,0.2), 0 0 20px rgba(255,0,128,0); } 50% { box-shadow: 0 0 5px 2px #ff0080, 0 0 20px #ff0080; } 100% { box-shadow: 0 0 5px 2px rgba(255,0,128,0.2), 0 0 20px rgba(255,0,128,0); }}
iOS Safari 对纯 box-shadow 动画优化激进,有时直接跳过渲染,尤其在低功耗模式下。这不是 bug,是浏览器主动“省电跳帧”。
实操建议:
will-change: box-shadow,提前告知浏览器这个属性会变transform: translateZ(0),强制开启硬件加速:hover 里才定义动画——先在默认状态声明 animation: glow 3s infinite linear,再通过 animation-play-state 控制启停纯 box-shadow 只能整体明暗变化,做不到定向流动。真要实现“光带横扫”,box-shadow 不是最佳工具——它没有方向维度。
替代方案更可靠:
background: linear-gradient 做一条水平光带,宽度设为 2px
mask 或 clip-path 把光带“裁”成按钮轮廓,再用 animation 平移 background-position
mask 在 Safari 需加 -webkit-mask 前缀;clip-path 圆角按钮用 inset(0 round 8px) 更安全box-shadow 流光适合快速原型或轻量提示,但一旦需要精确节奏、方向或兼容老 iOS,就得切到 gradient + mask 方案——这点容易被忽略,等上线才发现光不动了。