前端进阶之旅前端进阶之旅
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
首页程序员面试题库CSS animation-fill-mode backwards 与 both 区别
CSCSS动画与视觉

animation-fill-mode: backwards 与 both 在动画尚未开始时的样式表现有何差异?

在动画尚未开始的延迟期间,animation-fill-mode: backwards 与 both 表现完全相同,都会应用首个相关关键帧样式;差异发生在动画结束之后。

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

fill-mode 时间轴作用

  1. backwards在延迟期应用首个相关关键帧,结束后回退
  2. both延迟期同 backwards,结束后同 forwards
  3. 延迟期定义animation-delay 大于0时到动画开始前

backwards 和 both 在延迟期行为相同,动画播放期间无差别,区别仅在动画结束后的填充行为。

核心回答

先记住这个答案

在延迟期间,backwards 和 both 都会将首个相关关键帧的样式应用到元素上,因此视觉上没有区别。区别在于结束后:backwards 会让元素回到未应用动画时的样式,而 both 会保留最后一个相关关键帧的样式。所以,如果只关心动画开始前的延迟表现,两者等价;但如果关心动画结束后的状态,必须用 both。

  • 延迟期间两者均应用首帧样式,无差异
  • 动画结束后 backwards 回退,both 保留末帧
  • 注意 direction 会影响首帧和末帧的选取
  • 只关心延迟期表现可任选,关心结局选 both

延迟期间填充样式的计算方式

动画的填充模式决定样式在动画执行外的应用范围。当 animation-delay 为正数时,元素在延迟期间尚未开始动画,此时 backwards 会让浏览器查找动画的第一个关键帧并作为样式源。这个首个关键帧由 animation-direction 决定:normal 或 alternate 使用 0%/from,reverse 或 alternate-reverse 使用 100%/to。both 完全继承了 backwards 的这一行为,因此在延迟期间两者的计算值完全一致。

需要区分的是“尚未开始时”的含义。如果 animation-delay 为负数,动画会立即从时间轴中某个点开始,不存在延迟期,此时 backwards 不生效。如果 delay 为0,也没有延迟窗口。只有在 delay > 0 时的等待阶段,backwards 与 both 的样式覆盖才可见。一旦动画开始,动画自身的关键帧会覆盖填充样式,所以延迟期只是填充模式的一个短暂窗口。

加载遮罩:延迟期间需要首帧入场形态

假设有个消息提示框,初始为不透明正放,动画定义从透明上移开始。需求是页面加载后等0.5秒再播放,且等待期间提示框应处于动画首帧的透明上移状态,避免突兀出现。设置 animation-delay: 0.5s; animation-fill-mode: backwards; 即可让遮罩在延迟期间显示首帧,动画结束后(假设只播放一次)回退到默认的不透明状态,正好符合遮罩消失逻辑。如果改用 both,结束后会停留在透明上移的最后一帧,导致遮罩永久消失,不符合要求。

这里的决策依据是:只要求动画开始前的填充,不要求动画结束后保持。backwards 精确控制了延迟期和结束后两个阶段,避免了额外的手动清除样式。若错误使用 both,可能还需要在动画结束后用 JavaScript 重置,增加复杂度。因此理解两者在延迟期的等价性,才能根据结束状态需求选择。

容易失效的条件与替代处理

backwards 与 both 在延迟期表现相同的前提是 animation-delay 明显大于零,且没有其他样式覆盖。如果元素自身有更高优先级的内联样式或 !important 规则,填充样式可能被覆盖,视觉上就看不出差异。另外,当动画有多个关键祯但首祯未定义属性时,该属性会从元素计算值推导,此时填充可能不会产生可见变化。

当动画使用 animation-fill-mode: both 但延迟期间元素被 display: none 或其他布局属性影响,填充样式可能不会在渲染树中生效。处理方式是确保动画属性是独立的可渲染值(如 opacity、transform),并检查层叠上下文。若需要模拟延迟期首帧,也可直接给元素设置初始样式,但这样会存在闪烁风险,不如用 backwards 由动画统一管理。代价是 backwards 在结束后回退会造成突变,需根据是否保留末帧决定是否改用 both。

回答前,多想一步

容易答错的地方

认为两者在延迟期完全不同
一种常见误解是 backwards 在延迟期不应用样式,只有 both 才应用。实际根据规范,backwards 就是为延迟期设计的,它和 both 在延迟期都应用首帧,区别只在动画结束后的行为。
忽略了 direction 对首帧的影响
有人以为首帧永远是 from 或 0%,因此在 reverse 方向下设置 backwards 时会意外应用了 100% 的样式。需要根据 animation-direction 判断真正的第一相关关键帧,否则延迟期样式会错误。
试着用自己的话回答

面试官还会怎么问?

如果 animation-delay 为负值,backwards 和 both 会有何表现?

负延迟会使动画立即开始,从时间轴中某个点播放,此时没有“尚未开始”的延迟窗口,所以 backwards 不会产生额外首帧填充,元素直接进入动画当前帧。both 同样也不会应用首帧,因为动画已经在运行。

backwards 和 both 在动画结束后,对元素 z-index 或堆叠上下文的影响有何不同?

forwards 和 both 在动画结束后可能保留由动画属性创建的堆叠上下文,但 backwards 会回退,因此堆叠上下文也可能消失。具体取决于动画是否改变了 opacity 或 transform 等属性,backwards 不会保留这些效果。

在同一个元素上同时设置多个动画,且填充模式不同,延迟期如何应用?

每个动画的填充模式独立作用于各自的属性。延迟期间,具有 backwards 或 both 的动画会按顺序应用其首帧,若多个动画同时设置同一属性,优先级由 animation-* 的声明顺序和层叠决定,可能产生覆盖冲突。

从一道题,走向一组知识

把知识连起来

动画与视觉

交替动画中 animation-direction: alternate 与 reverse 分别如何改变关键帧的执行顺序?

同属「动画与视觉」专题,接着看 CSS animation-direction alternate 与 reverse 区别 在具体场景中的处理方式。

动画与视觉

如何让动画无限循环并且让元素在每次循环之间保持一定延迟?

同属「动画与视觉」专题,接着看 CSS animation 无限循环 每次循环加延迟 在具体场景中的处理方式。

参考资料

  • animation-fill-mode CSS property

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

本题目录
  1. 先记住这个答案
  2. 延迟期间填充样式的计算方式
  3. 加载遮罩:延迟期间需要首帧入场形态
  4. 容易失效的条件与替代处理
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

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

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