前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库CSS animation-play-state 暂停时修改关键帧
CSS动画与视觉

动画暂停期间修改了 @keyframes,恢复播放后表现会变吗?

会变。animation-play-state: paused 冻结的是时间进度,不是把当前像素截图锁住。修改同名 @keyframes 后,浏览器可在样式重新计算时按新关键帧更新当前位置,即使还没恢复播放;恢复后再从这个进度继续。

前端进阶之旅 · 一题精讲更新于 2026.09.29
CSS#动画与视觉#动画
先看核心答案读代码示例
理解线索

暂停和恢复的内部机制

  1. 时间快照paused 冻结动画时钟,记住已播放的百分比
  2. 关键帧绑定同名关键帧变化后按当前进度重新计算属性值
  3. 动画身份改成新名字会生成新动画;是否播放仍看播放状态

暂停只冻结时间;关键帧规则改变会触发样式更新,当前进度对应的属性值也可能变化。

核心回答

先记住这个答案

暂停期间修改同名 @keyframes,动画不会因此从头开始,暂停的时间进度也保持不变。但它并未锁定画面:样式更新后,浏览器可用新关键帧在当前进度重新计算属性值,元素可能在仍暂停时就跳到新位置。恢复播放只让时间继续前进,不是第一次读取新关键帧的时机。

  • 暂停记住的是进度,不是属性值
  • 修改同名关键帧不重启动画
  • 改 animation-name 会重新开始
  • 暂停时重算关键帧也可能跳帧

暂停冻结的是进度而非样式

一个常见误解是“暂停等于把当前样式固定住了”。实际上 animation-play-state: paused 冻结的是动画时间,画面由这个时间点和当前关键帧共同决定。更改关键帧规则会引起样式重新计算,因此同一个 50% 进度也可以映射到新的位置。恢复播放时,时间继续从暂停位置向前走。

暂停后修改关键帧再恢复CSS
@keyframes slide {
  from { transform: translateX(0); }
  to   { transform: translateX(300px); }
}

.box {
  animation: slide 3s linear forwards;
}

/* 通过 JS 添加这个类来暂停 */
.box.paused {
  animation-play-state: paused;
}

/* 暂停后用 CSSOM 把 300px 改成 100px,
   样式重算时 50% 进度可从 150px 跳到 50px */

假设动画播到 50% 时暂停,旧关键帧对应 translateX(150px)。此时用 CSSOM 把终点从 300px 改为 100px,新关键帧在同样进度对应 translateX(50px)。样式重新计算后就可能看到跳变,无须等恢复;恢复后它从 50% 时间进度继续向 100px 运动。可在暂停状态读 getComputedStyle 验证当前位置。 修改关键帧的方式通常是用 document.styleSheets API 找到对应的 CSSKeyframesRule,再操作它的 cssRules。也可以删掉旧的 <style> 标签再插入新的,效果一样。

改 animation-name 和改 @keyframes 内容的区别

如果把 animation-name 换成另一个名字,旧动画会被移除,新动画通常从自己的起点开始。animation-play-state: paused 若仍写在元素上,新动画也会保持暂停,而不是自动开始播放。修改同名关键帧规则则不应被当作重启动画的方法。

这个区别在进度条与过场动画中很实用。进度条希望保留当前时间进度,应维持动画身份,只调整同名关键帧或改用 Web Animations API 精确设置进度。过场动画想从头展示,可明确移除后重新添加动画,并同时检查 animation-play-state 的值,别只靠替换关键帧文本猜结果。

回答前,多想一步

容易答错的地方

以为暂停会锁住当前画面
暂停冻结时间进度,不冻结关键帧计算结果。同名关键帧变化并触发样式重算后,当前进度对应的属性值可能变化。若看不到变化,先确认修改的是正在使用的关键帧规则,或检查新旧关键帧在当前进度是否恰好给出相同值。
以为改了 animation-name 动画会接着播
换名字通常创建新动画,旧进度不沿用;但元素若仍设置 animation-play-state: paused,新动画也会暂停。想从头播放,还要把播放状态切回 running。
试着用自己的话回答

面试官还会怎么问?

暂停和 animation-delay 设成负值有什么关系?

没有直接关系。animation-delay 为负值会让动画跳过开头一段,但动画一旦开始播放,暂停和恢复跟 delay 就无关了。暂停冻结的是已经经过的时间,delay 只影响动画什么时候开始。

怎么在暂停时获取动画当前的进度?

可以用 getComputedStyle 读取当前动画的属性值,或者用 Web Animations API 的 element.getAnimations() 拿到 Animation 对象,通过它的 currentTime 属性获得精确的毫秒级进度。

prefers-reduced-motion 媒体查询下应该怎么处理暂停?

如果用户开启了减少动画的系统设置,通常应该用 animation: none 彻底移除动画,而不是暂停在某一帧。暂停留下的画面可能是一个不合适的中间状态,直接去掉动画让元素回到没有动画时的默认样式更安全。

从一道题,走向一组知识

把知识连起来

动画与视觉

animationstart、animationend、animationiteration 这三个事件分别在什么时候触发?

暂停和恢复不会触发 animationstart 或 animationend,了解事件触发时机能避免在暂停逻辑里写错回调。

动画与视觉

@keyframes 里 from 和 to 跟百分比选择器是什么关系?

修改关键帧时需要理解百分比选择器和 from 到 to 的映射,才能判断恢复后元素会跳到哪个状态。

参考资料

  • CSS:动画与视觉参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 暂停冻结的是进度而非样式
  3. 改 animation-name 和改 @keyframes 内容的区别
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑