【CSS】CSS 动画:transition、animation、transform、CSS3 新特性(附《思维导图》)

简介: 本文系统梳理CSS动画核心知识:涵盖transition过渡、animation关键帧、transform变形三大技术,深入解析渲染原理、性能优化(GPU加速/`will-change`)、CSS3新特性(滚动驱动动画、视图过渡等),并提供选型指南与实战避坑方案。

思维导图

CSS动画系统性知识体系:transition、animation、transform与CSS3新特性

一、CSS动画基础体系

1.1 核心概念与分类

CSS动画是通过CSS属性随时间的变化实现的视觉动效,无需JavaScript即可实现流畅的交互动画。主要分为三大类:

  • 过渡动画(transition):属性值从初始状态到目标状态的平滑过渡
  • 关键帧动画(animation):通过多关键帧定义复杂的时间序列动画
  • 变形动画(transform):对元素进行几何变换,常配合前两者使用

1.2 浏览器渲染与动画原理

浏览器渲染流水线:构建DOM → 构建CSSOM → 生成Render Tree → 布局(Layout) → 绘制(Paint) → 合成(Composite)

动画性能层级(从优到劣):

  1. 合成层属性:transform、opacity(GPU加速,性能最优)
  2. 绘制属性:color、background、box-shadow(触发重绘)
  3. 布局属性:width、height、margin、top(触发重排,性能最差)

二、transform 变形系统

2.1 2D 变换

transform 是 CSS 变形的核心属性,可同时应用多个变换函数,执行顺序从右到左。

变换函数 作用 取值示例
translate(x, y) 位移 translate(100px, 50px)
translateX(n) / translateY(n) 单轴位移 translateX(50%)
scale(x, y) 缩放 scale(1.5, 0.8)
scaleX(n) / scaleY(n) 单轴缩放 scaleX(2)
rotate(deg) 旋转 rotate(45deg)
skew(x-deg, y-deg) 倾斜 skew(10deg, 5deg)
matrix(a,b,c,d,e,f) 矩阵变换 6参数2D矩阵

注意:百分比位移是相对于自身宽高计算,常用于水平垂直居中。

2.2 3D 变换

开启3D空间需要父元素设置 perspective(透视距离)。

变换函数 作用
translateZ(z) Z轴位移(近大远小)
translate3d(x, y, z) 3D位移
rotateX(deg) / rotateY(deg) 绕X/Y轴旋转
rotate3d(x, y, z, deg) 绕自定义轴旋转
scaleZ(z) / scale3d(x, y, z) 3D缩放
matrix3d() 4×4 3D矩阵

2.3 配套属性

  • transform-origin:变换原点,默认 center center,支持关键词、长度、百分比
  • transform-style:子元素是否保留3D空间,flat(默认) / preserve-3d
  • perspective:透视距离,值越小透视效果越强,应用在父容器
  • perspective-origin:透视视点位置
  • backface-visibility:背面是否可见,visible / hidden

三、transition 过渡动画

3.1 核心属性体系

transition 是简写属性,定义属性变化时的平滑过渡效果。

transition: [property] [duration] [timing-function] [delay];
属性 说明 取值
transition-property 参与过渡的属性 all / 具体属性名 / none
transition-duration 过渡持续时间 单位 s 或 ms,默认 0
transition-timing-function 缓动函数 见下方缓动表
transition-delay 延迟执行时间 单位 s 或 ms,允许负值

3.2 缓动函数(Timing Function)

控制动画过程中的速度变化曲线。

类型 关键字 曲线特征
基础 linear 匀速
基础 ease 慢-快-慢(默认)
基础 ease-in 慢入快出
基础 ease-out 快入慢出
基础 ease-in-out 慢入慢出
贝塞尔 cubic-bezier(n,n,n,n) 自定义三次贝塞尔曲线
阶梯 steps(n, start/end) 分步跳变动画

steps 函数:第一个参数为步数;start 表示第一步立即执行,end 表示第一步延迟执行。

3.3 过渡触发条件

transition 本身不会自动播放,必须通过状态变化触发:

  • 伪类触发::hover、:active、:focus、:checked
  • 类名切换:JS 添加/移除 class
  • 属性变化:JS 直接修改 CSS 属性值
  • 媒体查询:视口尺寸变化触发

3.4 局限性

  • 只能定义起始和结束两个状态
  • 无法中途暂停、反向或循环
  • 没有进度回调,无法精确控制动画过程
  • 延迟只能在开始前,不能分段延迟

四、animation 关键帧动画

4.1 @keyframes 规则

定义动画的关键帧序列,是 animation 的灵魂。

@keyframes 动画名 {
   
  0%   {
    /* 起始样式 */ }
  50%  {
    /* 中间样式 */ }
  100% {
    /* 结束样式 */ }
}

/* 等价关键字 */
/* from = 0%,to = 100% */

关键帧特性:

  • 百分比顺序任意,浏览器自动按时间排序
  • 可合并相同样式的关键帧:0%, 100% { opacity: 0 }
  • 缺省 0% 或 100% 时,使用元素当前样式补全
  • 关键帧中 !important 无效

4.2 动画属性体系

animation 是 8 个子属性的简写。

属性 说明 常用值
animation-name 引用的关键帧名称 @keyframes 定义的名字
animation-duration 单次动画时长 s / ms
animation-timing-function 缓动函数 同 transition
animation-delay 开始前延迟 s / ms,负值表示从中间开始
animation-iteration-count 播放次数 数字 / infinite 无限循环
animation-direction 播放方向 normal / reverse / alternate / alternate-reverse
animation-fill-mode 填充模式 none / forwards / backwards / both
animation-play-state 播放状态 running / paused

4.3 核心特性详解

animation-fill-mode 填充模式

  • none:默认,动画前后不保留样式
  • forwards:动画结束后停留在最后一帧
  • backwards:动画延迟期间应用第一帧样式
  • both:同时应用 forwards 和 backwards

animation-direction 播放方向

  • normal:正向播放(0% → 100%)
  • reverse:反向播放(100% → 0%)
  • alternate:奇数次正向,偶数次反向
  • alternate-reverse:奇数次反向,偶数次正向

4.4 多动画与控制

  • 多动画叠加:逗号分隔多个动画 animation: a 2s, b 3s
  • 暂停控制:通过 animation-play-state: paused 实现悬停暂停
  • 动态结束:JS 监听 animationend 事件做收尾处理
  • 事件体系:animationstart、animationend、animationiteration

五、CSS3 动画相关新特性

5.1 will-change 性能优化

提前告知浏览器元素即将发生的变化,浏览器预先分配资源。

will-change: transform, opacity;
  • 只能作为最后手段使用,不可滥用
  • 用完及时移除,否则持续占用GPU内存
  • 建议通过 JS 动态添加,动画结束后移除

5.2 滤镜动画 filter

对元素应用图形特效,支持过渡和动画。

常用滤镜函数:

  • blur(px):高斯模糊
  • brightness(%):亮度
  • contrast(%):对比度
  • saturate(%):饱和度
  • hue-rotate(deg):色相旋转
  • invert(%):反色
  • opacity(%):透明度
  • grayscale(%):灰度
  • sepia(%):褐色
  • drop-shadow():投影

优势:filter 动画在合成层执行,性能远高于 box-shadow 等属性。

5.3 混合模式 mix-blend-mode

定义元素与背景的混合方式,共 16 种模式:

  • 基础:normal、multiply、screen、overlay
  • 变暗:darken、color-burn、hard-light
  • 变亮:lighten、color-dodge、soft-light
  • 其他:difference、exclusion、hue、saturation、color、luminosity

5.4 CSS 变量驱动动画

通过 CSS 自定义属性(变量)实现更灵活的动画控制。

:root {
   
  --move-distance: 100px;
}

.box {
   
  transform: translateX(var(--move-distance));
  transition: transform 0.3s;
}

/* JS 动态修改变量驱动动画 */
/* element.style.setProperty('--move-distance', '200px') */

5.5 滚动驱动动画 @scroll-timeline

CSS 原生滚动驱动动画,无需 JS 监听滚动事件。

@keyframes scrollAnim {
   
  from {
    opacity: 0; }
  to {
    opacity: 1; }
}

.element {
   
  animation: scrollAnim linear;
  animation-timeline: scroll();
}

5.6 视图过渡 API View Transitions

页面切换/路由切换时的原生过渡效果,主要配合 SPA 使用。

::view-transition-old(root) {
   
  animation: fade-out 0.3s;
}
::view-transition-new(root) {
   
  animation: fade-in 0.3s;
}

六、性能优化与最佳实践

6.1 硬件加速原理

触发 GPU 合成层的属性:

  • transform: translate3d() / translateZ(0)
  • opacity(配合 transform 时)
  • will-change
  • filter

GPU 加速的代价:

  • 占用额外显存,移动端过多使用会导致卡顿
  • 字体模糊问题(图层提升导致)
  • 闪烁问题可通过 backface-visibility: hidden 缓解

6.2 避坑指南

  1. 避免动画属性触发重排:不要用 width/height/top/left 做动画,改用 transform
  2. 避免同时动画大量元素:控制同时动画的元素数量
  3. 合理使用 will-change:不要全局滥用,只给即将动画的元素
  4. 移动端优化:减少复杂阴影、渐变的动画,优先使用 transform 和 opacity
  5. 降级方案:对低端设备使用 prefers-reduced-motion 关闭动画

6.3 无障碍适配

/* 尊重用户"减少动态效果"的系统设置 */
@media (prefers-reduced-motion: reduce) {
   
  *, *::before, *::after {
   
    animation-duration: 0.01ms !important;
    transition-duration: 0.01ms !important;
  }
}

七、三大动画方案对比与选型

维度 transition animation transform
状态数 2个(起止) 多个(关键帧) 无状态(静态变形)
触发方式 状态变化触发 自动/触发均可 配合其他动画使用
循环能力 不支持 支持无限循环 无
中途控制 弱 强(暂停、方向等) 无
复杂度 简单过渡 复杂序列动画 几何变换
性能 取决于属性 取决于属性 最优(合成层)

选型原则

  • 简单状态切换(按钮悬停、菜单展开)→ transition
  • 复杂循环动画(加载动画、背景动效)→ animation + @keyframes
  • 位缩放移旋转 → 优先用 transform 实现,配合 transition/animation
  • 交互动效 → transition + transform 组合(性能最佳)
  • 滚动视差 → 优先考虑 scroll-timeline 或 IntersectionObserver

八、常用经典动画模式

  1. 淡入淡出:opacity 过渡
  2. 滑入滑出:translate + opacity
  3. 缩放弹动:scale + cubic-bezier 弹性曲线
  4. 旋转加载:rotate + infinite 循环
  5. 脉冲呼吸:scale/opacity + alternate 往返
  6. 翻转卡片:rotateY + preserve-3d + backface-visibility
  7. 手风琴菜单:max-height 过渡(height 0→auto 无法过渡的替代方案)
  8. 条纹进度:background-position 位移动画
相关文章
|
2月前
|
自然语言处理 JavaScript 前端开发
【JavaScript】JS 核心:原型链、继承、闭包、作用域、执行上下文、this 指向、call/apply/bind(附《思维导图》)
本文系统梳理JS七大核心概念:执行上下文、作用域、闭包、this、call/apply/bind、原型链与继承,从运行机制、变量访问、执行主体、对象模型四大维度揭示其内在关联与底层逻辑,构建完整知识图谱。
|
前端开发 计算机视觉 开发者
利用CSS改变图片颜色的100种方法!
利用CSS改变图片颜色的100种方法!
801 1
|
3月前
|
Web App开发 人工智能 API
16 个超火的 DeepSeek Harness 插件,大肥鱼已经落后 N 个版本了。。。
DeepSeek Harness 精选插件推荐合集,从图片识别、浏览器操控、多 Agent 协作到手机远程控制,一口气带你看完 DSH 社区热门的十几个插件,覆盖技能扩展、UI 界面增强、整活玩法三大类,让你的鲸鱼变得更强。
6409 6
|
2月前
|
JavaScript 前端开发 API
【JavaScript】事件循环 Event Loop:宏任务 vs 微任务、浏览器 vs Node.js Event Loop(附《思维导图》)
JavaScript事件循环是单线程异步编程的核心机制,通过宏任务与微任务分层调度,协调调用栈与任务队列。浏览器侧重渲染流畅性,Node.js聚焦IO高效处理,二者在阶段模型、任务类型及优先级上存在本质差异。
|
2月前
|
缓存 人工智能 运维
DeepSeek Harness怎么更新?DeepSeek Harness完整更新实操指南:本体三种升级方式+插件更新,故障排查全解析
DeepSeek Harness,简称dsh,是一款采用插件化架构的开源Agent运行框架,整体处于开发者预览阶段,项目迭代速度很快,版本之间经常会新增功能、修复安全漏洞,部分版本还会出现不向前兼容的改动。很多使用者在升级过程中会遇到各类问题,最典型的就是混淆本体程序和插件扩展,误以为更新本体之后插件就会自动同步升级,最后出现界面报错、插件无法加载、会话数据异常等故障。这款工具的更新分为两个相互独立的层级,分别是本体程序更新和插件扩展更新,二者互不干涉,更新本体不会自动升级插件,更新插件同样不会改动本体程序,想要顺利完成版本迭代,就必须把两部分分开操作。本文按照更新前准备、本体更新、插件更新、
1544 0
|
2月前
|
人工智能 运维 安全
从 DevOps 到 AgentOps:软件工程还要管住什么?
AgentOps 是 DevOps 的延伸,面向人机混合研发场景,将 AI Agent 产出纳入管理。AI 介入研发带来决策黑盒、故障难追溯、产出质量不稳定等风险,文章围绕追溯、评审、测试、需求、发布、度量六大管控环节说明治理要点,梳理工具选型标准,对比多款主流工具适配场景。强调 AI 只负责辅助生成,人工必须掌握最终决策权,把 AI 产出纳入完整工程管控,方能发挥 AI 价值、降低研发风险。
|
2月前
|
人工智能 编解码 数据可视化
AI模特在服装电商中的应用:实拍效果对比与成本深度分析
分析AI模特在服装电商中的实际应用效果,对比AI模特与传统实拍的成本差异,展示万相平台在电商模特图生成中的优势与案例
465 0
|
2月前
|
数据采集 人工智能 缓存
存量资料更新与 AI 重读机制,AI 搜索引擎优化中的 GEO 生成式引擎优化策略
本文提出AI搜索引擎优化(GEO)新范式:AI依赖向量缓存,网页修改不自动触发重读。需建立标准化流程——存量审计→实质修订→技术信号配置→多渠道协同→效果监测闭环,确保AI持续采信最新、准确信息。
190 0
|
前端开发 开发者
类组件(Class component)和 函数式组件(Functional component) 之间有何区别?
类组件(Class component)和 函数式组件(Functional component) 之间有何区别?
532 0
|
监控 物联网 API
【.NET+MQTT】.NET6 环境下实现MQTT通信,以及服务端、客户端的双边消息订阅与发布的代码演示
MQTT广泛应用于工业物联网、智能家居、各类智能制造或各类自动化场景等。MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,在很多受限的环境下,比如说机器与机器通信、机器与物联网通信等。好了,科普的废话不多说,下面直接通过.NET环境来实现一套MQTT通信demo,实现服务端与客户端的双边消息发布与订阅的功能和演示。
2681 0
【.NET+MQTT】.NET6 环境下实现MQTT通信,以及服务端、客户端的双边消息订阅与发布的代码演示

热门文章

最新文章