用 background-size 配合 @keyframes 实现渐变背景灵动闪烁,核心是通过大尺寸渐变与 background-position 位移模拟光斑滑动,而非明暗变化;需配合缓动曲线、合理位移区间(如-50%至150%)及多层叠加提升真实感。
用 background-size 配合 @keyframes 实现渐变背景的灵动闪烁效果,核心在于让高光区域在渐变色带上“滑动”,制造出光线掠过表面的动态感,而不是简单地明暗闪烁。关键不是改变颜色,而是控制渐变的可见范围和位移节奏。
先定义一个比容器宽得多的线性渐变(比如 300% 宽),再用 background-size 控制它实际“露出来”的部分。这样只需平移 background-position,就能让亮区像光斑一样扫过。
示例代码:
.element {
background: linear-gradient(90deg, #2563eb, #3b82f6, #60a5fa, #93c5fd, #bfdbfe);
background-size: 300% 100%;
background-position: 0% 50%;
animation: shine-sweep 4s ease-in-out
infinite;
}
@keyframes shine-sweep {
0% { background-position: 0% 50%; }
50% { background-position: 100% 50%; }
100% { background-position: 0% 50%; }
}
纯线性位移显得机械。改用 ease-in-out 或自定义贝塞尔曲线,让亮面“加速进入、减速离开”。同时把位移起点设为 -50%,终点设为 150%,确保滑入滑出过程完整,避免突兀截断。
background-position: -50% 50% —— 亮面从左侧外进入background-position: 150% 50% —— 亮面完全滑出右侧cubic-bezier(0.34, 1.56, 0.64, 1)(轻微弹性感)单层渐变更像灯带扫射。可叠加一层半透明白色径向渐变作为“高光层”,或用 mask-image 配合动画控制亮区形状(如椭圆移动)。
简易双层方案:
.element {
background:
radial-gradient(circle at 30% 50%, rgba(255,255,255,0.4) 0%, transparent 70%),
linear-gradient(90deg, #1e40af, #3b82f6, #60a5fa);
background-size: 200% 100%, 300% 100%;
background-position: 0% 50%, -50% 50%;
animation:
shine-glow 6s ease-in-out infinite,
shine-sweep 4s ease-in-out infinite;
}
background-position,它支持硬件加速;避免动画 background-size
vw 或 100vmax 替代固定百分比,让滑动速度在不同屏上更一致基本上就这些。重点是“用大渐变+小视口+位移”模拟光学滑动,而非靠 opacity 闪。不复杂但容易忽略的是位移区间和缓动曲线的选择——它直接决定灵动与否。