看起来在问题被提出两年后回答问题有点愚蠢,但为了保存记录还是发布一下。
与变换矩阵和矩阵向量乘法有关。基本上,除非数学计算得出的乘积中Z坐标大于零,否则变换看起来不会生效。
这很容易解释,但如果您没有数学背景,可能有点难理解。(但是通过一个周末的维基百科阅读和谷歌搜索,就足以教您足够的知识了。我就是这样学习的。)除了matrix()和matrix3d()之外的每个变换函数都有一个相应的矩阵值。对于scale3d,该矩阵如下:
[sx 0 0 0]
[0 sy 0 0]
[0 0 sz 0]
[0 0 0 1]
sx,sy和sz分别是绕x轴、y轴和z轴缩放的因子。对于scaleZ,情况相同,但sx和sy均为1。
应用变换时,浏览器获取对象每个顶点的坐标(通俗地说,就是获取盒子角的坐标),并将其乘以变换矩阵。这个乘积成为对象的新坐标。例如,在从(100, 50, 0)开始的对象上应用 transform: scaleZ(3)
变换的数学计算看起来有点像这样:
[1 0 0 0] [100] [100]
[0 1 0 0] * [ 50] = [ 50]
[0 0 3 0] [ 0] [ 0]
[0 0 0 1] [ 1] [ 1]
当将该产品 [100 50 0 1] 转换为3D坐标系时,它变为我们最初的样子:(100,50,0)。结果看起来好像应用的转换没有生效。要使使用 scaleZ() 的变换生效,矩阵和向量的乘积的第三个数必须大于零。通常情况下,当在父元素上应用 scaleZ() 或 scale3d(),或者与另一个变换函数组合使用时,会发生这种情况。在这两种情况下,累计/当前变换矩阵的结果会产生一个 Z 坐标,其值大于零。下面是一个示例,使用 transform: rotateY(30deg) scaleZ(3)
。首先需要将 rotateY(30deg)
的矩阵乘以 scaleZ(3)
的矩阵。
[0.866 0 -0.499 0] [1 0 0 0] [0.866 0 -1.497 0]
[0 1 0 0] * [0 1 0 0] = [0 1 0 0]
[0.499 0 0.866 0] [0 0 3 0] [0.499 0 2.598 0]
[0 0 0 1] [0 0 0 1] [0 0 0 0]
然后,我们可以将矩阵乘积(等号右侧的那一部分)与点(100,50,0)相乘。
[0.866 0 -1.497 0] [100] [86.6]
[0 1 0 0] * [ 50] = [50 ]
[0.499 0 2.598 0] [ 0] [49.9]
[0 0 0 1] [ 1] [ 1 ]
我们的产品[86.6 50 49.9 1]四舍五入成为整数后对应坐标为(87,50,50),其中第二个50是我们的Z坐标。这种转换有明显的效果。