在前端可视化开发中,CSS transform 是实现元素动效、图形变换的核心属性。我们常用的 translate、rotate、scale、skew 等方法,本质上都是浏览器对「矩阵运算」的封装。而直接使用 matrix/matrix3d 矩阵,不仅能解锁更灵活的自定义变换效果,更能帮我们看透变换的底层逻辑。本文将从 2D 矩阵核心、参数解析、实战应用到 3D 进阶,全面拆解 transform 矩阵的用法与原理。
一、核心基础:2D 变换矩阵 matrix(a,b,c,d,e,f)
CSS 中的 matrix(a,b,c,d,e,f) 是对「2D 齐次矩阵」的简化封装。数学上,2D 图形变换需依赖 3×3 齐次矩阵(目的是让平移操作可通过矩阵乘法实现),而 matrix 的 6 个参数,恰好对应该矩阵的前 2 行,第三行固定为 [0,0,1],无需开发者手动设置。
1. 矩阵与参数的数学对应关系
CSS 矩阵与数学矩阵的映射关系如下,清晰揭示了参数的底层逻辑:
CSS matrix(a,b,c,d,e,f) ↔
\begin{bmatrix} a & c & e \\ % 第一行:控制X轴方向变换 b & d & f \\ % 第二行:控制Y轴方向变换 0 & 0 & 1 % 第三行:齐次坐标固定项 \end{bmatrix}
2. 参数的通俗解析(附计算公式)
元素上任意一点 (x, y)(相对于元素自身坐标系),经矩阵变换后的新坐标 (x', y') 由以下公式计算:
<math xmlns="http://www.w3.org/1998/Math/MathML"> x ′ = a × x + c × y + e x' = a \times x + c \times y + e </math>x′=a×x+c×y+e
<math xmlns="http://www.w3.org/1998/Math/MathML"> y ′ = b × x + d × y + f y' = b \times x + d \times y + f </math>y′=b×x+d×y+f
基于公式,6 个参数的作用可精准拆解,结合场景更易理解:
| 参数 | 核心作用 | 通俗解释与示例 |
|---|---|---|
| a | X轴缩放 + 旋转关联 | 纯缩放:a=2 表示X轴放大2倍;旋转时与 cosθ(θ为旋转角度)联动 |
| b | Y轴倾斜 + 旋转关联 | 纯倾斜:b=0.5 表示Y轴向X轴倾斜;旋转时与 sinθ 联动 |
| c | X轴倾斜 + 旋转关联 | 纯倾斜:c=0.5 表示X轴向Y轴倾斜;旋转时与 -sinθ 联动 |
| d | Y轴缩放 + 旋转关联 | 纯缩放:d=2 表示Y轴放大2倍;旋转时与 cosθ 联动 |
| e | X轴平移(像素/百分比) | 纯平移:e=50 表示元素向右平移50px,不受缩放、旋转影响 |
| f | Y轴平移(像素/百分比) | 纯平移:f=50 表示元素向下平移50px |
3. 基准态:单位矩阵
当矩阵为 matrix(1,0,0,1,0,0) 时,代入公式可得 x'=x、y'=y,元素无任何变换。这是所有变换的基准态,任何复杂变换都是基于单位矩阵修改参数实现的。
二、实战:基础变换的矩阵实现
所有基础变换(平移、缩放、倾斜、旋转)都是矩阵的特例,我们可通过矩阵还原基础变换的底层逻辑,也可直接用矩阵实现等价效果。
1. 纯平移:仅修改 e/f 参数
需求:元素向右平移50px、向下平移30px,等价于 translate(50px, 30px)。
css
.box {
transform: matrix(1, 0, 0, 1, 50, 30); /* 单位矩阵基础上修改e、f */
}
2. 纯缩放:仅修改 a/d 参数
需求:X轴放大1.5倍、Y轴缩小0.8倍,等价于 scale(1.5, 0.8)。
css
.box {
transform: matrix(1.5, 0, 0, 0.8, 0, 0);
}
3. 纯倾斜:修改 b 或 c 参数
需求:X轴向Y轴倾斜30°(倾斜角度φ满足 tanφ = c,tan30°≈0.577),等价于 skewX(30deg)。
css
.box {
transform: matrix(1, 0, 0.577, 1, 0, 0);
}
4. 纯旋转:a/b/c/d 联动
旋转θ角的矩阵公式为:matrix(cosθ, sinθ, -sinθ, cosθ, 0, 0)。需求:元素顺时针旋转30°(cos30°≈0.866,sin30°=0.5),等价于 rotate(30deg)。
css
.box {
transform: matrix(0.866, 0.5, -0.5, 0.866, 0, 0);
}
5. 复合变换:多规则叠加(核心易错点)
矩阵乘法不满足交换律,变换顺序直接影响结果。浏览器处理多个 transform 函数时,会从右到左应用矩阵。
需求:先缩放1.2倍 → 再旋转30° → 最后X轴平移50px。
css
/* 方法1:基础函数组合(浏览器自动转矩阵) */
.box {
transform: translate(50px) rotate(30deg) scale(1.2);
}
/* 方法2:手动计算复合矩阵(结果等价) */
.box {
transform: matrix(1.039, 0.598, -0.598, 1.039, 50, 0);
}
注意:translate(50px) rotate(30deg) 与 rotate(30deg) translate(50px) 效果完全不同------前者平移的是旋转后的坐标系,后者平移的是原始坐标系。
6. 自定义非线性变换:矩阵的独特价值
基础变换组合无法实现的复杂效果,可通过矩阵直接定义。例如:X轴缩放1.5倍 + Y轴倾斜0.3 + 右移20px。
css
.box {
width: 100px;
height: 100px;
background: red;
transform: matrix(1.5, 0.3, 0, 1, 20, 0);
}
三、进阶:3D 变换矩阵 matrix3d()
3D 变换依赖 4×4 齐次矩阵,matrix3d() 接收16个参数,对应矩阵的「列优先」排列(新手最易出错的点,与直观的行优先相反)。
1. 矩阵结构与参数规则
matrix3d(m11,m12,m13,m14, m21,m22,m23,m24, m31,m32,m33,m34, m41,m42,m43,m44) 对应矩阵:
<math xmlns="http://www.w3.org/1998/Math/MathML"> [ m 11 m 21 m 31 m 41 m 12 m 22 m 32 m 42 m 13 m 23 m 33 m 43 m 14 m 24 m 34 m 44 ] \begin{bmatrix} m11 & m21 & m31 & m41 \\ m12 & m22 & m32 & m42 \\ m13 & m23 & m33 & m43 \\ m14 & m24 & m34 & m44 \\ \end{bmatrix} </math> m11m12m13m14m21m22m23m24m31m32m33m34m41m42m43m44
2. 常用 3D 变换的简化矩阵
无需记忆全部16个参数,核心场景可简化:
- 纯3D平移:
matrix3d(1,0,0,0, 0,1,0,0, 0,0,1,0, x,y,z,1)→ 等价于translate3d(x,y,z) - 纯3D缩放:
matrix3d(sx,0,0,0, 0,sy,0,0, 0,0,sz,0, 0,0,0,1)→ 等价于scale3d(sx,sy,sz) - 绕X轴旋转:
matrix3d(1,0,0,0, 0,cosθ,-sinθ,0, 0,sinθ,cosθ,0, 0,0,0,1)→ 等价于rotateX(θ)
3. 实战:3D卡片翻转
css
.card {
width: 200px;
height: 200px;
transition: transform 0.5s;
}
.card:hover {
/* 绕Y轴旋转180° + Z轴平移10px(突出效果) */
transform: matrix3d(
-1,0,0,0, /* 第一列:cos180°=-1 */
0,1,0,0, /* 第二列:Y轴无旋转 */
0,0,1,0, /* 第三列:Z轴无旋转 */
0,0,10,1 /* 第四列:Z轴平移10px */
);
/* 等价于 transform: rotateY(180deg) translateZ(10px) */
}
四、关键补充:transform-origin 的影响
transform-origin 定义「变换原点」,默认值为元素中心 50% 50%,它会改变矩阵变换的坐标系原点:
- 旋转、缩放时,原点决定了变换的中心点(如
transform-origin: 0 0表示绕左上角变换); - 矩阵中的
e/f(平移参数)是相对于变换原点的,而非元素左上角。
css
.box {
width: 100px;
height: 100px;
transform-origin: 0 0; /* 变换原点设为左上角 */
transform: matrix(0.866, 0.5, -0.5, 0.866, 0, 0); /* 绕左上角旋转30° */
}
五、验证矩阵正确性的方法
借助浏览器开发者工具可快速验证矩阵计算结果:
- 打开 Chrome/Firefox 开发者工具,选中目标元素;
- 切换到「Computed」面板,找到
transform属性; - 面板会显示浏览器解析后的矩阵值,可与手动计算结果对比验证。
六、总结
CSS transform 矩阵是前端可视化的底层核心,其本质是通过结构化参数封装线性变换规则:
- 2D 矩阵
matrix(a,b,c,d,e,f)对应 3×3 齐次矩阵,核心公式决定了参数对坐标的影响,基础变换是矩阵的特例; - 矩阵乘法无交换律,变换顺序直接影响结果,浏览器按「右到左」顺序解析多个变换函数;
matrix可实现基础变换组合无法达成的自定义效果,matrix3d则适配 3D 场景;transform-origin影响变换坐标系,是调试矩阵效果的关键细节。
掌握矩阵不仅能帮我们看透 transform 的底层逻辑,更能解锁前端动效与可视化的无限可能,从容应对复杂变换需求。