06过渡
transition 让样式变化不再瞬间跳变,而是平滑地滑过去。
你只声明「起点」和「终点」,中间的每一帧浏览器替你补——它是 CSS 动效里
性价比最高的一行代码。
一、过渡的本质:状态 A 到状态 B 的补间
过渡是一种补间动画(tweening): 样式从旧值到新值变化时,浏览器自动生成中间帧。它不能自己发动, 必须由一次「状态变化」触发——hover 移入移出、聚焦失焦、类名增删、媒体查询命中,都算。
.smooth 的 transition 删掉,两枚按钮就都“瞬移”了除 hover 外,一切「能让属性值变化」的场合都能触发过渡:
二、transition-property 与 duration:动什么、动多久
过渡四要素的前两个:transition-property 决定哪些属性参与过渡,
transition-duration 决定花多久完成。
| property 取值 | 含义 | 建议 |
|---|---|---|
| all(默认) | 所有可过渡属性都过渡 | 省心,但重排属性会被一起拖进动画 |
| 具体属性名 | 只有列出的属性过渡 | 推荐:可控、性能好 |
| none | 完全禁用过渡 | 调试时临时关掉动效 |
duration 的单位必须写(s 或 ms),
默认值是 0s——这就是「明明写了 transition 却没动画」的常见原因之一。
拖动感受一下时长差异:
.d1 的 0.1s 改成 0.01s 感受“瞬移”三、transition-timing-function:速度曲线
同样 0.6 秒,怎么个跑法由速度曲线决定: 匀速、先快后慢、先慢后快、甚至冲过头再弹回来。
.t2 的 ease 改成 steps(4) 看熄格跳变匀速
默认
慢→快
快→慢
bezier
四、transition-delay 与简写:第四要素
transition-delay 是「等多久才出发」。单个元素用它不多,
一群元素排队出场时它就是节奏大师。
移入移出都排队——注意移出时它们按同样顺序退场
transition 会整体重置四个子属性——
先写了子属性再写简写,前面的设置会被覆盖。同一个元素只用一种写法。五、哪些属性值得过渡:性能分三档
不是所有属性过渡起来都一样轻快。按浏览器渲染成本分三档:
| 档位 | 代表属性 | 渲染成本 | 建议 |
|---|---|---|---|
| 合成层 ⭐⭐⭐ | transform / opacity | GPU 直接算,不碰布局 | 动画首选 |
| 重绘 ⭐⭐ | color / background / box-shadow | 重新画像素,不重排 | 短动画无妨 |
| 重排 ⭐ | width / height / top / margin | 牵一发动全身,兄弟全重算 | 尽量避免做动画 |
| 不可过渡 | display / position / font-family | 离散值,没有「中间帧」 | 换 opacity 或 transform 实现 |
.c 的 width 换成 transform: scaleX(1.4) 对比顺滑度)scale(1.2)
0.25
152px
height: auto 无法过渡——起点没有具体数值,浏览器不知道从几开始补间。
经典解法:①用 max-height 给一个「比内容大的上限」(见第七节抽屉);
②现代方案用 grid-template-rows: 0fr → 1fr 过渡。六、多属性分组:一个元素,各玩各的节奏
逗号分隔多组过渡,每组有自己的时长和曲线。 高级感的 hover 往往就是「快的先走、慢的垫后」:
transform .25s 改成 1s,节奏就乱了,试试)分节奏卡片
transform 0.25s 先起身
背景色 0.5s 慢慢染
阴影 0.45s 中速跟上
为什么要分组
全部同速 = 机械
错开半拍 = 有生命感
这就是动效的「编舞」
transition: all 图省事,但所有属性被迫同一种节奏,
还会把意外的重排属性拖进动画。正式项目里,写清楚每一个属性名。七、实战:纯 CSS 抽屉(点一下展开)
把本章知识串起来:复选框当开关、max-height 过渡高度、箭头同步旋转。 不写一行 JavaScript,点击标题就能展开收起——手风琴、FAQ 列表的原型。
max-height: 200px 改成 2000px 观察「空跑」的违和感内容实际高度未知时,用 max-height 从 0 过渡到一个「足够大的上限」, 浏览器会在 0 和上限之间平滑补间。注意:上限别设太大—— 200px 的内容配 2000px 的上限,前 90% 的时间都在「空跑」。
:checked 换成 JS 切换的 .open 类名,
点击事件只干「加减类」这一件事,动画完全交给 CSS——这就是状态与表现分离。八、本章小结
过渡四要素总表(背下来,随手就能写):
| 子属性 | 管什么 | 常用值 |
|---|---|---|
transition-property | 哪些属性动 | 具体属性名(推荐)/ all / none |
transition-duration | 动多久 | 0.15s ~ 0.5s(必须带单位) |
transition-timing-function | 怎么个变速法 | ease / ease-out / cubic-bezier() / steps() |
transition-delay | 多久后出发 | 0s,错峰入场才用 |
transition(简写) | 一行全包 | transform 0.3s ease 0.1s |
- 过渡 = 状态 A → 状态 B 的补间,必须由状态变化触发;写在基态而非 :hover 里
- 简写两个时间的识别规则:第一个永远是 duration,第二个才是 delay
- 性能三档:transform / opacity 走 GPU,颜色类走重绘,宽高边距走重排(尽量别动画)
height: auto不可过渡——用max-height或grid-template-rows: 0fr/1fr绕行- 多属性逗号分组、错开时长,才有「编舞感」;正式项目别偷懒写
all - 下一章的
animation是它的完全体:多关键帧、能循环、自动播放
transform: scaleX(1.4),对比顺滑度;
③把第七节抽屉的 max-height: 200px 改成 2000px,观察「空跑」的违和感。@media (prefers-reduced-motion: reduce) { * { transition-duration: 0.01s !important; } },
让晕动症用户也能舒服地用你的页面。