Anime.js предоставляет мощные возможности для создания плавных и
гибких анимаций в JavaScript. Для анимации линий чаще всего используются
SVG-пути (<path>), линии (<line>),
полилинии (<polyline>) и контуры
(<polygon>). Основная идея заключается в манипуляции
атрибутами stroke-dasharray и
stroke-dashoffset, которые позволяют «рисовать» линию
постепенно.
Чтобы линия выглядела анимированной, необходимо правильно задать свойства:
<svg width="400" height="200">
<path d="M10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80"
stroke="black" stroke-width="2" fill="transparent"/>
</svg>
Ключевые моменты:
fill="transparent" — предотвращает заливку фигуры.stroke и stroke-width задают вид
линии.d определяет путь линии, который будет
анимироваться.Для анимации линию необходимо подготовить, вычислив её полную длину:
const path = document.querySelector('path');
const pathLength = path.getTotalLength();
path.style.strokeDasharray = pathLength;
path.style.strokeDashoffset = pathLength;
strokeDasharray равен длине линии, чтобы весь путь
состоял из одного сегмента.strokeDashoffset определяет смещение начальной точки.
При полном смещении линия становится невидимой.Базовая анимация линии выполняется с использованием
anime() и изменения strokeDashoffset от полной
длины до нуля:
anime({
targets: path,
strokeDashoffset: [pathLength, 0],
duration: 2000,
easing: 'easeInOutSine',
loop: false
});
Пояснения параметров:
targets — элементы DOM, к которым применяется
анимация.strokeDashoffset — массив
[начальное, конечное].duration — продолжительность анимации в
миллисекундах.easing — функция плавности (можно использовать
'linear', 'easeInOutQuad',
'spring' и др.).loop — задаёт цикличность анимации.Для многоступенчатых анимаций можно использовать
timeline, позволяющий последовательно анимировать несколько
линий или сегментов:
const path1 = document.querySelector('#path1');
const path2 = document.querySelector('#path2');
const timeline = anime.timeline({
easing: 'easeInOutSine',
duration: 1500
});
timeline
.add({
targets: path1,
strokeDashoffset: [path1.getTotalLength(), 0]
})
.add({
targets: path2,
strokeDashoffset: [path2.getTotalLength(), 0]
});
Особенности timeline:
offset для синхронизации
с другими эффектами.Anime.js поддерживает комбинированные анимации свойств, что позволяет создавать более выразительные визуальные эффекты:
anime({
targets: path,
strokeDashoffset: [pathLength, 0],
stroke: ['#FF0000', '#0000FF'],
strokeWidth: [2, 5],
duration: 2500,
easing: 'easeInOutQuart'
});
Anime.js предоставляет методы управления анимацией в процессе её выполнения:
const animation = anime({
targets: path,
strokeDashoffset: [pathLength, 0],
duration: 2000,
easing: 'linear',
autoplay: false
});
animation.play(); // запуск
animation.pause(); // пауза
animation.restart(); // перезапуск
animation.seek(1000); // переход к определённой позиции в миллисекундах
autoplay: false позволяет запускать анимацию
вручную.seek() удобен для создания интерактивных анимаций,
связанных с прокруткой или событиями мыши.anime({
targets: 'path',
strokeDashoffset: [anime.setDashoffset, 0],
easing: 'easeInOutSine',
duration: 2000,
delay: anime.stagger(500) // задержка между линиями
});
anime.setDashoffset автоматически вычисляет длину пути
для каждого <path>.anime.stagger() создаёт каскадный эффект анимации.anime({
targets: path,
strokeDashoffset: [pathLength, 0],
direction: 'alternate',
loop: true,
duration: 1500,
easing: 'easeInOutSine'
});
direction: 'alternate' заставляет линию «рисоваться» и
«стирается» обратно.requestAnimationFrame совместно с anime.js для
синхронизации с перерисовкой браузера.<g> для объединения линий.loop и
direction, чтобы избежать лишних пересозданий
объектов.Сочетание strokeDasharray, strokeDashoffset
и гибких инструментов anime.js позволяет создавать динамичные визуальные
эффекты: рисование линий по пути, последовательное появление графических
элементов, а также комплексные анимации с цветом, толщиной и кривизной
линии.
Эти техники являются основой профессиональной работы с анимацией SVG в современных веб-интерфейсах.