Click-триггеры в Vivus реализуются через связку стандартных
DOM-событий и управления состоянием экземпляра SVG-анимации. Библиотека
Vivus не навязывает собственную систему событийного управления, а
предоставляет методы контроля анимации, которые подключаются к любым
пользовательским триггерам, включая click,
mouseenter, scroll и программные вызовы.
Основная модель работы строится вокруг экземпляра Vivus,
который управляет отрисовкой SVG по заданному алгоритму
(последовательному, синхронному или задержанному). Click-триггер в этой
архитектуре выступает внешним источником запуска или повторного запуска
анимации.
Интеграция click-триггера реализуется через стандартный обработчик DOM:
const myVivus = new Vivus('svg-element', {
type: 'oneByOne',
duration: 120,
start: 'manual'
});
document.getElementById('trigger').addEventListener('click', () => {
myVivus.play();
});
Ключевой параметр здесь — start: 'manual'. Он отключает
автоматический запуск анимации и переводит управление полностью на
внешние события.
Метод play() запускает анимацию с текущего состояния
SVG, если оно сброшено или находится в начале.
Повторное воспроизведение требует явного сброса состояния. Vivus
хранит внутренний прогресс отрисовки, поэтому без сброса повторный
play() не всегда приводит к ожидаемому результату.
const myVivus = new Vivus('svg-element', {
type: 'delayed',
duration: 200,
start: 'manual'
});
const button = document.getElementById('trigger');
button.addEventListener('click', () => {
myVivus.reset().play();
});
Метод reset() возвращает SVG в исходное состояние,
обнуляя прогресс отрисовки. После этого play() запускает
анимацию заново.
Click-триггеры часто используются не только для запуска, но и для управления состоянием анимации. Типовой паттерн включает переключение между воспроизведением и остановкой.
const vivus = new Vivus('svg-element', {
type: 'sync',
duration: 150,
start: 'manual'
});
let isPlaying = false;
document.getElementById('trigger').addEventListener('click', () => {
if (isPlaying) {
vivus.stop();
isPlaying = false;
} else {
vivus.play();
isPlaying = true;
}
});
Метод stop() фиксирует текущее состояние отрисовки без
сброса прогресса, что позволяет продолжить анимацию с текущего момента
при повторном запуске.
Vivus поддерживает несколько режимов отрисовки SVG, и реакция click-триггера зависит от выбранного типа.
Каждый путь SVG отрисовывается последовательно. Click-триггер в этом режиме приводит к заметному линейному запуску анимации.
new Vivus('svg-element', {
type: 'oneByOne',
duration: 100,
start: 'manual'
});
Повторный клик без reset() может привести к отсутствию
визуального эффекта, поскольку часть путей уже отрисована.
Каждый путь получает задержку относительно предыдущего. Click-триггер инициирует каскадную анимацию.
new Vivus('svg-element', {
type: 'delayed',
duration: 180,
start: 'manual'
});
В этом режиме особенно важен reset() при повторных
запусках, так как прогресс распределён по временной шкале.
Все пути анимируются одновременно. Click-триггер вызывает синхронное воспроизведение.
new Vivus('svg-element', {
type: 'sync',
duration: 120,
start: 'manual'
});
Этот режим наиболее устойчив к повторным вызовам play()
без сброса состояния.
При работе с большим количеством SVG-элементов применяется делегирование событий. Это снижает количество обработчиков и упрощает управление группой анимаций.
const svgs = document.querySelectorAll('.animated-svg');
const instances = Array.from(svgs).map((el) =>
new Vivus(el, {
type: 'delayed',
duration: 150,
start: 'manual'
})
);
document.body.addEventListener('click', (event) => {
const target = event.target.closest('.animated-svg');
if (!target) return;
const index = Array.from(svgs).indexOf(target);
const instance = instances[index];
instance.reset().play();
});
Делегирование позволяет привязать click-триггер к родительскому контейнеру, минимизируя количество подписок на события.
Click-событие может быть привязано непосредственно к SVG-элементу, что превращает саму графику в интерактивный триггер.
const svg = document.getElementById('svg-element');
const vivus = new Vivus(svg, {
type: 'oneByOne',
duration: 140,
start: 'manual'
});
svg.addEventListener('click', () => {
vivus.reset().play();
});
SVG выступает одновременно визуальным объектом и интерактивным контроллером анимации.
Click-триггеры часто используются для реализации циклической анимации, где каждое нажатие перезапускает процесс.
const vivus = new Vivus('svg-element', {
type: 'delayed',
duration: 160,
start: 'manual'
});
document.getElementById('trigger').addEventListener('click', () => {
vivus.stop();
vivus.reset();
vivus.play();
});
Комбинация stop() и reset() гарантирует
полное возвращение к исходному состоянию перед новым запуском.
При работе с композициями SVG-анимаций click-триггер может управлять несколькими экземплярами Vivus одновременно.
const header = new Vivus('header-svg', {
type: 'sync',
duration: 100,
start: 'manual'
});
const icon = new Vivus('icon-svg', {
type: 'delayed',
duration: 140,
start: 'manual'
});
document.getElementById('trigger').addEventListener('click', () => {
header.reset().play();
icon.reset().play();
});
Такой подход позволяет синхронизировать визуальные компоненты интерфейса без дополнительной временной логики.
Click-триггер может быть ограничен логически, чтобы предотвратить частые перезапуски анимации. В таких сценариях вводится контроль состояния.
let locked = false;
const vivus = new Vivus('svg-element', {
type: 'oneByOne',
duration: 120,
start: 'manual'
});
document.getElementById('trigger').addEventListener('click', () => {
if (locked) return;
locked = true;
vivus.reset().play();
setTimeout(() => {
locked = false;
}, 1500);
});
Логическая блокировка предотвращает наложение анимационных циклов.
Click может выступать не только запуском анимации, но и механизмом переключения между статичным и анимированным состоянием SVG.
const vivus = new Vivus('svg-element', {
type: 'sync',
duration: 130,
start: 'manual'
});
let animated = false;
document.getElementById('trigger').addEventListener('click', () => {
if (!animated) {
vivus.reset().play();
animated = true;
} else {
vivus.stop();
animated = false;
}
});
Такой подход позволяет использовать одну и ту же SVG-структуру как статичный и динамический элемент интерфейса.
SVG, управляемый Vivus, изменяет атрибуты
stroke-dasharray и stroke-dashoffset для
имитации рисования. Click-триггер фактически управляет изменением этих
параметров через API библиотеки, а не напрямую через DOM.
Это разделение позволяет сохранять чистую структуру SVG без необходимости ручного управления стилями при каждом событии клика.
Click-триггер часто комбинируется с hover-событиями и программными вызовами. В таких схемах click выступает как финальный контроллер состояния.
const vivus = new Vivus('svg-element', {
type: 'delayed',
duration: 150,
start: 'manual'
});
document.getElementById('trigger').addEventListener('mouseenter', () => {
vivus.stop();
});
document.getElementById('trigger').addEventListener('click', () => {
vivus.reset().play();
});
Click в данном случае переопределяет промежуточные состояния и инициирует полный цикл анимации заново.