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

animation-direction 的 alternate 和 reverse 有什么区别?

reverse 每轮都从 to 走到 from,方向始终是反的。alternate 第一轮正着播,第二轮倒着播,来回交替。如果 animation-iteration-count 只有 1,alternate 和 normal 效果完全一样,看不出交替。

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

四种方向值的播放顺序

  1. normal每轮从 from 到 to,永远正向播放
  2. reverse每轮从 to 到 from,永远反向,缓动曲线也跟着翻转
  3. alternate奇数轮正向,偶数轮反向,需要至少两轮才看得出

还有第四种值 alternate-reverse:奇数轮反向、偶数轮正向,相当于 alternate 把起点翻了一下。

核心回答

先记住这个答案

reverse 让动画每一轮都倒着播,从 to(或 100%)走到 from(或 0%),方向始终是反的。alternate 是奇数轮正向、偶数轮反向,来回交替。两者最大的区别在于 reverse 是恒定的反方向,而 alternate 的方向取决于当前是第几轮。另外 reverse 会把缓动曲线也翻转,ease-in 视觉上变成减速效果。

  • reverse 每轮都倒着播
  • alternate 奇偶轮交替方向
  • reverse 同时反转缓动曲线
  • 只循环一次时 alternate 等同 normal

四种值的播放顺序对比

animation-direction 一共有四个取值。用同一个关键帧搭配不同值,就能直观看到区别。

同一个关键帧搭配不同 animation-directionCSS
@keyframes fade {
  from { opacity: 1; }
  to   { opacity: 0; }
}

/* 每轮 1 → 0,正向播放 */
.a { animation: fade 1s normal forwards; }

/* 每轮 0 → 1,反向播放,看起来像淡入 */
.b { animation: fade 1s reverse forwards; }

/* 第一轮 1→0,第二轮 0→1,循环交替 */
.c { animation: fade 1s alternate 2 forwards; }

/* 第一轮 0→1,第二轮 1→0,反向开始交替 */
.d { animation: fade 1s alternate-reverse 2 forwards; }

.a 正常淡出,.b 反着来变成淡入。.c 先淡出再淡入,两轮之后停在透明。.d 先淡入再淡出,两轮之后停在不透明。注意 .c 和 .d 都设了 animation-iteration-count: 2,只有一轮的话 alternate 和 normal 没区别。 alternate-reverse 可以理解成"先走一遍 reverse,再走一遍 normal",不需要单独记——就是 alternate 的镜像版本。

reverse 对缓动曲线的影响

reverse 不只是翻转关键帧的起终点,缓动曲线也一起翻转了。比如原本写了 animation-timing-function: ease-in,正向播放时动画开头慢、结尾快。加了 reverse 之后,视觉上变成开头快、结尾慢——和 ease-out 的效果一样。

这个行为在做弹跳或回弹动画时很有用。你可以只写一组 ease-in 关键帧,然后用 alternate 让返回时自动变成 ease-out 的效果,不用再写两套缓动。

alternate 在偶数轮反向播放时也有同样的缓动翻转。所以一个 alternate 动画的正向轮是 ease-in,反向轮自动变成 ease-out,视觉上非常自然。

回答前,多想一步

容易答错的地方

以为 alternate 只设一轮就能看到交替效果
alternate 的第一轮和 normal 完全一样,要到第二轮才反向。如果 animation-iteration-count 是默认的 1,alternate 就等于 normal。至少要设成 2 或者 infinite 才有交替的视觉效果。
以为 reverse 只翻转方向,缓动不变
方向和缓动是一起翻转的。原本的 ease-in 加了 reverse 后视觉上变成 ease-out。如果忽略这一点,动画的加速减速节奏会和预期不同。
试着用自己的话回答

面试官还会怎么问?

animation-fill-mode: backwards 搭配 reverse 时,动画开始前显示哪一帧?

backwards 让元素在动画开始前就应用第一帧的样式。正向播放时第一帧是 from,但 reverse 下第一帧变成了 to。所以 reverse 加 backwards 时,动画开始前元素会显示 to 的样式。

alternate 和手动写两段关键帧有什么区别?

alternate 自动翻转缓动曲线,视觉上更平滑。手动写两段关键帧可以让去和回走不同的路径或不同的缓动,灵活度更高但代码量也多。简单的来回效果用 alternate,复杂的非对称路径用手写。

animation-direction 会影响 animationiteration 事件吗?

不会。不管方向怎么设,每完成一轮浏览器都会触发一次 animationiteration 事件。reverse 下每轮走完也触发,alternate 下正向轮和反向轮结束时也各触发一次。事件只关心轮次,不关心方向。

从一道题,走向一组知识

把知识连起来

动画与视觉

怎么让无限循环的动画在每两轮之间有一段停顿?

alternate 的交替效果必须配合至少 2 次以上的 iteration-count 才能看出来,两个属性要一起理解。

动画与视觉

animation-fill-mode 设成 backwards 和 both 有什么区别?

reverse 改变了第一帧的位置,fill-mode: backwards 在动画开始前应用的样式也会跟着变。

参考资料

  • animation-direction CSS property

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

本题目录
  1. 先记住这个答案
  2. 四种值的播放顺序对比
  3. reverse 对缓动曲线的影响
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

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

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