Управляйте svg кругами для создания анимации вращения вокруг центра
У меня есть загрузчик (спиннер), нарисованный на странице через два <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
Вот пример моей текущей анимации:
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>
Добро пожаловать в стек.
Вам нужно сделать несколько небольших настроек, чтобы все заработало.
- Просто используйте одну анимацию, которая идет от 0% до 100%.
Анимировать от
0deg
в360deg
@keyframes rotate { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
Для обратной анимации вы можете изменить направление, используя
animation-direction: alternate;
в вашем CSS