我已经解决了这个问题,但我(到目前为止)无法给你一个全面的推理为什么它有效。
首先要知道的是,您可以链接 SVG 变换。
因此,无论您在何处编写transform="scale(2)"
,都可以将 a 添加translate(x, y)
到链中,如下所示:
transform="scale(2) translate(x, y)"
到目前为止,一切都很好......但如果scale
是2
,那么我们应该赋予x
和什么y
值translate
?
为了找出答案,我决定叠加更大和更小的 SVG 形状版本(彩虹的每种颜色一个),看看我能找到什么模式。
在你的灰色形状的顶部,我放置了一个相同大小的绿色形状。
我给绿色形状做了一个变换:
transform="scale(1) translate(0, 0)"
这样它就会与你原来的灰色形状完全一致。
然后我开始叠加较大的缩放版本(黄色、橙色、红色)并叠加较小的缩放版本(蓝色、靛蓝、紫罗兰色)。
我预测,x
并且y
在每种情况下都将与scale
应用于该形状的因素以及原件的整体尺寸有关viewBox
。
有了 3 个较小的版本和 3 个较大的版本,模式就出现了:
- 红色,
8
倍大 / x
&y
变换值是50% of ((1000 / 8) - 1000)
- 橙色,
4
倍大 / x
&y
变换值是50% of ((1000 / 4) - 1000)
- 黄色,
2
倍大 / x
&y
变换值是50% of ((1000 / 2) - 1000)
- 绿色,
1
倍大 / x
&y
变换值是50% of ((1000 / 1) - 1000)
- 蓝色,
0.5
倍大 / x
&y
变换值是50% of ((1000 / 0.5) - 1000)
- Indigo,
0.25
倍大 / x
&y
变换值是50% of ((1000 / 0.25) - 1000)
- 紫罗兰色,
0.125
倍大 / x
&y
变换值是50% of ((1000 / 0.125) - 1000)
由此,我们可以得出结论,如果您定位一个以50%, 50%
您为中心的形状,viewBox
并且您希望在同一位置显示该形状scale(2)
,您还必须应用translate
for x
of:
50% of ((width of canvas / scale-factor) - (width of canvas))
where50%
对应于x
您想要将形状居中的位置。
和一个translate
:y
50% of ((height of canvas / scale-factor) - (height of canvas))
where50%
对应于y
您想要将形状居中的位置。
这一直有效,但我还没有花足够的时间盯着它,以正确理解原因。
工作示例:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000">
<!-- Grey Original -->
<path fill="#555" d="M500 500 400 400 400 600 600 600 600 400z" />
<!-- Red Transform [50% of ((1000 / 8) - 1000) is -437.5] -->
<path fill="rgb(255, 0, 0)" d="M500 500 400 400 400 600 600 600 600 400z" transform="scale(8) translate(-437.5, -437.5)" />
<!-- Orange Transform [50% of ((1000 / 4) - 1000) is -375] -->
<path fill="rgb(255, 125, 0)" d="M500 500 400 400 400 600 600 600 600 400z" transform="scale(4) translate(-375, -375)" />
<!-- Yellow Transform [50% of ((1000 / 2) - 1000) is -250] -->
<path fill="rgb(255, 255, 0)" d="M500 500 400 400 400 600 600 600 600 400z" transform="scale(2) translate(-250, -250)" />
<!-- Green Transform [50% of ((1000 / 1) - 1000) is 0] -->
<path fill="rgb(0, 125, 0)" d="M500 500 400 400 400 600 600 600 600 400z" transform="scale(1) translate(0, 0)" />
<!-- Blue Transform [50% of ((1000 / 0.5) - 1000) is 500] -->
<path fill="rgb(0, 0, 125)" d="M500 500 400 400 400 600 600 600 600 400z" transform="scale(0.5) translate(500, 500)" />
<!-- Indigo Transform [50% of ((1000 / 0.25) - 1000) is 1500] -->
<path fill="rgb(63, 0, 255)" d="M500 500 400 400 400 600 600 600 600 400z" transform="scale(0.25) translate(1500, 1500)" />
<!-- Violet Transform [50% of ((1000 / 0.125) - 1000) is 3500] -->
<path fill="rgb(199, 125, 243)" d="M500 500 400 400 400 600 600 600 600 400z" transform="scale(0.125) translate(3500, 3500)" />
</svg>