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 = 360degrad:弧度,2π rad = 360deggrad:梯度,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 top | 0% 0% |
| 上中 | center top | 50% 0% |
| 右上 | right top | 100% 0% |
| 左中 | left center | 0% 50% |
| 中心 | center center | 50% 50% |
| 右中 | right center | 100% 50% |
| 左下 | left bottom | 0% 100% |
| 下中 | center bottom | 50% 100% |
| 右下 | right bottom | 100% 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”的顺序书写,符合大多数场景的直觉:
- 先
translate定位(在原始坐标系移动) - 再
rotate旋转(在新位置旋转) - 最后
scale缩放(旋转后缩放)
本工具按”平移→旋转→缩放→倾斜”的固定顺序生成代码。
性能优化与 GPU 加速
transform 是 CSS 中性能最优的动画属性之一,原因:
1. 不触发重排(reflow):
transform 不会改变元素的布局位置,浏览器只需重新合成图层,无需重新计算文档流。相比之下,修改 top、left、width、height 会触发重排,性能开销大。
2. GPU 加速:
浏览器会将 transform 和 opacity 提升到独立的合成层,由 GPU 处理。这使得动画在独立线程运行,不阻塞主线程。
3. 合成层优化:
/* 提示浏览器提前创建合成层 */
.will-animate {
will-change: transform;
}
will-change: transform 告诉浏览器该元素即将变换,浏览器会提前为其创建合成层,避免动画开始时的性能抖动。
4. 动画属性优先级: 性能从优到劣:
- 最优:
transform、opacity(合成层属性) - 次优:
color、background-color(重绘属性) - 最差:
top、left、width、height、margin、padding(重排属性)
5. 3D 变换强制 GPU:
/* 强制启用 GPU 加速(hack) */
transform: translateZ(0);
/* 或 */
transform: translate3d(0, 0, 0);
这种 hack 在旧版浏览器中用于强制启用 GPU 加速。现代浏览器已自动优化,无需手动 hack。
性能底线:正常使用 transform 动画完全无性能问题。避免:
- 同时动画数百个元素(即使是 transform 也会卡顿)
- 滥用
will-change(每个元素都加反而拖慢性能) - 在动画中频繁切换
display(会触发重排)
应用场景与配套工具协同
transform 在前端开发中有广泛应用:
动画场景:
- 卡片悬浮:
transform: translateY(-2px)配合box-shadow增强阴影 - 按钮点击:
transform: scale(0.95)模拟按下效果 - 图标旋转:
transform: rotate(180deg)展开折叠图标 - 入场动画:
transform: translateX(-100%) → translateX(0)滑入效果 - 视差滚动:根据滚动位置动态调整
translateY
布局场景:
- 居中弹窗:
position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%) - 镜像图标:
transform: scaleX(-1)复用现有图标 - 斜切标签:
transform: skew(-10deg)制作动感标签
与设计工具链协同:
- CSS 盒阴影生成器:transform + box-shadow 是卡片悬浮动画的标配
- CSS 渐变生成器:transform + gradient 实现动感背景
- CSS border-radius 生成器:transform + border-radius 制作圆形旋转动画
- CSS 文字阴影生成器:transform + text-shadow 实现立体文字效果
设计系统建议:建立统一的动画规范(如 fast=150ms、normal=250ms、slow=400ms),配合 cubic-bezier 缓动函数与 transform,可在整个项目中保持动画一致性。