一句话概括
transition 的核心作用是:让 CSS 属性的变化(比如宽度、颜色、位置等)从“瞬间完成”变为“平滑、渐进地完成”,从而为用户创造更流畅、更自然的交互体验。

深入理解:从“突变”到“渐变”
想象一下两种情况:
-
没有
transition的情况(突变):- 你把鼠标悬停在一张图片上,图片瞬间变大了。
- 你点击一个按钮,按钮的背景色瞬间从蓝色变成了绿色。
- 这种变化是即时的,没有任何过渡过程,用户感觉生硬,像是“凭空出现”的。
-
有
transition的情况(渐变):- 你把鼠标悬停在一张图片上,图片在 0.5 秒内平滑地、渐进地放大。
- 你点击一个按钮,按钮的背景色在 0.3 秒内从蓝色平滑地过渡到绿色。
- 这种变化是可视的、有过程的,用户感觉更连贯、更友好,像是“自然生长”出来的。
transition 就是实现这种“渐变”效果的 CSS 属性。 它告诉浏览器:“当某个元素的某个 CSS 属性值发生改变时,请不要立刻改变它,而是花一点时间,在这两个状态之间进行插值和动画。”

transition 的组成部分(四个核心属性)
transition 通常是一个简写属性,它由四个子属性组成,理解这四个子属性是掌握 transition 的关键。
transition-property
- 作用: 指定要对哪个 CSS 属性应用过渡效果。
- 可选值:
all:默认值,表示对元素所有发生变化的属性都应用过渡效果,这是最常用的。none:不应用任何过渡效果。<property-name>:具体的属性名,width,background-color,transform,opacity等,可以指定多个,用逗号隔开,width, height, background-color。
transition-duration
- 作用: 指定过渡效果持续的时间。
- 可选值:
<time>:时间单位,可以是秒(s)或毫秒(ms)。5s(半秒)、300ms(300毫秒),这是必填且最重要的属性之一,没有它,过渡效果将不会发生。
transition-timing-function
- 作用: 指定过渡效果的速度曲线,也就是动画在持续时间内如何加速或减速。
- 可选值:
ease:默认值,慢速开始,然后加快,再慢速结束。linear:匀速运动,从头到尾速度不变。ease-in:慢速开始,然后逐渐加速。ease-out:快速开始,然后逐渐减速。ease-in-out:慢速开始和结束,中间加速。cubic-bezier(n, n, n, n):自定义贝塞尔曲线,可以实现更复杂的动画效果。
transition-delay
- 作用: 指定在属性值改变后,多长时间开始过渡效果。
- 可选值:
<time>:时间单位,可以是秒(s)或毫秒(ms)。1s(延迟1秒后开始)、-0.5s(立即开始,但动画已经执行了一半)。
如何使用:代码示例
基础用法(悬停效果)
这是最常见的用法,当鼠标悬停在元素上时触发过渡。
HTML:
<button class="my-button">悬停我</button>
CSS:

.my-button {
background-color: #3498db; /* 初始背景色:蓝色 */
color: white;
padding: 10px 20px;
border: none;
border-radius: 5px;
font-size: 16px;
cursor: pointer;
/* 设置过渡效果 */
transition-property: background-color; /* 只对背景色变化应用过渡 */
transition-duration: 0.3s; /* 过渡持续0.3秒 */
transition-timing-function: ease; /* 使用默认的缓动函数 */
/* transition-delay: 0s; /* 默认不延迟 */
}
/* 当鼠标悬停时,改变背景色 */
.my-button:hover {
background-color: #e74c3c; /* 悬停时的背景色:红色 */
}
简写形式(推荐): 上面的 CSS 代码可以写成一行,更简洁:
.my-button {
/* ... 其他样式 ... */
transition: background-color 0.3s ease; /* 等同于上面的四行代码 */
}
更复杂的例子(多个属性)
我们可以同时对多个属性应用过渡,创造更丰富的效果。
HTML:
<div class="card"> <h3>卡片标题</h3> <p>这是一张可以交互的卡片。</p> </div>
CSS:
.card {
width: 250px;
padding: 20px;
border: 1px solid #ccc;
border-radius: 8px;
background-color: #f9f9f9;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
/* 对多个属性应用过渡 */
transition: transform 0.3s ease,
box-shadow 0.3s ease,
background-color 0.3s ease;
}
.card:hover {
transform: translateY(-5px); /* 向上平移 */
box-shadow: 0 8px 15px rgba(0,0,0,0.2); /* 加深阴影 */
background-color: #fff; /* 背景色变白 */
}
在这个例子中,当鼠标悬停在卡片上时,它会向上移动、阴影加深、背景色变亮,所有这些变化都是平滑过渡的。
transition 的关键点与限制
-
触发条件:
transition只在 CSS 属性值发生变化时触发,它本身不能触发动画,通常是通过hover,focus,active等伪类,或者通过 JavaScript 来改变元素的样式。 -
性能考量:
- 推荐属性: 优先使用
transform(如translate,scale,rotate) 和opacity,这些属性由 GPU 加速,性能最好,不会引起页面的重排和重绘。 - 谨慎使用属性: 避免对
width,height,margin,padding,left,top等会引起布局变化的属性使用transition,因为改变这些属性会触发浏览器的重排,性能开销较大,尤其是在复杂的布局中。
- 推荐属性: 优先使用
-
单次播放:
transition只在状态变化时播放一次,如果你需要一个循环的、持续的动画,应该使用@keyframes和animation属性。
transition vs. animation
这是一个非常常见的问题,它们的主要区别在于:
| 特性 | transition (过渡) |
animation (动画) |
|---|---|---|
| 触发方式 | 被动,依赖于属性值的改变(如 hover)。 |
主动,可以直接通过 animation 属性启动,无需外部触发。 |
| 控制性 | 较弱,只能定义开始和结束两个状态。 | 强大,可以定义多个关键帧,精确控制动画的每一步。 |
| 循环性 | 不能循环播放,一旦过渡完成,就结束了。 | 可以,可以设置 infinite 来无限循环播放。 |
| 播放次数 | 只播放一次。 | 可以指定播放次数(iteration-count)。 |
| 播放方向 | 只能从 A 到 B。 | 可以控制播放方向(如 alternate 来回播放)。 |
| 适用场景 | 状态切换,如悬停、点击、焦点等交互反馈。 | 主动展示,如加载动画、旋转图标、弹窗效果等。 |
简单总结:
- 用
transition做交互反馈。 - 用
animation做主动的、复杂的、循环的动画。
transition 是现代 Web 开发中一个基础但极其重要的工具,它的作用远不止“让动画变平滑”,更是提升用户体验、增强界面交互感和专业度的关键,通过合理运用 transition,开发者可以创造出流畅、自然、令人愉悦的用户界面,让网页不再是冰冷的工具,而是有“生命”和“反应”的交互体。
