Интерактивность в SVG-анимациях строится на управлении жизненным циклом отрисовки пути: запуск, остановка, сброс состояния и повторная анимация в ответ на действия интерфейса. Vivus предоставляет минималистичный, но достаточно гибкий API, позволяющий привязывать анимацию к любым DOM-событиям и внешним состояниям приложения.
Ключевой принцип работы — управление SVG через JavaScript-объект, который инкапсулирует состояние отрисовки путей и позволяет изменять его в реальном времени.
Интерактивная логика строится вокруг экземпляра анимации:
const animation = new Vivus('svg-id', {
type: 'oneByOne',
duration: 120,
start: 'manual'
});
Основные моменты:
start: 'manual' отключает автоматический запускЭкземпляр содержит методы, позволяющие реагировать на пользовательские действия:
Наиболее распространённый сценарий — запуск анимации по клику.
const svgElement = document.getElementById('svg-id');
svgElement.addEventListener('click', () => {
animation.reset().play();
});
Логика взаимодействия:
reset() возвращает SVG в исходное состояниеplay() запускает анимацию зановоТакой подход применяется для иконок, логотипов, интерактивных схем.
Реакция на наведение используется для микроинтеракций интерфейса.
svgElement.addEventListener('mouseenter', () => {
animation.play();
});
svgElement.addEventListener('mouseleave', () => {
animation.stop();
});
Особенности поведения:
mouseenter запускает прорисовкуmouseleave останавливает текущее состояниеДля создания эффекта возврата часто комбинируется сброс:
svgElement.addEventListener('mouseleave', () => {
animation.stop().reset();
});
Интеграция с Intersection Observer позволяет запускать анимацию только при появлении элемента в зоне видимости.
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
animation.reset().play();
}
});
});
observer.observe(svgElement);
Поведение:
Такой подход критичен для ленивых интерфейсов и длинных лендингов.
Vivus может быть интегрирован в более сложные UI-сценарии, где состояние зависит от внешних переключателей.
let isActive = false;
toggleButton.addEventListener('click', () => {
isActive = !isActive;
if (isActive) {
animation.reset().play();
} else {
animation.stop();
}
});
Логика строится на внешнем состоянии, а Vivus выступает как визуальный слой.
В некоторых интерфейсах требуется мгновенное завершение анимации:
animation.finish();
Поведение:
Применяется в сценариях загрузки интерфейса, где анимация выступает индикатором готовности.
animation.reset();
Сброс приводит к:
Часто используется в связке с повторной активацией событий.
В сложных интерфейсах события могут накладываться друг на друга:
Для предотвращения конфликтов применяется контроль состояния:
let running = false;
svgElement.addEventListener('mouseenter', () => {
if (!running) {
running = true;
animation.reset().play();
}
});
svgElement.addEventListener('mouseleave', () => {
animation.stop();
running = false;
});
Такой подход предотвращает повторный запуск при активной анимации.
SVG-анимация может зависеть от состояния формы:
input.addEventListener('input', (e) => {
if (e.target.value.length > 3) {
animation.reset().play();
} else {
animation.stop();
}
});
Сценарии применения:
fetch('/api/data')
.then(response => response.json())
.then(() => {
animation.reset().play();
});
Поведение:
setTimeout(() => {
animation.reset().play();
}, 2000);
Типовые сценарии:
Vivus позволяет прерывать текущую анимацию и запускать новую:
svgElement.addEventListener('click', () => {
animation.stop();
animation.reset();
animation.play();
});
Логика:
Такой подход используется для устранения конфликтов при быстрых повторных действиях пользователя.
При частых событиях (например, движение мыши) применяется ограничение частоты:
let timeout;
svgElement.addEventListener('mousemove', () => {
clearTimeout(timeout);
timeout = setTimeout(() => {
animation.reset().play();
}, 100);
});
Результат:
При наличии нескольких экземпляров Vivus требуется синхронное управление:
const a1 = new Vivus('svg1', { type: 'oneByOne' });
const a2 = new Vivus('svg2', { type: 'oneByOne' });
button.addEventListener('click', () => {
a1.reset().play();
a2.reset().play();
});
Особенности:
document.addEventListener('visibilitychange', () => {
if (document.hidden) {
animation.stop();
} else {
animation.reset().play();
}
});
Поведение:
Используется для оптимизации ресурсов и предотвращения неконтролируемого выполнения.
Основные методы управления:
play() — запуск анимацииstop() — остановка текущего состоянияreset() — возврат к началуfinish() — мгновенное завершениеКомбинации этих методов формируют основу всей событийной модели взаимодействия.
Интерактивная SVG-анимация строится вокруг переходов между состояниями:
Каждое действие пользователя переводит систему в новое состояние, а Vivus выступает механизмом управления визуальным переходом между ними.