animation-play-state 可直接暂停或恢复 css 动画,保持当前帧和迭代数;需显式声明初始状态,避免兼容性问题,不适用于 transition,多动画统一控制,注意与 fill-mode、delay 的交互及 ios safari 兼容性。

用 animation-play-state 控制动画暂停/恢复
直接改元素的 animation-play-state 属性就能暂停或继续 CSS 动画,不需要 JS 重写关键帧或操作 @keyframes。它只影响播放状态,不重置动画进度、时间偏移或迭代次数。
常见错误是以为设成 paused 后再设回 running 会从头开始——其实不会,它严格保持当前帧位置和已运行的迭代数。
-
animation-play-state: running:正常播放(默认值) -
animation-play-state: paused:暂停,画面冻结在当前帧 - 该属性可继承,但通常建议直接作用于动画元素本身
- 支持 transition(比如配合 opacity 做淡入暂停提示),但动画本身不会因此产生过渡效果
JS 中切换 animation-play-state 的安全写法
用 JS 操作时,别直接覆盖整个 style 对象,否则可能清掉其他内联样式;也别依赖 class 切换却忘了初始状态是否已声明 animation-play-state。
推荐方式是通过 class 控制,并确保 CSS 中已定义基础状态:
.animated {
animation: slide 3s infinite;
animation-play-state: running; /* 显式声明,避免浏览器默认行为差异 */
}
.animated.paused {
animation-play-state: paused;
}
JS 触发只需:
el.classList.add('paused'); // 暂停
el.classList.remove('paused'); // 恢复
- 不要用
el.style.animationPlayState = 'paused'—— 首字母大写在部分旧版 Safari 下不生效 - 如果动画是通过
@keyframes+animation-name定义的,animation-play-state才有效;用transition实现的“动效”不响应这个属性 - 多个动画同时存在时,该属性统一控制全部,无法单独暂停某一个
与 animation-delay 和 animation-fill-mode 的配合陷阱
暂停状态下,animation-delay 不会重新计时,animation-fill-mode 仍按原逻辑生效(比如 forwards 会让元素停留在最后一帧,哪怕你中途暂停了)。
容易踩坑的组合:
- 设了
animation-fill-mode: forwards又在动画中途暂停 → 元素视觉上卡在“最后一帧”,但实际是停在中间某帧,和forwards冲突,表现不可预测 - 用
animation-delay: 2s+animation-play-state: paused初始化 → 动画不会等 2 秒再暂停,而是立即暂停,延迟被挂起,直到恢复后才继续倒计时 - 恢复播放时,若之前有未完成的 delay,会接着走完剩余延迟时间,不是跳过
移动端 Safari 的兼容性注意点
iOS 15.4 之前,Safari 对 animation-play-state 的硬件加速支持不稳定:暂停后恢复可能丢帧、卡顿,甚至动画直接停止不动。
缓解方式有限但实用:
- 确保动画属性尽量精简,只触发
transform和opacity(避免 layout 或 paint 触发) - 暂停前加一次
transform: translateZ(0)强制 GPU 层,有时能稳住状态切换 - 不要在
scroll事件里高频切换该属性,iOS WebKit 容易掉帧 - 真机测试必须覆盖 iOS 14–16,模拟器不一定复现
复杂交互动画中,暂停/恢复只是表层控制,真正难的是状态同步——比如用户暂停时刚好在第 2.7 次迭代的 63% 进度,后续所有 JS 逻辑(如进度条、回调触发)都得基于这个精确位置计算,而不是只看“暂停”这个布尔值。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











