我以为我对 SVG 有相当的了解,包括viewport、viewBox和用户坐标系。
在下面的第一个示例中,我们使用与viewport具有相同纵横比的viewBox。正如预期的那样,用户坐标系旋转不会扭曲任何角度。
在示例二中,与viewport相比,我们将viewbox设置为不同的纵横比。换句话说,当将viewBox映射到viewport时,不会保持形状的纵横比。右下角不会因这种缩放而失真,这是有道理的,因为坐标系原点位于 (0,0)。
然而,当我们在示例二中旋转用户坐标系时,右下角会发生扭曲。这在示例一中不会发生。
编辑1:为了清楚起见,问题在于上一个示例中的右下角。在旋转之前,但在使用viewBox拉伸之后,角度为 90%。然而,旋转后,它不再是 90%。
为什么非均匀缩放的三角形在旋转时会失去角度?
示例一(统一比例)
body {
height: 500px;
}
svg {
width: 400px;
height: 400px;
border: 1px solid red;
}
<svg id="s1" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 200 200" preserveAspectRatio="none">
<style>
polygon {
transform: translate(100px, 0px);
animation: 2s ease-in 1s 1 normal forwards rotate-down;
fill: green;
}
@keyframes rotate-down {
0% {
transform: translate(100px, 0px) rotate(0deg);
}
100% {
transform: translate(100px, 0px) rotate(45deg);
}
}
</style>
<polygon points="100,100 100,0 0,100" />
</svg>
示例二(非统一比例)
body {
height: 500px;
}
svg {
width: 600px;
height: 400px;
border: 1px solid red;
}
<svg id="s1" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 200 400" preserveAspectRatio="none">
<style>
polygon {
transform: translate(100px, 0px);
animation: 2s ease-in 1s 1 normal forwards rotate-down;
fill: green;
}
@keyframes rotate-down {
0% {
transform: translate(100px, 0px) rotate(0deg);
}
100% {
transform: translate(100px, 0px) rotate(45deg);
}
}
</style>
<polygon points="100,100 100,0 0,100" />
</svg>
编辑2(图片澄清):
下面我们看到添加 viewBox之后的三角形(因此缩放和平移),但在旋转之前。右下角为 90 度。
下面我们看到viewBox 添加(因此缩放和平移)和旋转后的三角形。右下角不再是 90 度。
编辑 3:
我最终明白了这一点。
以下是解释详细信息并链接到相关资源的答案。