transform: matrix() & matrix3d()
2D 图形的坐标
笛卡尔坐标系
原点 (0, 0) 在元素的左上角,每一个点由向量 (x, y) 标记。
进行变换的时候,对每个点做矩阵乘法:
$$ \left\lgroup \matrix{a & c\cr b & d} \right\rgroup \left\lgroup \matrix{x \cr y} \right\rgroup = \left\lgroup \matrix{ax + cy\cr bx + dy} \right\rgroup $$
可以在一行中应用多次变换:
$$ \left\lgroup \matrix{a_1 & c_1\cr b_1 & d_1} \right\rgroup \left\lgroup \matrix{a_2 & c_2\cr b_2 & d_2} \right\rgroup = \left\lgroup \matrix{a_1a_2 + c_1b_2 & a_1c_2 + c_1d_2\cr b_1a_2 + d_1b_2 & b_1c_2 + d_1d_2} \right\rgroup $$
使用这种标记可以描述多种常用的变换:旋转、缩放、倾斜。事实上所有这些变换都是线性函数可以描述的。使用这种标记时有一种非线性的变换需要当做特例,就是平移。平移向量 (tx, ty) 必须作为两个附加的参数来表述。
函数定义的变换 matrix()
语法
matrix(a, b, c, d, tx, ty)
- a, b, c, d 描述线性变换的数字
- tx, ty 描述平移的数字
示例
.pane {
background: green;
width: 200px;
height: 200px;
}
.box {
float: left;
background: blue;
width: 50px;
height: 50px;
transform-origin: 0 0;
}
.more {
float: left;
width: 50px;
height: 50px;
background: red;
}
上下左右各平移 4px
.box {
transform: matrix(1, 0, 0, 1, 4, 4);
}
放大两倍
.box {
transform: matrix(2, 0, 0, 2, 0, 0);
}
旋转
.box {
transform: matrix(2, 1, -1, 2, 0, 0);
}
Tip: 为什么平移不是线性变换?
一个线性变换 f,会使 f(x + y) = f(x) + f(y) 成立
而平移:y = ax + b