操纵svg圆原点以围绕中心创建旋转动画

时间:2019-01-10 20:40:13

标签: reactjs svg styled-components

我在页面上通过两个<circle />绘制了一个加载程序(旋转程序)。需要将两条路径沿原点居中的不同方向旋转,因此,每个圆圈都围绕SVG的中心旋转,并且不能平移。

尝试对其进行动画处理transform: rotate(360deg)。路径无处可寻,起源于其他地方。尝试管理viewBox以获得预期结果,但未成功。

import React, { PureComponent } from 'react';
import styled from 'styled-components';
import { prop } from 'styled-tools';

class Loader extends PureComponent {
  render() {
    return (
      <Spinner
        xmlns="http://www.w3.org/2000/svg"
        width="200"
        height="200"
        preserveAspectRatio="xMidYMid"
        viewBox="0 0 100 100"
      >
        <circle
          className='outer'
          cx="50"
          cy="50"
          r="40"
          fill="none"
          stroke="#374a67"
          stroke-dasharray="63 63"
          stroke-linecap="round"
          stroke-width="4"
        />
        <circle
          className='inner'
          cx="50"
          cy="50"
          r="35"
          fill="none"
          stroke="#d50000"
          stroke-dasharray="55 55"
          stroke-dashoffset="55"
          stroke-linecap="round"
          stroke-width="4"
        />
      </Spinner>
    )
  }
}

const Spinner = styled.svg`
  & .outer {
    animation: rotate 2s linear infinite;
  }

  & .inner {
    animation: reverseRotate 2s linear infinite;
  }

  @keyframes rotate {
    100% {
      transform: rotate(360deg);
    }
  }

  @keyframes reverseRotate {
    100% {
      transform: rotate(-360deg);
    }
  }
`;


export default Loader;

不知道如何用我的代码来制作实际的工作片段

这是我当前动画的一个示例:

Here's an example of my current animation

2 个答案:

答案 0 :(得分:2)

您需要将transform-origin设置在svg的中心。但是,您可能会做不同的事情。除了可以对transform进行动画处理之外,您可以像这样对stroke-dashoffset进行动画处理:

.outer {
    stroke-dashoffset:0;
    animation: rotate 2s linear infinite;
  }

.inner {
    animation: reverseRotate 2s linear infinite;
  }

 @keyframes rotate {
    100% {
      stroke-dashoffset:126px;
    }
  }

  @keyframes reverseRotate {
    100% {
      stroke-dashoffset:-55px;
    }
  }

svg{border:1px solid}
<svg  xmlns="http://www.w3.org/2000/svg"
        width="200"
        height="200"
        preserveAspectRatio="xMidYMid"
        viewBox="0 0 100 100"
      >
        <circle
          class='outer'
          cx="50"
          cy="50"
          r="40"
          fill="none"
          stroke="#374a67"
          stroke-dasharray="63"
          stroke-linecap="round"
          stroke-width="4"
        />
        <circle
          class='inner'
          cx="50"
          cy="50"
          r="35"
          fill="none"
          stroke="#d50000"
          stroke-dasharray="55"
          stroke-dashoffset="55"
          stroke-linecap="round"
          stroke-width="4"
        />
      </svg>

答案 1 :(得分:1)

欢迎使用堆栈。

您需要进行一些小调整才能使其正常工作。

  • 只需使用一种动画,其动画范围从0%到100%。
  • 0deg360deg的动画

    @keyframes rotate {
       0% {
         transform: rotate(0deg);
       }
       100% {
         transform: rotate(360deg);
       }
     }
    

对于反向动画,您可以使用来反转方向

animation-direction: alternate;在您的CSS中