Я пытаюсь анимировать расширение линии.
У меня уже есть это решение в 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
. Данный прием, на мой взгляд может быть использован в интерактивном веб-дизайне. Например штриховка чекбоксов, вместо стандартных галочек и т.д.
Код:
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>
Привет!Я решил установить reactstrap(Bootstrap для react)чтобы использовать систему сеток и устоновить слайдер на сайт но при установке слайдера я получаю...
Есть сайт https://studentprogramsru/ на главной есть слайдер с текстом Детские каникулы 2018
При нажатии на ссылку сделать, например, ее бг красным, но после нажатия на другую ссылку, применить такой стиль на нее, а у прошлой убратьВозможно...