围绕长轴旋转 SVG 省略号路径

Rotating SVG ellipsis paths around the longer axis

所以我 this 徽标是用 SVG 写的。

我正在尝试围绕它们的长轴旋转分组椭圆,以创建 3D 旋转的错觉。

    .svg-spinner3 {
    -webkit-animation: rotation 2s infinite linear;
    -moz-animation: rotation 2s infinite linear;
    -o-animation: rotation 2s infinite linear;
    animation: rotation 2s infinite linear;
    transform-origin: 50% 50%;
    -webkit-transform-origin: 50% 50%;
    -moz-transform-origin: 50% 50%;
}

围绕中心旋转它们似乎是 easy,但我似乎无法弄清楚如何旋转它们(或者至少 skew/shrink 它们朝向轴旋转,直到它们变成一条线,然后返回)。

是不是太难做了?请记住,我是一个完整的 SVG 新手。

谢谢!

您不能对 SVG 中的元素进行 3D 变换。例如,您不能绕垂直 (Y) 轴旋转。

您需要通过仅在一个方向上缩放椭圆 dosn 来模拟旋转。然后再备份。

我也建议不要使用 transform-origin: 50% 50%。百分比值在浏览器之间的工作方式不同。 Chrome 将按您想要的方式运行,但该方式实际上与规范相反。使用绝对坐标作为旋转中心。对于您的形状,(50%, 50%) 的等效值似乎约为 (230.7, 198.4)。

所以我们需要做的是在椭圆的旋转轴上缩放,是: 1.将椭圆旋转到垂直 2. 根据需要放大或缩小 3. 将椭圆旋转回原来的旋转

对于我在下面选择的示例椭圆,我们需要使用的角度是 28 度。所以我们的转换是:

transform: rotate(28deg) scale(0.01, 1) rotate(-28deg);

请注意,不允许按 0 缩放。所以你需要为比例使用一个非常小的值,而不是零。

备注

您的所有形状都具有现有的相同变换 (translate(-152.27, -120.27))。为了使事情不那么复杂,我将所有省略号放在一个父组中,并将公共转换移动到该组。

最后,请注意还有一个问题。当您像这样缩放时,您不仅缩放了椭圆的宽度,还缩放了椭圆线的宽度。当您开始设置动画时,这可能会破坏正确的 3D 旋转效果。

.rotate-and-scale {
  transform-origin: 230.7px 198.4px;
  transform: rotate(28deg) scale(0.01, 1) rotate(-28deg);
}
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="-100 -100 500.47 500.47">
        <defs>
            <style>
                .cls-12,
                .cls-8 {
                    fill-rule: evenodd;
                }

                .cls-8 {
                    fill: url(#radial-gradient-8);
                }

                .cls-12 {
                    fill: url(#radial-gradient-12);
                }

            </style>
            <radialGradient id="radial-gradient" cx="232.26" cy="170.66" r="36.06" gradientTransform="translate(-138.19 -72.22) scale(1.59)"
                gradientUnits="userSpaceOnUse">
                <stop offset="0.35" stop-color="#00aeef" />
                <stop offset="1" stop-color="#00609c" />
            </radialGradient>
            <radialGradient id="radial-gradient-8" cx="232.4" cy="170.47" r="38.82" xlink:href="#radial-gradient" />
            <radialGradient id="radial-gradient-12" cx="231.93" cy="170.21" r="48.97" xlink:href="#radial-gradient" />
        </defs>
        <title>fadsf</title>

        <g transform="translate(-152.27 -120.27)">
        <path class="svg-spinner0 cls-12" d="M175,143a77.74,77.74,0,1,0,55-22.77A77.26,77.26,0,0,0,175,143Zm.67,109.26A76.8,76.8,0,1,1,230,274.78,76.34,76.34,0,0,1,175.7,252.29Z" />

        <path class="svg-spinner2 cls-8" d="M248.31,129c-8.67,2.55-18.08,8.5-27.18,17.22a137.76,137.76,0,0,0-25,33.25c-9.92,18.15-15.7,37.18-16.23,53.57s4.28,28.4,13.57,33.48c5.52,3,12.14,3.42,19.69,1.22,8.68-2.55,18.08-8.49,27.18-17.21a137.87,137.87,0,0,0,25-33.26,138.19,138.19,0,0,0,14.52-39,90.29,90.29,0,0,0,1.76-17,53.88,53.88,0,0,0-2-15.13c-2.21-7.54-6.13-12.9-11.65-15.91S255.85,126.84,248.31,129ZM194,265.73c-18.61-10.18-17.25-48.65,3-85.77a136.86,136.86,0,0,1,24.8-33c9-8.61,18.25-14.48,26.78-17,7.29-2.14,13.68-1.76,19,1.14s9.06,8.06,11.2,15.33c2.51,8.55,2.57,19.51.18,31.72a137.57,137.57,0,0,1-14.41,38.72h0a137.48,137.48,0,0,1-24.8,33c-9,8.6-18.26,14.48-26.79,17C205.63,269,199.25,268.63,194,265.73Zm71.38-48.41Z" />

        <path class="rotate-and-scale" fill="red" d="M248.31,129c-8.67,2.55-18.08,8.5-27.18,17.22a137.76,137.76,0,0,0-25,33.25c-9.92,18.15-15.7,37.18-16.23,53.57s4.28,28.4,13.57,33.48c5.52,3,12.14,3.42,19.69,1.22,8.68-2.55,18.08-8.49,27.18-17.21a137.87,137.87,0,0,0,25-33.26,138.19,138.19,0,0,0,14.52-39,90.29,90.29,0,0,0,1.76-17,53.88,53.88,0,0,0-2-15.13c-2.21-7.54-6.13-12.9-11.65-15.91S255.85,126.84,248.31,129ZM194,265.73c-18.61-10.18-17.25-48.65,3-85.77a136.86,136.86,0,0,1,24.8-33c9-8.61,18.25-14.48,26.78-17,7.29-2.14,13.68-1.76,19,1.14s9.06,8.06,11.2,15.33c2.51,8.55,2.57,19.51.18,31.72a137.57,137.57,0,0,1-14.41,38.72h0a137.48,137.48,0,0,1-24.8,33c-9,8.6-18.26,14.48-26.79,17C205.63,269,199.25,268.63,194,265.73Zm71.38-48.41Z"/>
        </g>
    </svg>

</html>

所以看来我可以只使用 rotate3d 来做我想做的事情。

.svg-spinner3 {
            animation: rotation3 4s infinite linear;
            transform-origin: 50% 50%;
            -webkit-transform-origin: 50% 50%;
            -moz-transform-origin: 50% 50%;
        }

        @-webkit-keyframes rotation3 {
            from {
                -webkit-transform: rotate3d(0, 0, 0, 0deg);
            }
            to {
                -webkit-transform: rotate3d(10, 100, 0, 360deg);
            }
        }

https://jsfiddle.net/t8ozqbdf/2/ 这是解决方案的一部分。