一句话概括

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

网页代码transition的作用
(图片来源网络,侵删)

深入理解:从“突变”到“渐变”

想象一下两种情况:

  1. 没有 transition 的情况(突变):

    • 你把鼠标悬停在一张图片上,图片瞬间变大了。
    • 你点击一个按钮,按钮的背景色瞬间从蓝色变成了绿色。
    • 这种变化是即时的,没有任何过渡过程,用户感觉生硬,像是“凭空出现”的。
  2. transition 的情况(渐变):

    • 你把鼠标悬停在一张图片上,图片在 0.5 秒内平滑地、渐进地放大。
    • 你点击一个按钮,按钮的背景色在 0.3 秒内从蓝色平滑地过渡到绿色。
    • 这种变化是可视的、有过程的,用户感觉更连贯、更友好,像是“自然生长”出来的。

transition 就是实现这种“渐变”效果的 CSS 属性。 它告诉浏览器:“当某个元素的某个 CSS 属性值发生改变时,请不要立刻改变它,而是花一点时间,在这两个状态之间进行插值和动画。”

网页代码transition的作用
(图片来源网络,侵删)

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:

网页代码transition的作用
(图片来源网络,侵删)
.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 的关键点与限制

  1. 触发条件: transition 只在 CSS 属性值发生变化时触发,它本身不能触发动画,通常是通过 hover, focus, active 等伪类,或者通过 JavaScript 来改变元素的样式。

  2. 性能考量:

    • 推荐属性: 优先使用 transform (如 translate, scale, rotate) 和 opacity,这些属性由 GPU 加速,性能最好,不会引起页面的重排和重绘。
    • 谨慎使用属性: 避免对 width, height, margin, padding, left, top 等会引起布局变化的属性使用 transition,因为改变这些属性会触发浏览器的重排,性能开销较大,尤其是在复杂的布局中。
  3. 单次播放: transition 只在状态变化时播放一次,如果你需要一个循环的、持续的动画,应该使用 @keyframesanimation 属性。


transition vs. animation

这是一个非常常见的问题,它们的主要区别在于:

特性 transition (过渡) animation (动画)
触发方式 被动,依赖于属性值的改变(如 hover)。 主动,可以直接通过 animation 属性启动,无需外部触发。
控制性 较弱,只能定义开始和结束两个状态。 强大,可以定义多个关键帧,精确控制动画的每一步。
循环性 不能循环播放,一旦过渡完成,就结束了。 可以,可以设置 infinite 来无限循环播放。
播放次数 只播放一次。 可以指定播放次数(iteration-count)。
播放方向 只能从 A 到 B。 可以控制播放方向(如 alternate 来回播放)。
适用场景 状态切换,如悬停、点击、焦点等交互反馈。 主动展示,如加载动画、旋转图标、弹窗效果等。

简单总结:

  • transition 做交互反馈。
  • animation 做主动的、复杂的、循环的动画。

transition 是现代 Web 开发中一个基础但极其重要的工具,它的作用远不止“让动画变平滑”,更是提升用户体验、增强界面交互感和专业度的关键,通过合理运用 transition,开发者可以创造出流畅、自然、令人愉悦的用户界面,让网页不再是冰冷的工具,而是有“生命”和“反应”的交互体。