CSS transform 指南:translate/rotate/scale/skew 四种变换

CSS transform 的核心价值

transform 是 CSS 中控制元素 2D / 3D 变换的核心属性,它提供了四种基本 2D 变换:

/* 四种基本变换组合 */
transform: translate(20px, 10px) rotate(15deg) scale(1.2) skew(5deg);

transform 的核心价值在于不触发布局重排——变换后的元素仍占据原始位置,不会影响兄弟元素的布局。这使得 transform 成为动画的首选属性,配合 opacity 可以实现 GPU 加速的流畅动画。

配套工具:CSS transform 可视化工具

translate 平移:px 与 % 的本质差异

translate(tx, ty) 沿 X/Y 轴平移元素,支持 px 和 % 两种单位:

/* px:固定平移距离 */
transform: translate(50px, 30px);

/* %:相对元素自身尺寸 */
transform: translate(50%, 50%);

px 单位:固定像素距离,与元素尺寸无关。50px 平移无论元素多大都向右移动 50 像素。

% 单位:相对于元素自身尺寸计算(注意:不是父元素尺寸)。translate(50%, 0) 向右平移元素自身宽度的 50%。

经典应用:完美居中

.center-modal {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
}

先用 left/top: 50% 将元素左上角放到父元素中心,再用 transform: translate(-50%, -50%) 向左上平移自身宽高的一半,实现完美居中。这种写法无需知道元素确切尺寸,响应式友好。

translate 还支持单轴简写:translateX(20px)translateY(10px) 等效于 translate(20px, 10px) 的对应分量。

rotate 旋转:角度与原点

rotate(deg)transform-origin 为中心旋转元素:

/* 顺时针旋转 45° */
transform: rotate(45deg);

/* 逆时针旋转 90° */
transform: rotate(-90deg);

角度单位

  • deg:度(最常用),360deg = 一圈
  • turn:圈,1turn = 360deg
  • rad:弧度,2π rad = 360deg
  • grad:梯度,400grad = 360deg

旋转方向:正值顺时针,负值逆时针。这与数学中的逆时针为正相反,是因为 CSS 的 Y 轴向下。

transform-origin 的影响

/* 默认:以中心旋转 */
transform-origin: center center;
transform: rotate(45deg);

/* 以左上角为轴心旋转 */
transform-origin: left top;
transform: rotate(45deg);

原点不同,旋转结果完全不同。本工具提供 3x3 共 9 个预设原点位置,可直观看到原点对旋转结果的影响。

scale 缩放:正值放大与负值镜像

scale(sx, sy) 沿 X/Y 轴缩放元素:

/* 放大 1.5 倍 */
transform: scale(1.5);

/* X 轴放大 2 倍,Y 轴缩小 0.5 倍 */
transform: scale(2, 0.5);

数值含义

  • 1:原始尺寸(不缩放)
  • >1:放大(如 1.5 放大 50%)
  • <1 且 >0:缩小(如 0.5 缩小一半)
  • 0:完全压缩为线段(不可见)
  • <0:镜像翻转

负值的妙用

/* 水平镜像(左右翻转) */
transform: scaleX(-1);

/* 垂直镜像(上下翻转) */
transform: scaleY(-1);

/* 旋转 180°(等效于 rotate(180deg)) */
transform: scale(-1, -1);

负值缩放是制作镜像效果的最简洁方式。常见应用:双向箭头图标、对称图案、倒影动画。注意:负值缩放会改变元素的可点击区域位置,需要配合 transform-origin 精确定位。

skew 倾斜:剪切变形

skew(xDeg, yDeg) 沿 X/Y 轴倾斜元素,产生平行四边形效果:

/* 仅 X 轴倾斜 15° */
transform: skewX(15deg);

/* X、Y 轴同时倾斜 */
transform: skew(15deg, 5deg);

skew 与 rotate 的区别

  • rotate:整体旋转,元素形状不变(正方形旋转后是菱形,仍保持四边等长、四角相等)
  • skew:剪切变形,元素形状改变(正方形倾斜后变平行四边形,四边等长但四角不等)

视觉差异

  • rotate 后元素”看起来还是原来那个”,只是方向变了
  • skew 后元素”被压扁拉长”,形状发生根本变化

应用场景

  • skew:斜切文字、平行四边形按钮、动态变形动画
  • rotate:旋转图标、动画转场、3D 翻转

两者可组合:transform: skew(15deg) rotate(10deg) 产生更复杂的变形效果。

transform-origin 变换原点详解

transform-origin 定义变换的参考点,默认是元素中心(50% 50%)。它决定了 rotate 旋转的中心、scale 缩放的中心、skew 倾斜的基准点:

/* 关键字语法 */
transform-origin: left top;
transform-origin: center bottom;
transform-origin: right center;

/* 百分比语法 */
transform-origin: 0% 0%;     /* 等同 left top */
transform-origin: 50% 50%;   /* 等同 center center */
transform-origin: 100% 100%; /* 等同 right bottom */

/* 像素语法 */
transform-origin: 20px 30px;

3x3 网格预设

位置关键字百分比
左上left top0% 0%
上中center top50% 0%
右上right top100% 0%
左中left center0% 50%
中心center center50% 50%
右中right center100% 50%
左下left bottom0% 100%
下中center bottom50% 100%
右下right bottom100% 100%

原点对变换的影响:以 rotate(45deg) 为例:

  • 原点 center:以元素中心旋转,元素在原位置旋转
  • 原点 left top:以左上角为轴心旋转,元素会”甩”到右下方
  • 原点 right bottom:以右下角为轴心旋转,元素会”甩”到左上方

变换顺序与矩阵乘法

transform 的多个变换按从右到左的顺序应用(矩阵乘法不满足交换律),顺序不同结果完全不同:

/* 写法 A:先旋转再平移 */
transform: translate(100px, 0) rotate(45deg);

/* 写法 B:先平移再旋转 */
transform: rotate(45deg) translate(100px, 0);

写法 A:先旋转 45°,再向右平移 100px(沿原始 X 轴方向)。元素会出现在原位置右侧 100px 处,且自身旋转 45°。

写法 B:先向右平移 100px(沿原始 X 轴),再以原点为中心旋转 45°。元素会”甩”到右下方向,因为平移后的位置被旋转了。

理解矩阵乘法:CSS transform 本质是矩阵乘法。多个变换组合时,浏览器计算 M = T1 × T2 × T3,然后将其应用到元素的每个顶点。由于矩阵乘法不满足交换律(A × B ≠ B × A),变换顺序至关重要。

推荐顺序:通常按”translate → rotate → scale”的顺序书写,符合大多数场景的直觉:

  1. translate 定位(在原始坐标系移动)
  2. rotate 旋转(在新位置旋转)
  3. 最后 scale 缩放(旋转后缩放)

本工具按”平移→旋转→缩放→倾斜”的固定顺序生成代码。

性能优化与 GPU 加速

transform 是 CSS 中性能最优的动画属性之一,原因:

1. 不触发重排(reflow)transform 不会改变元素的布局位置,浏览器只需重新合成图层,无需重新计算文档流。相比之下,修改 topleftwidthheight 会触发重排,性能开销大。

2. GPU 加速: 浏览器会将 transformopacity 提升到独立的合成层,由 GPU 处理。这使得动画在独立线程运行,不阻塞主线程。

3. 合成层优化

/* 提示浏览器提前创建合成层 */
.will-animate {
  will-change: transform;
}

will-change: transform 告诉浏览器该元素即将变换,浏览器会提前为其创建合成层,避免动画开始时的性能抖动。

4. 动画属性优先级: 性能从优到劣:

  • 最优:transformopacity(合成层属性)
  • 次优:colorbackground-color(重绘属性)
  • 最差:topleftwidthheightmarginpadding(重排属性)

5. 3D 变换强制 GPU

/* 强制启用 GPU 加速(hack) */
transform: translateZ(0);
/* 或 */
transform: translate3d(0, 0, 0);

这种 hack 在旧版浏览器中用于强制启用 GPU 加速。现代浏览器已自动优化,无需手动 hack。

性能底线:正常使用 transform 动画完全无性能问题。避免:

  1. 同时动画数百个元素(即使是 transform 也会卡顿)
  2. 滥用 will-change(每个元素都加反而拖慢性能)
  3. 在动画中频繁切换 display(会触发重排)

应用场景与配套工具协同

transform 在前端开发中有广泛应用:

动画场景

  1. 卡片悬浮transform: translateY(-2px) 配合 box-shadow 增强阴影
  2. 按钮点击transform: scale(0.95) 模拟按下效果
  3. 图标旋转transform: rotate(180deg) 展开折叠图标
  4. 入场动画transform: translateX(-100%) → translateX(0) 滑入效果
  5. 视差滚动:根据滚动位置动态调整 translateY

布局场景

  1. 居中弹窗position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%)
  2. 镜像图标transform: scaleX(-1) 复用现有图标
  3. 斜切标签transform: skew(-10deg) 制作动感标签

与设计工具链协同

设计系统建议:建立统一的动画规范(如 fast=150ms、normal=250ms、slow=400ms),配合 cubic-bezier 缓动函数与 transform,可在整个项目中保持动画一致性。