`animation-delay` 仅作用于动画首次启动前,无法控制每次循环之间的间隔;要实现在每轮动画结束后暂停一段时间再开始下一轮,需通过延长动画周期并合理分配关键帧时间占比来模拟“停顿”效果。
在 CSS 中,animation-delay 的设计初衷是定义动画第一次播放前的等待时间,而非两次迭代之间的间隔。因此,即使你设置 animation-delay: 1s 并配合 animation-iteration-count: infinite,动画仍会无缝循环——第 2 次、第 3 次……迭代均不会插入额外延迟。
✅ 正确解法:将“停顿”作为动画周期的一部分
即:拉长 animation-duration,并在 @keyframes 中,用关键帧(如 90% → 100%)让元素保持静止状态,从而视觉上形成“播放 → 暂停 → 播放”的节奏。
以你的 .fa-shake 为例,原动画时长为 1s,无停顿。若希望每次抖动后暂停 0.5s,可将总时长设为 1.5s,并调整关键帧分布:
.fa-shake {
animation-name: fa-shake;
animation-duration: 1.5s; /* 总周期 = 动画时长 + 暂停时长 */
animation-timing-function: linear;
animation-iteration-count: infinite;
animation-fill-mode: forwards;
width: 150px;
height: auto;
}
@keyframes fa-shake {
/* 0% → 66.7%:完成完整抖动动画(原1s映射为1s/1.5s ≈ 66.7%) */
0%, 6.7%, 13.3%, 20%, 26.7%, 33.3%, 40%, 46.7%, 53.3%, 60%, 66.7% {
transform: rotate(0deg);
}
6.7%, 20%, 33.3%, 46.7%, 60% {
transform: rotate(10deg);
}
13.3%, 26.7%, 40%, 53.3% {
transform: rotate(-20deg);
}
/* 66.7% → 100%:静止暂停(0.5s 占比 = 0.5 / 1.5 ≈ 33.3%) */
66.7%, 100% {
transform: rotate(0deg); /* 保持起始态,视觉暂停 */
}
}? 关键技巧:
的关键帧区间; ⚠️ 注意事项:
通过将暂停“内化”为动画逻辑的一部分,你既能保持纯 CSS 实现的简洁性,又能精准控制每一次迭代间的呼吸感。