CSS转换顺序的混乱



全部:

当我尝试CSS转换时,一些关于缩放和翻译顺序的东西让我感到困惑:

<svg>
<rect x="10" y="10" width="20" height="30" style="stroke: #3333cc; fill:none;"/>
<rect x="0" y="0" width="20" height="30" style="stroke: #000000; fill:none;" transform="scale(2) translate(10, 10)"/>
</svg>

<svg>
<rect x="10" y="10" width="20" height="30" style="stroke: #3333cc; fill:none;"/>
<rect x="0" y="0" width="20" height="30" style="stroke: #000000; fill:none;" transform="translate(10, 10) scale(2)"/>
</svg>

这两者产生了不同的效果。有人能给我解释一下CSS转换是如何处理和呈现的吗?

感谢

来自W3C

x="当前用户坐标系中x轴坐标值较小的矩形边的x轴坐标。

和Mozilla开发者网络:

此属性表示用户坐标中的x轴坐标系统此坐标的确切效果取决于每个元素

它们看起来不一样的原因是缩放元素也会缩放用户坐标系。

我又添加了两个SVG元素,这样我们就可以看到它只应用了第一个转换后的样子

<svg>
<rect x="10" y="10" width="20" height="30" style="stroke: #3333cc; fill:none;"/>
<rect x="0" y="0" width="20" height="30" style="stroke: #000000; fill:none;" transform="scale(2)"/>
</svg>
<svg>
<rect x="10" y="10" width="20" height="30" style="stroke: #3333cc; fill:none;"/>
<rect x="0" y="0" width="20" height="30" style="stroke: #000000; fill:none;" transform="scale(2) translate(10, 10)"/>
</svg>
<svg>
<rect x="10" y="10" width="20" height="30" style="stroke: #3333cc; fill:none;"/>
<rect x="0" y="0" width="20" height="30" style="stroke: #000000; fill:none;" transform="translate(10, 10)"/>
</svg>
<svg>
<rect x="10" y="10" width="20" height="30" style="stroke: #3333cc; fill:none;"/>
<rect x="0" y="0" width="20" height="30" style="stroke: #000000; fill:none;" transform="translate(10, 10) scale(2)"/>
</svg>

在第一个中,首先应用比例。现在矩形和用户坐标系都是紫色矩形的2倍大。因此,当它移动到10,10时,它与紫色矩形的位置不同。

在第二种情况下,先移动rect。它与紫色矩形有相同的坐标系,所以它最终位于完全相同的位置。它是然后缩放的,所以它的左上角保持在同一位置。

每个像scale、translate这样的变换函数都表示一个矩阵。矩阵连接/乘法是不可交换的。所以M1 x M2一定不等于M2 x M1。

例如,缩放矩阵(列主要顺序)、缩放(2,2):

m11=2.000   m21=0.000   m31=0.000
m12=0.000   m22=2.000   m32=0.000
m13=0.000   m23=0.000   m33=1.000

例如,转换矩阵,translate(10,10):

m11=1.000   m21=0.000   m31=10.000
m12=0.000   m22=1.000   m32=10.000
m13=0.000   m23=0.000   m33=1.000

缩放*转换:

m11=2.000   m21=0.000   m31=20.000
m12=0.000   m22=2.000   m32=20.000
m13=0.000   m23=0.000   m33=1.000

翻译*比例:

m11=2.000   m21=0.000   m31=10.000
m12=0.000   m22=2.000   m32=10.000
m13=0.000   m23=0.000   m33=1.000

最新更新