SVG круговая анимация с изменением радиуса

У меня круговая анимация на 10 секунд по кругу svg. В тот момент, когда я пытаюсь сменить r = "30" на обоих кругах, анимация срабатывает и длится всего 5 секунд. Я думаю, что вместе со значением r мне пришлось бы изменить значения cx и cy соответственно, чтобы они имели правильный размер и чтобы анимация длилась 10 секунд. Не могли бы вы указать, что происходит не так?

Вот ссылка: https://codepen.io/anon/pen/jxREMd

Вот фрагмент:

<svg class = "progress-circle definite" width = "100" height = "100">
  <defs>
    <linearGradient id = "linear" x1 = "0%" y1 = "0%" x2 = "100%" y2 = "0%">
      <stop offset = "0%"   stop-color = "transparent"/>
      <stop offset = "100%" stop-color = "black"/>
    </linearGradient>
  </defs>
  <g transform = "rotate(-90,50,50)">
    <circle class = "bg" r = "40" cx = "50" cy = "50" fill = "url(#linear)"></circle>
    <circle class = "progress" r = "40" cx = "50" cy = "50" fill = "none"></circle>
  </g>
</svg>

окружность круга зависит от его радиуса, поэтому длина штриха, которую вы должны покрыть, изменяется вместе с радиусом, следовательно, значения stroke-dasharray тоже.

Robert Longson 06.06.2018 07:48
Animista - анимация на ходу!
Animista - анимация на ходу!
Если вы веб-дизайнер или разработчик, вы знаете, что добавление анимации на ваш сайт может помочь сделать его более привлекательным и динамичным....
Повысьте уровень своего сайта с помощью анимации CSS и JavaScript: Пошаговое руководство
Повысьте уровень своего сайта с помощью анимации CSS и JavaScript: Пошаговое руководство
Если вы хотите добавить визуальный интерес к своему сайту, то внедрение анимации с помощью CSS и JavaScript может стать отличным способом сделать это....
1
1
92
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Из вашего вопроса я предполагаю, что вы, должно быть, уменьшаете радиус круга. Я прав?

Если вы уменьшите радиус круга, длина окружности также уменьшится. Значение «251» в свойстве stroke-dashoffset соответствует длине окружности.

circumference = 2*PI*r = 2*PI*40 ~= 251

Анимация работает за счет смещения положения штрихового рисунка, так что создается впечатление, что он медленно рисует линию.

Если вы уменьшите радиус вдвое, длина окружности также уменьшится вдвое. Если вы также не исправите stroke-dashoffset, анимация будет завершена в два раза быстрее. Это потому, что анимация уже достигла новой окружности 126 через 5 секунд.

Чтобы исправить это, просто обновите значение stroke-dashoffset до 126.

Если вы хотите использовать радиус, отличный от 20, вам также необходимо определить правильную окружность / stroke-dashoffset для этого.

.progress-circle.definite .progress {
  stroke: orange;
  stroke-width: 2;
  stroke-dashoffset: 0;
  stroke-dasharray: 126;
  animation: progress-anim 10s ease;
}

.progress-circle.definite .bg {
  stroke: white;
  stroke-width: 2;
}

@keyframes progress-anim {
  0% { stroke-dashoffset: 126; }
  100% { stroke-dashoffset: 0; }
}


// indefinite
<svg class = "progress-circle definite" width = "100" height = "100">
  <defs>
    <linearGradient id = "linear" x1 = "0%" y1 = "0%" x2 = "100%" y2 = "0%">
      <stop offset = "0%"   stop-color = "transparent"/>
      <stop offset = "100%" stop-color = "black"/>
    </linearGradient>
  </defs>
  <g transform = "rotate(-90,50,50)">
    <circle class = "bg" r = "20" cx = "50" cy = "50" fill = "url(#linear)"></circle>
    <circle class = "progress" r = "20" cx = "50" cy = "50" fill = "none"></circle>
  </g>
</svg>

Спасибо за прекрасное объяснение и решение. Бог благословил!

Mustang 06.06.2018 19:40

Другие вопросы по теме