围绕其中心旋转可缩放且平移的 SVG 元素

JMc*_*Far 3 svg

我正在尝试旋转 SVG 内的路径。

因为 SVG 中的旋转工作方式与通过 CSS 处理其他 html 元素的工作方式不同(即 SVG 中的默认轴是元素的左上角而不是中心),所以我遇到了很多问题。

我需要使用中心点作为轴来旋转路径。我可以通过将变换原点设置为 50% 50% 来做到这一点,但是我还需要平移和缩放路径,并且更改变换原点会捏造翻译。

假装路径是静态大小,我可以通过将 x/y 作为路径宽度/高度的一半包含在“旋转(90,x,y)”中来实现。但是,SVG 会自动缩放以适应窗口大小,因此路径的宽度/高度是动态的。(即,如果我在给定的尺寸下正确设置旋转轴的位置,随着窗口尺寸的变化,它会越来越不正确地扭曲。我没有找到使用百分比来做到这一点的方法 - 请告诉我,如果您知道一个方法!)

我想我可能错过了一些非常简单的东西,但我自己一直在努力解决它。如何使用它们的中心作为轴来旋转这些路径(具有平移的动态大小路径)?

(我还尝试将一些变换应用于父元素,但这只会导致路径剪切)

基本问题:

    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2000 2000">
        <g>
        <path class="A" transform="translate(1000 1000) rotate(0) scale(20)" d="m23.5,2 16.5,14.3-16.5,14.3v-6.8h-15v-15h15v-6.8z" d="m23.5,2 16.5,14.3-16.5,14.3v-6.8h-15v-15h15v-6.8z"/>
        <path class="B" transform="translate(1000 1000) rotate(45) scale(20)" d="m23.5,2 16.5,14.3-16.5,14.3v-6.8h-15v-15h15v-6.8z" d="m23.5,2 16.5,14.3-16.5,14.3v-6.8h-15v-15h15v-6.8z"/>
        <path class="C" transform="translate(1000 1000) rotate(90) scale(20)" d="m23.5,2 16.5,14.3-16.5,14.3v-6.8h-15v-15h15v-6.8z" d="m23.5,2 16.5,14.3-16.5,14.3v-6.8h-15v-15h15v-6.8z"/>
        </g>
    </svg>
Run Code Online (Sandbox Code Playgroud)

我无法让 A、B 和 C 的中心共享一个 x/y 坐标,同时保持它们的平移和响应能力。

谢谢

Mic*_*any 5

最简单的方法是在原点绘制原始形状,然后旋转它们,缩放它们,然后将它们移动到您想要的最终位置。因此,将初始相对 m 更改为绝对 M 并移动初始绘图点,使箭头中心与原点重合。(您需要添加“l”以将路径的其余部分切换回相对绘制。)

变换以相反的顺序应用,因此您希望最后旋转(最先应用),最先应用平移(最后应用)。

(我添加了填充不透明度,以便您可以更好地看到发生的情况)

<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 2000 2000">
        <g>
        <path class="A" transform="translate(1000 1000) scale(20) rotate(0)"  d="M 0.75,-14.3 l16.5,14.3-16.5,14.3v-6.8h-15v-15h15v-6.8z" fill-opacity="0.5"/>
        <path class="B" transform="translate(1000 1000) scale(20) rotate(45)" d="M 0.75,-14.3 l16.5,14.3-16.5,14.3v-6.8h-15v-15h15v-6.8z" fill-opacity="0.5"/>
        <path class="C" transform="translate(1000 1000) scale(20) rotate(90)" d="M 0.75,-14.3 l16.5,14.3-16.5,14.3v-6.8h-15v-15h15v-6.8z" fill-opacity="0.5"/>
        </g>
    </svg>
Run Code Online (Sandbox Code Playgroud)