在系统学习 CSS3 的过程中,2D / 3D 转换和动画是绕不开的一部分。
这部分内容看起来 API 不多,但一旦涉及组合使用、动画顺序和空间感,就很容易“写得出来,却说不明白”。
这篇笔记从使用动机 + 核心理解出发,梳理 CSS3 中常用的 2D 转换、动画以及 3D 转换,帮助自己也帮助后来者把这部分真正吃透。
一、什么是 transform?为什么动画优先用它
在 CSS 中,transform 的核心作用不是布局,而是视觉变换。
与 margin、top、left 等属性最大的区别在于:
- transform 不会影响其他元素的布局
- transform 发生在浏览器渲染阶段
- 性能更好,动画更流畅
这也是为什么在实际开发中:
- 位移效果优先使用 translate
- 悬浮、缩放、旋转优先使用 transform
- 动画尽量避免频繁修改布局属性
一句话总结:
transform 适合“看起来在动”,而不是“真的改变结构”。
二、CSS3 的 2D 转换
1. 位移:translate(使用频率最高)
transform: translate(x, y);
理解重点:
- 位移参考的是元素自身
- 百分比是相对于自身宽高
- 不会挤开其他盒子
一个非常经典、几乎必背的写法是绝对定位居中:
.box {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
为什么这种写法可以保证永远居中?
- top / left 把元素左上角放到父盒子中心
- translate 再把元素自身往回拉一半宽高
- 不管盒子怎么缩放、动画怎么做,始终以中心为基准
很多波纹、弹窗、loading 动画,底层逻辑都是这个写法。
2. 旋转:rotate
transform: rotate(45deg);
要点:
- 正值为顺时针旋转
- 负值为逆时针旋转
- 默认围绕元素中心旋转
常见应用场景:
- 箭头旋转
- 加号变叉号
- 图标 hover 效果
如果需要改变旋转中心,可以配合:
transform-origin: left top;
3. 缩放:scale
transform: scale(1.2);
相比直接修改 width / height,scale 的优势在于:
- 不影响布局
- 可以以中心或指定点缩放
- 动画过渡自然
常用于 hover 放大效果:
.box {
transition: transform 0.3s;
}
.box:hover {
transform: scale(1.1);
}
4. transform 的顺序问题(非常容易踩坑)
transform: translate(...) rotate(...) scale(...);
需要注意的是:
transform 是从右往左依次执行的。
经验法则:
如果有位移,translate 尽量写在最前面。
错误的顺序可能会导致旋转后再位移,方向完全不符合预期。
三、CSS 动画:从 transition 到 animation
1. transition 的特点
transition 适合:
- 状态切换
- hover 效果
- 简单过渡
transition: all 0.3s ease;
缺点是:
只能从一个状态过渡到另一个状态,无法控制过程。
2. animation 的优势
animation 通过关键帧,描述完整的运动过程。
@keyframes move {
0% {
transform: translateX(0);
}
100% {
transform: translateX(200px);
}
}
使用动画:
.box {
animation: move 2s linear infinite;
}
3. animation 常用属性理解
animation: name duration timing-function delay iteration-count direction fill-mode;
实际开发中常见组合:
animation: move 2s ease-in-out infinite alternate;
几个高频属性说明:
- infinite:无限循环
- alternate:往返动画,更自然
- forwards:动画结束后停留在最后一帧
- paused:常用于 hover 时暂停动画
4. steps():做帧动画的利器
animation-timing-function: steps(8);
steps 常用于:
- 雪碧图动画
- loading 帧切换
- 行走人物动画
steps 的本质是:
把连续动画拆成离散帧。
四、CSS3 的 3D 转换基础
1. 三维坐标系理解
CSS3 的 3D 世界基于三根轴:
- X 轴:水平向右
- Y 轴:垂直向下
- Z 轴:垂直屏幕方向
没有 Z 轴,就没有真正的 3D。
2. perspective:3D 的前提条件
.parent {
perspective: 1000px;
}
perspective 的理解:
- 表示“眼睛”到屏幕的距离
- 数值越小,立体感越强
- 一定要写在父元素上
如果没有 perspective,translateZ 和 3D 旋转看起来不会有任何效果。
3. translateZ:远近变化的来源
transform: translateZ(100px);
规律很简单:
- 正值:元素向屏幕外靠近,看起来更大
- 负值:元素远离屏幕,看起来更小
4. 3D 旋转与左手法则
transform: rotateX(45deg);
transform: rotateY(45deg);
判断旋转方向时,可以用左手法则:
- 大拇指指向轴的正方向
- 四指弯曲方向就是正值旋转方向
5. transform-style:是否真正进入 3D 空间
.parent {
transform-style: preserve-3d;
}
这个属性决定:
子元素是否保持 3D 效果。
如果不写,所有子元素会被“压扁”到 2D 平面。
五、实际开发中的常见组合
一些非常实用的组合思路:
- 居中动画:absolute + translate(-50%, -50%)
- 悬浮反馈:transform + transition
- 翻转卡片:rotateY + preserve-3d
- 轮播木马:rotateY + translateZ + animation
- 性能优化:动画优先使用 transform,而不是 top / left
六、关于浏览器兼容性
目前主流浏览器对 CSS3 支持已经非常完善:
- transform
- animation
- 3D 转换
实际项目中不需要手写私有前缀,一般交给构建工具(如 Autoprefixer)即可。
总结
CSS3 的 2D、3D 和动画并不复杂,真正的难点在于:
- 对空间的理解
- 对执行顺序的理解
- 对组合效果的理解
当你能在脑子里“看到元素是怎么动的”,这些属性自然就用顺了。