CSS动画双雄:Animation 与 Transition
在现代网页设计中,流畅、自然的动画效果是提升用户体验、增强视觉吸引力的关键。CSS为我们提供了两大核心动画工具:transition(过渡)和 animation(动画)。它们各有千秋,适用于不同的场景。
一、Transition:属性值的平滑过渡
- 核心概念
transition 用于定义单一状态到另一状态之间的平滑变化过程。它不是一个独立的动画,而是当元素的某个或某些属性(如颜色、位置、大小等)发生变化时,自动应用的过渡效果。最常见的触发方式是通过 :hover、:focus 等伪类,或通过 JavaScript 动态添加/移除 CSS 类。
- 语法详解
transition 是一个复合属性,可分解为以下四个子属性:
transition-property: 指定应用过渡效果的 CSS 属性名称(如width,background-color,transform)。可使用all表示所有可动画属性。transition-duration: 定义过渡效果完成所需的时长(如0.5s,200ms)。这是唯一必需的属性。transition-timing-function: 定义过渡效果的速度曲线(缓动函数)。常用值:ease(默认): 慢-快-慢linear: 匀速ease-in: 慢开始ease-out: 慢结束ease-in-out: 慢开始和慢结束cubic-bezier(n,n,n,n): 自定义贝塞尔曲线
transition-delay: 定义过渡效果开始前的延迟时间(如0.3s)。
简写语法:
transition: [property] [duration] [timing-function] [delay];
例如:
.button {
background-color: blue;
/* 当背景色变化时,用0.3秒的ease效果平滑过渡 */
transition: background-color 0.3s ease;
}
.button:hover {
background-color: red;
}
- Transition 特点
- 触发驱动:需要外部触发(如悬停、点击、类名变更)才能启动。
- 两态之间:主要处理从状态A到状态B的变化。
- 相对简单:语法简洁,易于上手,适合简单的状态切换动画。
- 性能考量:应优先使用对性能影响小的属性进行过渡,如
transform和opacity。避免对width,height,margin,padding等会触发重排(reflow)的属性进行频繁过渡。
二、Animation:更复杂的帧动画
- 核心概念
animation 允许你创建更复杂、更精细控制的动画序列。它通过 @keyframes 规则定义动画的各个关键帧(从 0% 到 100% 或 from/to),然后将这个关键帧序列应用到元素上。animation 可以自动播放,无需用户交互触发。
-
关键组成部分
@keyframes 规则
定义动画的各个阶段。你可以指定在动画周期的特定百分比(或 from=0%, to=100%)时,元素应具有的样式。
@keyframes slideIn {
from {
transform: translateX(-100%);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
/* 或者使用百分比 */
@keyframes pulse {
0% {
transform: scale(1);
opacity: 1;
}
50% {
transform: scale(1.1);
opacity: 0.7;
}
100% {
transform: scale(1);
opacity: 1;
}
}
2. animation 属性
将 @keyframes 定义的动画应用到元素。它也是一个复合属性:
animation-name: 指定@keyframes的名称(如slideIn,pulse)。animation-duration: 动画完成一个周期所需的时长(如2s)。animation-timing-function: 与transition-timing-function相同,控制关键帧之间插值的速度。animation-delay: 动画开始前的延迟时间。animation-iteration-count: 动画播放的次数。1(默认),infinite(无限循环)。animation-direction: 动画播放方向。normal(默认,向前),reverse(反向),alternate(奇数次正向,偶数次反向),alternate-reverse。animation-fill-mode: 定义动画在开始前和结束后如何应用样式。none(默认),forwards(保持最后一帧),backwards(保持第一帧),both。animation-play-state: 控制动画的播放状态。running(默认),paused。
简写语法:
animation: [name] [duration] [timing-function] [delay] [iteration-count] [direction] [fill-mode] [play-state];
例如:
.animate-element {
/* 使用slideIn动画,持续1.5秒,ease-in-out速度,延迟0.5秒后开始,播放1次,结束后保持最后一帧样式 */
animation: slideIn 1.5s ease-in-out 0.5s 1 normal forwards;
}
- Animation 特点
- 关键帧控制:可以精确控制动画过程中的任意中间状态。
- 自动播放:可以设置自动开始播放,无需用户交互。
- 复杂序列:支持循环、反向播放、多段动画等复杂行为。
- 独立性:动画定义(
@keyframes)与应用分离,便于复用。
三、Transition 与 Animation 的核心区别
| 特性 | Transition | Animation |
|---|---|---|
| 触发方式 | 需要外部触发(状态变化) | 可自动播放或通过触发开始 |
| 控制粒度 | 仅控制起始和结束状态之间的变化 | 通过关键帧精确控制整个动画过程 |
| 复杂性 | 相对简单,适合简单状态切换 | 更复杂,适合精细复杂的动画序列 |
| 循环能力 | 默认只执行一次(除非状态反复切换) | 天然支持无限循环 (infinite) |
| 关键帧 | 无 | 有 (@keyframes) |
| JavaScript 控制 | 主要通过改变触发状态的类名 | 可通过 animation-play-state 或 Web Animations API 精细控制 |
| 适用场景 | 悬停效果、按钮反馈、简单的展开/收起 | 加载动画、复杂的路径移动、序列化动画、徽标动画 |
四、何时选择 Transition 或 Animation?
-
选择
transition当:- 你需要一个简单的、基于用户交互的“状态切换”效果。
- 例如:按钮悬停变色、下拉菜单展开/收起、工具提示显示/隐藏。
- 效果只在两个明确的状态之间变化。
-
选择
animation当:- 你需要一个自动播放的动画。
- 你需要动画在多个状态之间循环或有复杂的路径。
- 你需要精确控制动画过程中的每一个中间步骤。
- 例如:加载指示器(旋转、脉冲)、元素进入/退出视图的复杂动画、角色行走动画、徽标动态展示。
五、最佳实践与性能提示
- 优先使用
transform和opacity: 这两个属性通常由 GPU 加速,动画性能最佳。避免对top,left,width,height等触发重排的属性进行动画。 - 合理使用
will-change: 对于将要进行动画的元素,可以提前声明will-change: transform;或will-change: opacity;,提示浏览器提前优化。 - 避免过度动画: 过多的动画会分散用户注意力并消耗资源。确保动画服务于用户体验。
- 考虑可访问性: 为动画提供关闭选项(如
prefers-reduced-motion媒体查询),尊重用户偏好。@media (prefers-reduced-motion: reduce) { * { transition: none !important; animation: none !important; } } - 测试与调试: 在不同设备和浏览器上测试动画效果和性能。
结语
transition 和 animation 是构建现代、生动网页不可或缺的 CSS 工具。理解它们的核心差异和适用场景,能够让你更高效地选择正确的工具来实现设计需求。