生活中的例子 01
鼠标悬停在按钮上时,颜色平滑地渐变,而不是闪烁切换。
生活中的例子 02
网页加载时,一个转圈圈的 Loading 图标一直在旋转。
生活中的例子 03
点击汉堡菜单,侧边栏从屏幕边缘流畅地滑入,而不是突然蹦出来。
新手入门指南
拒绝生硬!让你的网页“活”过来:CSS 过渡与动画保姆级教程

嘿,未来的前端大神!👋
我是你的编程导师。今天我们要聊点非常酷的东西。你有没有发现,有些网站用起来像是在操作一台生锈的老机器,点哪儿都是“咔嚓咔嚓”的生硬切换;而有些网站(比如 Apple 的官网)用起来却像是在切一块热黄油,丝般顺滑,每一个动作都充满灵性?
区别就在于我们今天要学的主题:CSS 过渡 (Transitions) 和 CSS 动画 (Animations)。
别被这两个词吓到了。把它们想象成给你的网页元素请了位“动作指导”。
准备好了吗?我们要开始施展魔法了!
—
1. 为什么我们需要它?(一个关于“瞬间移动”的故事)
想象一下,你在现实生活中想把一个咖啡杯从桌子左边移到右边。你会怎么做?你会拿起它,在空中划过一道轨迹,然后放下它。这个过程是有时间和过程的。
但是在计算机的世界里,默认情况下,变化是瞬间的。
如果你告诉浏览器:“把这个方块变成红色!” 浏览器会说:“好嘞!”然后——啪!0.0001秒内,它就是红色的了。没有过程,只有结果。
这种“瞬间移动”会让用户感到困惑:“刚才发生了什么?这个菜单是从哪冒出来的?”
CSS 动画解决了这个问题。它告诉浏览器:“嘿,兄弟,别急。花个 0.5 秒,慢慢地从蓝色变成红色,我们要优雅一点。”
—
2. 第一部分:CSS 过渡 (Transitions) —— 简单的魔法
我们先从最简单的开始:Transition。
什么是 Transition?
Transition 就像是一个“自动补帧机”。你只需要告诉它起点和终点,浏览器会自动帮你计算中间的过程。
它通常用于简单的交互,比如:
鼠标放上去 (Hover) -> 变色输入框获得焦点 (Focus) -> 变宽
核心咒语
要使用 Transition,你通常只需要关注这 4 个属性(通常简写在一起):
`transition-property` (变啥?): 你想让哪个属性动起来?(比如 ,
width, 或者
background-color)。`transition-duration` (多久?): 动画持续多少时间?(比如
all 即 0.3秒)。`transition-timing-function` (怎么动?): 是匀速?还是先快后慢?(比如
0.3s 就像汽车起步和刹车)。`transition-delay` (等多久?): 要不要延迟一会儿再动?
ease-in-out
💻 代码游乐场:你的第一个丝滑按钮
来,我们写一个按钮。当鼠标放上去时,它会变大一点,背景色也会变。
❌ 错误示范 (没有动画)
✅ 正确示范 (加上 Transition)
/* 这是一个优雅的按钮 */
.button-smooth {
/* 1. 基础样式 */
background-color: #3498db; /* 蓝色 */
color: white;
padding: 10px 20px;
border-radius: 5px;
border: none;
cursor: pointer;
/* 2. 魔法就在这行! 👇 */
/* 翻译:所有的变化(all),在 0.3秒内完成,使用 ease(先慢后快再慢) 的节奏 */
transition: all 0.3s ease;
}
.button-smooth:hover {
/* 3. 终点状态 */
background-color: #e74c3c; /* 红色 */
transform: scale(1.1); /* 放大 1.1 倍 */
box-shadow: 0 10px 20px rgba(0,0,0,0.2); /* 加点阴影 */
}
🔍 代码深度解析
`transition: all 0.3s ease;`: 这一行是灵魂。如果不加这行,当你 hover 时,颜色会瞬间由蓝变红。加了这行,浏览器会想:“哦,主人想要变色。我有 0.3 秒的时间。第一帧我弄点紫色,第二帧弄点深红…好了,变成了红色。”`transform: scale(1.1)`: 这是一个“变形”属性。它比修改 和
width 性能更好(这点后面会细说)。
height
—
3. 第二部分:CSS 动画 (Keyframes) —— 复杂的剧本
Transition 虽然好用,但它有个缺点:它需要一个触发器(比如鼠标悬停)。而且它只能从 A 变到 B。
如果你想让一个东西一直动(比如加载转圈),或者它的动作很复杂(A -> B -> C -> A),这时候你就需要 Keyframes (关键帧) 动画了。
什么是 Keyframes?
想象你在拍电影。你需要写一个剧本。CSS 里的剧本就是 。 你告诉浏览器:“在 0% 的时候,演员站在左边;在 50% 的时候,演员跳起来;在 100% 的时候,演员落地并变成金色。”
@keyframes
两个步骤
写剧本 (定义 )。给演员派活 (在 CSS 选择器里使用
@keyframes 属性)。
animation
💻 代码游乐场:制作一个“心跳”效果
我们要让一个红色的心形图标不断地跳动,就像真的心脏一样。
/* 第一步:写剧本 */
/* 给这个剧本起个名字叫 'heartbeat' */
@keyframes heartbeat {
/* 0% 是动画开始的时候 */
0% {
transform: scale(1);
}
/* 50% 是动画进行到一半的时候 */
/* 我们让它变大一点,模拟心跳收缩 */
50% {
transform: scale(1.3);
}
/* 100% 是动画结束的时候 */
/* 回复原状 */
100% {
transform: scale(1);
}
}
/* 第二步:找演员 */
.heart {
width: 50px;
height: 50px;
background-color: red;
border-radius: 50%; /* 偷懒画个圆代替爱心 */
margin: 50px;
/* 核心咒语 👇 */
/* 剧本名: heartbeat */
/* 单次时长: 1秒 */
/* 循环次数: 无限(infinite) */
/* 节奏: 线性(linear) 或者 ease-in-out */
animation: heartbeat 1s infinite ease-in-out;
}
🔍 代码深度解析
`@keyframes`: 这是定义动画逻辑的地方。你可以设置无数个阶段(0%, 10%, 25%…)。`animation` 简写属性: 包含了多个子属性:: 对应
animation-name 的名字。
@keyframes: 1s,表示跳动一次花1秒。`animation-iteration-count`:
animation-duration 是关键,表示“根本停不下来”。如果不写这个,它跳一次就罢工了。
infinite
—
4. 实战演练:Loading 加载圈
这是你会在真实工作中无数次写到的东西。别再用 GIF图了,用 CSS 画一个!
<div class="spinner"></div>
/* 1. 定义旋转的剧本 */
@keyframes spin {
0% {
/* 开始角度:0度 */
transform: rotate(0deg);
}
100% {
/* 结束角度:360度 (转一圈) */
transform: rotate(360deg);
}
}
/* 2. 定义加载圈的样子 */
.spinner {
width: 40px;
height: 40px;
/* 弄成圆形 */
border-radius: 50%;
/* 边框是灰色的 */
border: 4px solid #f3f3f3;
/* 只有顶部边框是蓝色的,这样转起来才看得出在动 */
border-top: 4px solid #3498db;
/* 3. 应用动画 */
/* 注意这里用 linear,因为旋转通常是匀速的,不然会看起来一卡一卡的 */
animation: spin 1s linear infinite;
}
想象一下:这就像是一个轮胎。你把轮胎上面涂了一块蓝色,然后让轮胎匀速旋转,这就成了加载动画!
—
5. 常见坑点 (The Gotchas) —— 别踩这些雷!
新手在写动画时,经常会遇到一些让人头秃的问题。让我帮你避坑:
🕳 坑点 1:Transition 加错位置了
这是最常见的错误!
错误做法:把 写在
transition 里。
:hover
/* ❌ 错误 */
.box:hover {
background: red;
transition: background 0.5s;
}
后果:鼠标放上去时有动画,但鼠标移开时,它会瞬间变回原来的颜色(因为 状态结束了,transition 属性也没了)。
:hover
正确做法:把 写在元素原本的类里。
transition
/* ✅ 正确 */
.box {
background: blue;
transition: background 0.5s; /* 无论进还是出,都有动画 */
}
🕳 坑点 2:动画性能极差 (电脑风扇起飞)
浏览器绘制网页是很辛苦的。有些属性改起来很轻松,有些很累。
尽量避免动画这些属性:,
width,
height,
margin,
padding,
top。*为什么?* 因为改这些会导致浏览器重新计算整个网页的排版(Reflow),非常耗性能。推荐动画这些属性:
left (变形),
transform (透明度)。*为什么?* 这些属性由显卡(GPU)直接处理,像德芙一样丝滑,不会影响其他元素的排版。例子:如果你想让元素位移,别用
opacity,用
left: 100px。
transform: translateX(100px)
—
6. 问答时间 (Q&A)
Q: 我可以用 CSS 动画做任何事情吗?
A: 几乎可以,但复杂的逻辑(比如:点击按钮后,先请求数据,数据回来了再播放动画,动画完了再跳转页面)需要 JavaScript 来配合控制 CSS 类名。CSS 负责“动”,JS 负责“什么时候动”。
Q: `ease-in`, `ease-out` 到底是啥意思?
A: 想象你在开车:
: 自动巡航,速度一直不变(适合旋转)。
linear: 起步踩油门,由慢变快。
ease-in: 到站踩刹车,由快变慢(这个最常用,因为东西停下来通常都是慢慢停的)。
ease-out: 先起步,中间快,最后刹车(最自然)。
ease-in-out
—
7. 总结
恭喜你!你现在已经掌握了让网页“活”过来的秘诀。
Transition (过渡):就像调光灯,适合简单的 A 到 B 变化,通常配合 Hover 使用。Animation (动画):就像拍电影,有剧本 (),适合复杂的、自动播放的效果。性能优化:尽量用
@keyframes 和
transform,善待用户的 CPU。
opacity
现在的网页不再是死气沉沉的文档了,去吧,给你的按钮加上呼吸,给你的卡片加上翻转,让你的代码像艺术品一样流动起来!
