我以为我对SVG有相当不错的了解,包括viewport、viewBox和用户坐标系。
在下面的第一个示例中,我们使用与viewport相同宽高比的viewBox。正如预期的那样,用户坐标系的旋转不会扭曲任何角度。
在第二个示例中,我们将viewBox设置为与viewport不同的宽高比。换句话说,在将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:
我最终得出了结论。
以下是一个解释详细信息并链接相关资源的答案。
preserveAspectRatio
的作用,以及如何在当前用户坐标系(UCS)中使用viewBox
属性来缩放图形。这不是我的困惑所在。我原以为是先应用视口框,然后将其他变换应用于由视口框创建的修改后的UCS副本。我已经多次阅读了规范的这部分内容,因此我的理解也来自此处。 - Magnus