视频加载失败

CSS3中的transition属性过渡与动画

2183 字
11 分钟
CSS3中的transition属性过渡与动画

前言#

CSS3 中,**过渡(Transition)和动画(Animation)**都能让元素产生动态效果,但两者的使用场景不同。

  • 过渡:让元素从一种样式平滑变化到另一种样式,通常需要触发条件。
  • 动画:通过关键帧定义一系列样式变化,可以自动播放,也可以循环播放。

过渡的基本使用#

什么是过渡#

CSS 过渡(Transition)用于控制元素的样式从一个状态变化到另一个状态时的过程,而不是瞬间完成变化。

例如,鼠标移入盒子时,让背景颜色在 1 秒内逐渐从红色变为蓝色。

<div class="box"></div>
.box {
width: 100px;
height: 100px;
background-color: red;
transition: background-color 1s;
}
.box:hover {
background-color: blue;
}

没有 transition 时,颜色立即改变;添加之后,颜色会平滑变化。

transition 的基本属性#

属性作用示例
transition-property指定需要过渡的属性width
transition-duration设置过渡持续时间1s
transition-timing-function设置过渡的速度曲线ease
transition-delay设置过渡开始前的等待时间0.5s
transition以上属性的简写all 1s ease

transition-property:指定哪些 CSS 属性需要执行过渡。

.box {
transition-property: width;
}
/* 多个属性可以使用逗号分隔 */
.box {
transition-property: width, background-color;
}
/* 使用 all 表示所有可过渡的属性 */
.box {
transition-property: all;
}

注意:并非所有 CSS 属性都可以平滑过渡,例如 display: none 到 display: block 在普通情况下不会产生连续的过渡效果。

**transition-duration:**设置过渡持续时间,单位为 s 或 ms。

.box {
transition-duration: 1s;
}
  • 1s:1 秒
  • 500ms:500 毫秒
  • 0.5s:0.5 秒

**transition-delay:**设置过渡开始前的延迟时间。

.box {
transition-delay: 0.5s;
}

表示触发状态变化后,等待 0.5 秒才开始过渡

transition 简写

基本语法:

transition: 属性 持续时间 缓动函数 延迟时间;

例如:

.box {
transition: width 1s ease 0.5s;
}

表示宽度变化时,延迟 0.5 秒,然后使用 ease 曲线执行 1 秒的过渡。

还可以设置多个属性:

.box {
transition:
width 1s ease,
background-color 0.5s linear,
transform 0.3s ease;
}

过渡完整示例#

.container {
width: 260px;
height: 160px;
padding: 20px;
box-sizing: border-box;
}
.box {
width: 100px;
height: 100px;
background-color: red;
border-radius: 0;
transition:
transform 0.6s ease,
background-color 0.6s ease,
border-radius 0.6s ease;
}
.container:hover .box {
transform: translateX(100px) rotate(30deg);
background-color: blue;
border-radius: 50%;
}
<div class="container">
<div class="box"></div>
</div>

开发注意:

  • transition 通常写在元素的基础样式中,而不是只写在 :hover 中,这样移入和移出时都能平滑过渡。
  • 现代开发中,优先使用 transform 和 opacity 实现位移、缩放与淡入淡出,通常性能更好。
  • 过渡不只能够通过 :hover 触发,也能通过 :focus、修改 class、JavaScript 修改样式等方式触发。
  • 当元素需要发生较大位移、旋转或缩放时,尽量不要让正在运动的元素自己承担 :hover 触发条件。 这是 CSS 过渡动画中很典型的交互陷阱。

过渡的缓动效果#

什么是缓动效果:缓动效果通过 transition-timing-function 控制过渡过程中变化的快慢。例如,同样是 1 秒完成 200px 位移,可以匀速移动,也可以先快后慢。

常见缓动函数

属性值作用
ease默认值,先加速后减速
linear匀速变化
ease-in慢速开始,逐渐加速
ease-out快速开始,逐渐减速
ease-in-out慢速开始,慢速结束
cubic-bezier()自定义贝塞尔曲线
steps()将过渡划分成离散步骤

cubic-bezier() 自定义缓动:cubic-bezier() 用于自定义三次贝塞尔缓动曲线。

语法:

transition-timing-function: cubic-bezier(x1, y1, x2, y2);

其中四个参数表示两个控制点的坐标,x1 和 x2 必须在 0~1 之间。

常见预设对应的曲线:

/* 匀速 */
linear
/* 等效于 */
cubic-bezier(0, 0, 1, 1);
/* 默认缓动 */
ease
/* 等效于 */
cubic-bezier(0.25, 0.1, 0.25, 1);
/* 慢速开始 */
ease-in
/* 等效于 */
cubic-bezier(0.42, 0, 1, 1);
/* 快速开始,慢速结束 */
ease-out
/* 等效于 */
cubic-bezier(0, 0, 0.58, 1);

实际开发中,不需要手动推导贝塞尔曲线。可以使用 cubic-bezier.com 可视化调试。

steps() 步进函数#

steps() 让变化以离散的步骤完成,而不是连续、平滑地变化。

.box {
transition: transform 2s steps(4, end);
}
.box:hover {
transform: translateX(200px);
}

表示在 2 秒内分 4 步完成位移。

常用于逐帧效果、数字跳动、打字机效果等场景。

动画的定义和调用#

什么是 CSS 动画#

CSS 动画(Animation)使用 @keyframes 定义关键帧,然后使用 animation 属性将动画应用到元素。与过渡不同,动画可以不依赖状态改变而自动执行,也可以循环播放。

使用 @keyframes 定义动画#

基本语法:

@keyframes 动画名称 {
from {
/* 初始状态 */
}
to {
/* 结束状态 */
}
}

例如:

@keyframes move {
from {
transform: translateX(0);
}
to {
transform: translateX(200px);
}
}

也可以使用百分比定义多个关键帧:

@keyframes move {
0% {
transform: translateX(0);
}
50% {
transform: translateX(100px);
}
100% {
transform: translateX(200px);
}
}

这里的 0%、50%、100% 表示动画时间进度,而不是元素位置的百分比。

使用 animation 调用动画#

定义动画后,需要通过 animation 将动画应用到元素。

.box {
animation-name: move;
animation-duration: 2s;
}

表示元素执行名为 move 的动画,持续时间 2 秒。

animation 的常用属性

属性作用示例
animation-name动画名称move
animation-duration动画持续时间2s
animation-timing-function动画缓动曲线ease
animation-delay动画延迟时间1s
animation-iteration-count动画播放次数3、infinite
animation-direction动画播放方向alternate
animation-fill-mode动画前后应用的样式forwards
animation-play-state动画播放状态paused、running
animation动画简写属性move 2s ease infinite

animation-iteration-count:控制动画播放次数。

.box {
animation-iteration-count: 3;
}

表示播放 3 次。

.box {
animation-iteration-count: infinite;
}

表示无限循环。

animation-direction:控制动画播放方向。

属性值说明
normal正常播放,默认值
reverse反向播放
alternate正向、反向交替播放
alternate-reverse反向、正向交替播放

例如:

.box {
animation-direction: alternate;
}

第一次从起点到终点,第二次从终点返回起点。

animation-fill-mode:控制动画执行前和结束后,是否应用关键帧中的样式。

属性值说明
none默认值,不额外保留关键帧样式
forwards结束后保留最后执行的关键帧样式
backwards延迟等待阶段应用起始关键帧样式
both同时具有 forwards 和 backwards 的效果

例如:

.box {
animation: move 2s ease forwards;
}

动画结束之后,元素继续保持动画结束时的视觉状态。

注意:forwards 不会真正修改元素的普通 CSS 属性值,只是让动画效果继续参与样式计算。

animation-play-state:控制动画播放或暂停。

.box {
animation-play-state: running;
}
.box:hover {
animation-play-state: paused;
}

鼠标移入时暂停动画,移出后继续播放。

animation 简写

基本语法:

animation: 名称 时长 缓动函数 延迟 次数 方向 填充模式;

示例:

.box {
animation: move 2s ease 0.5s infinite alternate;
}

表示调用 move 动画,延迟 0.5 秒,执行 2 秒,无限循环,并交替播放方向。多个动画也可以一起使用:

.box {
animation:
move 2s ease infinite alternate,
fade 1s linear infinite alternate;
}

动画完整示例#

.box {
width: 100px;
height: 100px;
background-color: blue;
animation: move 2.5s ease-in-out infinite alternate;
}
@keyframes move {
0% {
transform: translateX(0) rotate(0);
background-color: blue;
}
50% {
transform: translateX(100px) rotate(90deg);
background-color: purple;
}
100% {
transform: translateX(200px) rotate(180deg);
background-color: green;
border-radius: 50%;
}
}

实际开发中的常见动画#

淡入动画#

@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.box {
animation: fadeIn 0.5s ease-out;
}

旋转加载动画#

@keyframes rotate {
to {
transform: rotate(360deg);
}
}
.loading {
animation: rotate 1s linear infinite;
}

上下浮动动画#

@keyframes float {
0%,
100% {
transform: translateY(0);
}
50% {
transform: translateY(-15px);
}
}
.box {
animation: float 2s ease-in-out infinite;
}

总结#

Transition 与 Animation 的区别

对比Transition(过渡)Animation(动画)
是否需要触发通常需要状态变化可以自动执行
定义方式transition@keyframes + animation
变化过程两个状态间的过渡可以定义多个关键帧
循环播放不直接支持循环次数支持 infinite
播放方向随状态变化决定支持方向设置
暂停控制无专门暂停属性animation-play-state
典型场景按钮悬停、菜单展开Loading、呼吸灯、循环动效

开发建议

在 Vue3、React 等现代前端项目中,通常按照以下方式选择:

  • 按钮 Hover、导航栏高亮、卡片悬浮:使用 transition。
  • Loading 加载、循环旋转、呼吸灯:使用 animation。
  • 弹窗进入退出、组件显示隐藏:通常通过组件状态切换配合 CSS 过渡或动画实现。
  • 复杂的连续交互、精细时间轴控制:可以考虑 Web Animations API 或专门的动画库。

核心记忆:

transition 负责两个状态之间的平滑变化,@keyframes 负责定义动画过程,animation 负责调用和控制动画。

掌握这三者,以及 ease、duration、delay 和 transform 的组合,就足以完成大多数常见网页交互动效。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

CSS3中的transition属性过渡与动画
https://f.youzi177.cn/posts/2026100902css3-zhong-de-transition-shu-xing-guo-du-yu-dong-hua/
作者
小封鸭
发布于
2026-10-09
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
小封鸭
小楼一夜听春雨,深巷明朝卖杏花
公告
欢迎来到我的博客。这里主要记录前端全栈和日常内容
分类
标签
最新动态
站点统计
文章
60
分类
3
标签
12
总字数
107,734
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
EdgeOne Pages
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录