Изменение strokeDashoffset строки SVG в цикле for

221
08 февраля 2018, 15:36

Я пытаюсь анимировать расширение линии.

У меня уже есть это решение в css, но мне нужно сделать это и в javaScript, потому что это единственный способ получить длину пути, которая мне нужна для реализации анимации.
Я думаю, что я очень близко подошёл к решению, но оно не работает! Есть идеи?

Ниже мой код. Как вы можете видеть, я получаю длину пути и присваиваю strokeDashArray значение этой длины.
Это означает, что линия будет пунктирна, но пунктир заполняет всю строку.

Трюк заключается в уменьшении значения strokeDashoffset, потому что это определяет, где начинается тире.
Поэтому, если это также начинается с pathLength, линия будет полностью невидимой, и уменьшение значения покажет рисование линии.

var element = document.getElementById("animpath"); 
var pathLength = element.getTotalLength(); 
 
element.style.strokeDasharray = pathLength; 
element.style.strokeDashoffset = pathLength; 
 
function animateRoute (e)  
{ 
e.style.strokeDashoffset = e.style.strokeDashoffset - 100; 
} 
 
for (i = 0; i < 100; i++) 
{ 
animateRoute(element); 
}

Прим. переводчика

Я выбрал этот пост для перевода по двум причинам: так как часто встречал вопросы типа,- как с помощью JS вычислить длину линии и нарисовать её. Во-вторых мне показался интересен сам прием анимации штриховки с помощью JS. Данный прием, на мой взгляд может быть использован в интерактивном веб-дизайне. Например штриховка чекбоксов, вместо стандартных галочек и т.д.

Answer 1

Код:

function animateRoute (e) 
{
   e.style.strokeDashoffset = e.style.strokeDashoffset - 100;
}
for (i = 0; i < 100; i++)
{
   animateRoute(element);
}        

В основном эквивалентен:

e.style.strokeDashoffset = e.style.strokeDashoffset - 10000;       

Потому что цикл пробивает все его итерации, не давая возможности браузеру обновить страницу.

Чтобы обойти это, сделайте один шаг в цикле, а затем вызовите setTimeout(), чтобы браузер вернулся к нам немного, и чтобы мы могли сделать следующую итерацию.

var element = document.getElementById("animpath"); 
var pathLength = element.getTotalLength(); 
 
element.style.strokeDasharray = pathLength; 
element.style.strokeDashoffset = pathLength; 
 
function animateRoute(e, len)  
{ 
   
  //На каждом шаге мы уменьшаем смещение тире 
  len -= 10; 
  if (len < 0) 
    len = 0;   
 
  element.style.strokeDashoffset = len; 
 
    //Нам нужно прекратить цикл, когда длина достигнет `0` 
   
  if (len > 0) { 
    // Сделать еще один шаг 
    setTimeout(function() { animateRoute(e, len); }, 10); 
  } 
} 
 
animateRoute(element, pathLength);
<svg viewBox="-10 -10 420 120"> 
   
    <path id="animpath" d="M 0 0 L 400 10 0 20 400 30 0 40 400 50 0 60 400 70 0 80 400 90 0 100" 
          stroke="black" stroke-width="3" fill="none"/> 
   
</svg>

READ ALSO
Не експортируется CarouselCaption с reactstrap

Не експортируется CarouselCaption с reactstrap

Привет!Я решил установить reactstrap(Bootstrap для react)чтобы использовать систему сеток и устоновить слайдер на сайт но при установке слайдера я получаю...

288
Позиционирование H1 в слайдере

Позиционирование H1 в слайдере

Есть сайт https://studentprogramsru/ на главной есть слайдер с текстом Детские каникулы 2018

260
Выделение ссылки на якорь и сохранение ее стиля только средствами html css

Выделение ссылки на якорь и сохранение ее стиля только средствами html css

При нажатии на ссылку сделать, например, ее бг красным, но после нажатия на другую ссылку, применить такой стиль на нее, а у прошлой убратьВозможно...

213
Как выровнять текст под картинку?

Как выровнять текст под картинку?

Надо чтобы текст стоял красиво на картинке Заранее спасибо

405