CSS动画暂停与继续应使用animation-play-state属性,其值为running或paused,可无缝暂停并恢复动画进度,支持hover和JS交互控制,但无法单独控制多动画中的某一个。
想让 CSS 动画循环播放,又能在需要时暂停,关键不是靠 animation-iteration-count 或重设 animation-duration,而是用 animation-play-state 动态控制播放状态。
这个属性只有两个有效值:running(运行)和 paused(暂停)。它作用于整个动画链(包括循环中的任意时刻),且不会重置动画进度——暂停后恢复,会从当前帧无缝继续。
running,所以初始启动无需额外设置style="animation-play-state: paused;" 就能立刻暂停elem.style.animationPlayState = 'paused' 或 'running'
常见需求比如「鼠标悬停暂停、移开继续」,或「点击切换暂停/播放」,纯 CSS 就能搞定:
ver 暂停:.box { animation: spin 3s linear infinite; } .box:hover { animation-play-state: paused; }
button.addEventListener('click', () => { box.style.animationPlayState = box.style.animationPlayState === 'paused' ? 'running' : 'paused'; });
如果元素同时应用了多个 animation(如 animation: fade 2s, move 4s),animation-play-state 会同时作用于所有动画。无法单独暂停某一个——这是它的限制,也是设计初衷:保持动画节奏一致。
transition 和 animation-play-state 做状态过渡,它本身不触发重绘或过渡效果现代浏览器(Chrome 43+、Firefox 16+、Safari 9+、Edge 12+)均支持,移动端也无明显问题。
will-change: animation-play-state 提示优化animation 或设为 none
animation-play-state 实时观察效果