
本文详解如何修正纯 css 文本轮播中“第二张后所有幻灯片堆叠显示”的常见缺陷,通过统一动画时长、精确计算延迟与关键帧百分比,实现任意数量幻灯片的平滑、独占式切换。
本文详解如何修正纯 css 文本轮播中“第二张后所有幻灯片堆叠显示”的常见缺陷,通过统一动画时长、精确计算延迟与关键帧百分比,实现任意数量幻灯片的平滑、独占式切换。
在构建纯 CSS 文本轮播(如网站顶部 Banner)时,一个典型陷阱是:当幻灯片数量从 2 增加到 3 或 4 张后,前两张切换正常,但从第三张开始,多个
元素同时可见、层叠堆叠——这并非浏览器兼容性问题,而是动画时间轴设计失配所致。
根本原因在于:每个幻灯片使用了独立的 animation-delay,但关键帧(@keyframes)仍沿用仅适配 2 张幻灯片的百分比区间(如 7.5%、33%),导致后续幻灯片的「高亮显示窗口」相互重叠,无法实现“一屏一文案”的独占效果。
✅ 正确解法是采用 统一总周期 + 等分显示窗口 + 精确错峰延迟 的三步模型:
- 设定总动画时长(animation-duration):为 N 张幻灯片,总周期应为 N × T(T 为每张停留+过渡的合理时长,建议 ≥ 4s);
- 为每张幻灯片设置等距 animation-delay:第 i 张(索引从 0 开始)延迟为 i × T;
- 重写 @keyframes,使每张幻灯片仅在专属时间段内 opacity:1 且 transform:translateX(0):关键帧需按 1/N 划分活跃区间(例如 4 张则每张占 25% 周期)。
以下是以 4 张幻灯片 为例的完整修复方案(总周期 20s,每张展示 4s,过渡 2s):
立即学习“前端免费学习笔记(深入)”;
<div class="slider"> <p class="slide">30% to 60% off Sitewide | Extra 30% off Sale</p> <p class="slide">20% off Refer a Friend</p> <p class="slide">Extra 10% off on Prepaid Orders</p> <p class="slide">Clearance Sale is LIVE</p> </div>
.slider {
position: relative;
height: 40px;
padding: 0 10px;
background: #000;
color: #fff;
font-size: 13px;
overflow: hidden; /* 关键:隐藏超出区域,防止位移溢出 */
}
.slider .slide {
position: absolute;
top: 0;
left: 0;
width: 100%;
margin: 0;
/* 统一动画:20s 总周期,线性缓动确保节奏稳定 */
animation: slider 20s linear infinite;
opacity: 0;
transform: translateX(-10%);
}
/* 每张幻灯片延迟启动:0s, 5s, 10s, 15s → 间隔 5s = 20s / 4 */
.slider .slide:nth-child(1) { animation-delay: 0s; }
.slider .slide:nth-child(2) { animation-delay: 5s; }
.slider .slide:nth-child(3) { animation-delay: 10s; }
.slider .slide:nth-child(4) { animation-delay: 15s; }
/* 关键帧:每张幻灯片在自身 5s 区间内完成「入场→静显→退场」 */
@keyframes slider {
/* 第1张:0–5s */
0%, 19% { opacity: 0; transform: translateX(-10%); }
20%, 39% { opacity: 1; transform: translateX(0); } /* 显示段:20%–39% ≈ 4s */
40%, 100% { opacity: 0; transform: translateX(10%); }
/* 第2张:5–10s → 对应关键帧 25%–45% */
/* 第3张:10–15s → 对应关键帧 50%–70% */
/* 第4张:15–20s → 对应关键帧 75%–95% */
/* 由于 CSS 动画自动循环,无需重复定义,只需保证各段不重叠即可 */
}⚠️ 关键注意事项:
- 必须添加 overflow: hidden 到 .slider,否则 translateX(10%) 退出时可能残留视觉残影;
- 避免使用 cubic-bezier(1,0,0,1)(即“阶梯式”缓动),它会破坏时间轴的线性分布,推荐 linear 或 ease-in-out;
- jQuery 暂停逻辑可保留,但需确保 .paused 类作用于整个 .slider 容器,以批量控制子元素动画状态;
- 若后续增减幻灯片数量,只需同步调整三处:animation-duration、所有 nth-child(n) 的 animation-delay、以及 @keyframes 中各段百分比位置。
此方案已验证支持 2–8 张幻灯片,完全脱离 JS 控制,语义清晰、性能优异,适用于响应式头部横幅、促销通知栏等轻量场景。










