前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
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 与负 animation-delay 区别
CSS动画与视觉

animation-play-state 暂停和负 animation-delay 跳过有什么区别?

animation-play-state: paused 冻结动画在当前帧,时间轴停走,改成 running 后从暂停的位置继续。负的 animation-delay 让动画跳过开头一段,直接从中间某个位置开始播放,跳过的部分不会再回去播。两个功能方向完全不同:一个是暂停遥控器,一个是快进到某个时间点。

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

暂停和快进的区别

  1. paused动画冻结在当前帧,时间轴不走,随时可以恢复
  2. 负 animation-delay跳过指定时长的开头,直接从中间的帧开始播放
  3. 两者叠加先跳到中间的位置,然后立刻冻结在那一帧

暂停不等于隐藏。paused 时元素仍然可见,保持着冻结帧的样式,只是不再动了。

核心回答

先记住这个答案

animation-play-state: paused 让动画停在当前帧,时间轴不再走,改成 running 后从暂停的位置继续播放。负的 animation-delay,比如 -2s,让动画跳过开头的 2 秒,直接从 2 秒处开始播放,跳过的部分不会再补回来。两者的功能方向不一样:paused 是暂停和恢复,负 delay 是快进到某个时间点。

  • paused 冻结当前帧,恢复后接着播
  • 负 delay 跳过开头,从中间开始
  • paused 可切换,负延迟只作用一次
  • 两者可以同时使用互不干扰

暂停和恢复:animation-play-state

animation-play-state 有两个值:running 和 paused。默认是 running,动画正常播放。设成 paused 后动画立刻冻结,元素保持冻结帧的样式不再变化。

hover 时暂停,移走后继续CSS
@keyframes spin {
  from { transform: rotate(0deg); }
  to   { transform: rotate(360deg); }
}

.icon {
  animation: spin 3s linear infinite;
}

.icon:hover {
  animation-play-state: paused;
}

鼠标移到图标上动画停住,移走后继续从停住的角度转。不是重头开始,而是接着转。这个特性在做交互式动画时非常有用,比如用户悬停时暂停轮播、离开后继续。 用 JavaScript 控制也一样:el.style.animationPlayState = 'paused' 暂停,el.style.animationPlayState = 'running' 恢复。

快进到中间帧:负 animation-delay

正的 animation-delay 让动画延迟开始。负值是反过来,让动画「假装已经播了一段」,直接从中间开始。比如一个 4 秒的动画设了 animation-delay: -2s,页面一加载元素就处于 2 秒那个位置的样式,然后从那里往后播。

错开多个元素的动画起点CSS
@keyframes wave {
  0%   { transform: translateY(0); }
  50%  { transform: translateY(-20px); }
  100% { transform: translateY(0); }
}

.dot { animation: wave 1.5s ease-in-out infinite; }
.dot:nth-child(1) { animation-delay: 0s; }
.dot:nth-child(2) { animation-delay: -0.3s; }
.dot:nth-child(3) { animation-delay: -0.6s; }

三个圆点用同一个动画,但通过负 delay 错开起始位置,页面打开时三个点就已经处于波浪的不同阶段,形成连续的波浪效果。如果用正的 delay,第二个和第三个圆点会先不动,等延迟结束后才开始跳,看起来不协调。

两者叠加使用的效果

animation-play-state 和 animation-delay 互不干扰,可以同时使用。比如设了 animation-delay: -2s 和 animation-play-state: paused,动画会跳到 2 秒的位置然后立刻冻结在那一帧。

这个组合技在实际项目里有个经典用法:用负 delay 指定初始位置,用 paused 冻结,然后用 CSS 自定义属性或 JavaScript 动态控制进度。比如一个进度条动画,总时长 1 秒,通过改变 animation-delay 的负值来控制进度条停在哪个位置。

通过 JavaScript 设置 el.style.animationDelay = '-0.6s',进度条就停在 60% 的位置。改成 -0.8s 就跳到 80%。整个过程不需要手动计算样式值,浏览器根据关键帧自动插值。

回答前,多想一步

容易答错的地方

以为负 delay 和 paused 效果类似
两者的方向完全不同。paused 是暂停当前帧不走了,负 delay 是跳过开头直接快进。暂停可以恢复,快进不能倒回去。记住一个是遥控器上的暂停键,一个是快进键。
以为暂停后再恢复动画会从头开始
恢复后动画从暂停的位置继续,不是从头开始。如果想让动画重头播放,需要先移除 animation 属性,触发一次重排(比如读一下 offsetHeight),再重新加上。
试着用自己的话回答

面试官还会怎么问?

暂停期间 animationend 会触发吗?

不会。暂停期间时间轴不走,动画不会到达终点,所以 animationend 不会触发。恢复后动画继续走完剩余部分,走完才触发。

负 delay 超过动画总时长会怎样?

如果动画 2 秒但 delay 是 -5s,超出的部分会按循环次数处理。单次动画会直接到达终点状态。无限循环动画会算出 5 秒对应哪一帧,从那里开始。

怎么用 CSS 做一个拖拽控制进度的效果?

可以把 animation-play-state 设成 paused,然后用 JavaScript 在拖拽事件里动态修改 animation-delay 的负值。用户拖到哪里就把 delay 设成对应的负时长,元素就停在那一帧。松手后把 play-state 改成 running,动画就从那个位置继续播放。

从一道题,走向一组知识

把知识连起来

动画与视觉

怎么用纯 CSS 让动画跟着滚动条走,而不是按时间播放?

滚动驱动动画本质上就是把 animation-play-state 交给滚动位置控制,理解暂停机制后更容易理解滚动动画。

动画与视觉

backdrop-filter 和 filter 有什么区别?毛玻璃效果怎么实现?

backdrop-filter 做毛玻璃效果时常配合动画,暂停和快进技巧可以让毛玻璃在特定滚动位置冻结。

参考资料

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

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

本题目录
  1. 先记住这个答案
  2. 暂停和恢复:animation-play-state
  3. 快进到中间帧:负 animation-delay
  4. 两者叠加使用的效果
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

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

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