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

transition 和 animation 怎么选?

transition 只能做从 A 到 B 的变化,必须有一个触发条件(比如 hover、加类名)。animation 配合 @keyframes 可以定义多个中间帧、自动播放、循环往复。简单的交互反馈用 transition,复杂的独立动画用 animation。

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

两种动画的核心区别

  1. 触发方式transition 靠状态变化触发,animation 可以页面加载后自动开始
  2. 关键帧数量transition 只有起止两帧,animation 可以在 @keyframes 里写任意多帧
  3. 播放控制animation 支持循环、反向、暂停,transition 不支持

transition 也可以通过 JS 添加类名来「主动触发」,但它本质上还是在两个状态之间插值。需要「先大后小再弹回来」这种三段式效果,就只能用 @keyframes。

核心回答

先记住这个答案

transition 是「属性值变了就过渡一下」,只做 A 到 B 的平滑切换,必须有触发条件。animation 是「按剧本演」,用 @keyframes 定义多个节点,可以自动播放、无限循环、正反交替。判断标准很简单:只有两个状态并且需要用户触发,用 transition;其它情况用 animation。

  • 过渡需触发,动画可自播
  • transition 只有起止两态
  • animation 支持多帧、循环、暂停
  • 按钮 hover 效果用 transition 最合适

按钮 hover 效果:transition 的典型场景

鼠标移入时按钮放大并变色,移开时恢复。这就是最经典的两态切换,用 transition 三行就能搞定。

hover 放大按钮CSS
.btn {
  background: #1677ff;
  transform: scale(1);
  transition: transform 0.2s ease, background 0.2s ease;
}

.btn:hover {
  background: #4096ff;
  transform: scale(1.05);
}

不需要写 @keyframes,不需要指定播放次数,hover 进去自动正向过渡,hover 出来自动反向过渡。代码量少,意图清晰。

加载动画:animation 的典型场景

一个旋转的 loading 图标,页面打开就要转,一直转到数据加载完。这种不需要用户触发、无限循环的动画,只能用 animation。

旋转 loading 图标CSS
@keyframes spin {
  from { transform: rotate(0deg); }
  to { transform: rotate(360deg); }
}

.loading {
  animation: spin 1s linear infinite;
}

transition 做不了这件事,因为没有「从什么值变到什么值」的触发点。animation 的 infinite 关键字让它永远循环,linear 保证匀速旋转不会一顿一顿的。

判断选哪个的三个问题

遇到一个动画需求,问自己三个问题。第一:有没有明确的触发条件?没有就用 animation。第二:是不是只有起止两个状态?不是就用 animation。第三:需不需要循环或暂停?需要就用 animation。三个问题都指向 transition 的话,用 transition 更简单。

比如一个通知横幅从顶部滑入、停留 3 秒、再滑出。这里有三个阶段(滑入、停留、滑出),transition 做不了「中间停一下」这种效果,要用 @keyframes 把百分比拆开。

还有一种情况:需要动画一进页面就播放一次(不循环)。比如页面加载时内容从下方淡入。这时候虽然只有两态,但没有触发条件,也要用 animation,设 animation-fill-mode: forwards 让它停在最后一帧。

回答前,多想一步

容易答错的地方

以为 transition 不能用 JavaScript 触发
transition 的触发条件不局限于 CSS 伪类。JavaScript 修改 classList 或直接改 style,导致计算值变化,一样会触发过渡。所以「JS 控制的动画就该用 animation」这个说法不对。
以为 animation 性能更差
两者的渲染管线一样,性能差异取决于你动了什么属性,不取决于用的是 transition 还是 animation。transform 和 opacity 走 GPU 合成层,不管用哪种写法都很快。改 width 和 height 触发回流,不管用哪种写法都慢。
试着用自己的话回答

面试官还会怎么问?

两者可以同时用在一个元素上吗?

可以。比如一个图标平时用 animation 做呼吸灯效果(无限循环发光),hover 时用 transition 放大。两者互不干扰,各自控制不同的属性就行。如果控制了同一个属性,animation 的优先级更高。

Web Animations API 是什么定位?

它是 JavaScript 版本的 animation,提供了 CSS animation 做不到的精确控制,比如动态修改时长、跳到某一帧、串联多段动画。适合交互驱动的复杂动画,比如手势跟随、滚动联动。

transition 能做弹性效果吗?

能。用 cubic-bezier() 把 y 值设成大于 1 的数,动画末尾会冲过目标值再弹回来。但只能弹一下。如果要多次弹跳,就需要 @keyframes 手动写多个关键帧了。

从一道题,走向一组知识

把知识连起来

Flex 布局

flex 容器里放一个绝对定位的子元素,布局会怎样?

绝对定位改变元素布局位置;若这个位置变化需要过渡,仍须区分 transition 与关键帧动画。

Flex 布局

单行 flex 容器里 align-content 为什么不生效?

单行 Flex 的交叉轴对齐是静态布局规则,若要在状态切换时动起来,才需要选择过渡或动画。

参考资料

  • Using CSS transitions

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

本题目录
  1. 先记住这个答案
  2. 按钮 hover 效果:transition 的典型场景
  3. 加载动画:animation 的典型场景
  4. 判断选哪个的三个问题
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

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

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