Управляйте svg кругами для создания анимации вращения вокруг центра - PullRequest
0 голосов
/ 10 января 2019

У меня есть загрузчик (спиннер), нарисованный на странице через два <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;

Не знаю, как сделать из моего кода настоящий рабочий фрагмент, sry

Вот пример моей текущей анимации:

Here's an example of my current animation

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Вам нужно установить 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>
0 голосов
/ 10 января 2019

Добро пожаловать в стек.

Вам нужно сделать несколько небольших настроек, чтобы все заработало.

  • Просто используйте одну анимацию, которая идет от 0% до 100%.
  • Анимация от 0deg до 360deg

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

Для обратной анимации вы можете изменить направление, используя

animation-direction: alternate; в вашем CSS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...