CSS Handbook · 变换与动画

第八章 / 8.1 transform 详解

第八章 · 8.1 节

transform 详解


transform 允许对元素进行平移、缩放、旋转、倾斜,且这些变化不会影响文档流——周围元素不会因为一个元素被旋转或缩放而重新排布,这也是它区别于 width/margin 等布局属性的关键特性。

2D 变换函数

函数作用示例
translate()位移translate(20px, -10px)
scale()缩放,1 为原始大小scale(1.1)
rotate()旋转rotate(15deg)
skew()倾斜skew(10deg, 0)
悬停查看效果(若为静态截图请脑补:鼠标悬停时卡片上浮并轻微放大)
translateY
rotate
scale
.btn { transition: transform .2s ease; }
.btn:hover { transform: translateY(-2px); }

transform-origin:变换基准点

所有变换都围绕一个"基准点"进行,默认是元素中心 50% 50%。修改基准点能显著改变旋转、缩放的观感——比如把基准点移到左上角,旋转就会表现为"以左上角为轴心甩开",而不是原地打转。

.flip-card {
  transform-origin: left center;
  transform: rotateY(20deg);
}

组合多个变换

多个变换函数写在同一个 transform 声明里,用空格分隔,从左到右依次生效——调换顺序会得到不同结果,这是初学者最容易踩的坑。

/* 先平移再旋转:整体绕新位置旋转 */
.a { transform: translate(40px, 0) rotate(45deg); }

/* 先旋转再平移:平移方向也跟着旋转了 */
.b { transform: rotate(45deg) translate(40px, 0); }
心智模型把每个变换函数想象成对"坐标系本身"的操作而非对元素的操作:先执行的函数会重新定义后续函数所处的坐标系,因此顺序调换后结果不同。

3D 变换初步

在父元素上开启 perspective,子元素才能表现出真正的透视深度效果,否则 rotateX / rotateY 只会呈现为扁平的拉伸。

.scene { perspective: 800px; }
.card {
  transform: rotateY(25deg);
  transform-style: preserve-3d;
}

transform-style: preserve-3d 让子元素的 3D 变换保留在同一个三维空间中,而不是被父元素"拍扁",这是制作立体翻转卡片一类效果的关键声明。

为什么 transform 性能更好

修改 widthtop 这类布局属性会触发浏览器重新计算页面布局(reflow),代价较高;而 transformopacity 通常可以直接交由 GPU 合成层处理,跳过布局与绘制阶段。这也是为什么几乎所有动效场景都建议优先用 transform: translate() 代替 left/top 位移元素。