В библиотеке Vivus завершение анимации рассматривается как ключевое
событие жизненного цикла SVG-рисования. Каждая анимация проходит
последовательность кадров, после чего переходит в состояние завершённого
рендера, когда все пути SVG полностью отрисованы в соответствии с
выбранным типом анимации (delayed, oneByOne,
sync).
Факт завершения не является побочным эффектом, а фиксированным состоянием экземпляра, которое может быть отловлено через callback-функции или косвенно определено через API состояния.
Основной способ отслеживания окончания работы Vivus — передача функции обратного вызова в конструктор экземпляра. Этот callback вызывается строго один раз после того, как все элементы SVG завершили отрисовку.
new Vivus('my-svg', {
duration: 200,
type: 'oneByOne'
}, function (obj) {
// завершение анимации
});
Особенности механизма:
stop()Внутренне это событие связано с достижением состояния, при котором прогресс анимации равен 1 (100%).
При использовании методов управления анимацией важно учитывать, что callback завершения привязан к конкретному циклу проигрывания.
const animation = new Vivus('my-svg', {
duration: 150
}, function () {
console.log('done');
});
animation.reset();
animation.play();
При повторном запуске:
reset()Vivus не предоставляет полноценного event emitter API, однако состояние экземпляра позволяет отслеживать прогресс выполнения анимации.
Ключевые свойства:
isReady — SVG загружен и подготовлен к анимацииisPlaying — анимация находится в процессе
выполненияТипичный сценарий проверки:
if (!animation.isPlaying) {
// анимация завершена или остановлена
}
Однако важно учитывать, что isPlaying = false не всегда
означает завершение — это может быть остановка вручную.
Завершение анимации и принудительная остановка являются различными состояниями жизненного цикла.
| Состояние | Причина | Callback |
|---|---|---|
| Завершение | Достижение конца анимации | вызывается |
| Stop | Вызов stop() |
не вызывается |
| Reset | Сброс прогресса | не вызывается |
animation.stop(); // прерывание без завершения
animation.reset(); // возврат к начальному состоянию
animation.play(); // новый цикл
Таким образом, завершение фиксируется только при естественном завершении прогресса.
Хотя Vivus не предоставляет отдельного события
onComplete, поведение можно контролировать через комбинацию
методов:
play()Запускает или возобновляет анимацию. Завершение фиксируется при достижении конца пути.
finish()Принудительно завершает анимацию, мгновенно устанавливая финальное состояние SVG.
animation.finish();
Особенности:
reset()Сбрасывает состояние, возвращая SVG в исходный вид.
animation.reset();
После reset:
Для интеграции с современными асинхронными потоками часто используется обёртка над callback-механизмом Vivus, позволяющая трактовать завершение как Promise.
function vivusToPromise(svgId, options) {
return new Promise(resolve => {
new Vivus(svgId, options, function (instance) {
resolve(instance);
});
});
}
Использование:
vivusToPromise('my-svg', {
duration: 180
}).then(instance => {
// завершено
});
Особенности такого подхода:
При работе с несколькими SVG-анимациями важно учитывать независимость каждого экземпляра Vivus.
const a1 = new Vivus('svg1', { duration: 100 }, onDone);
const a2 = new Vivus('svg2', { duration: 200 }, onDone);
Поведение:
duration и сложности
SVGДля синхронизации используется внешний счётчик:
let completed = 0;
function onDone() {
completed++;
if (completed === 2) {
// оба завершены
}
}
При повторных запусках важно учитывать, что завершение фиксируется каждый раз при достижении финального состояния.
animation.play(); // завершение №1
animation.reset();
animation.play(); // завершение №2
Поведение системы:
В сценариях UI-анимаций завершение часто используется как триггер перехода состояния интерфейса.
Типовые паттерны:
new Vivus('logo', {}, function () {
document.querySelector('.content').classList.add('visible');
});
Особенность подхода:
Система отслеживания завершения в Vivus имеет ряд архитектурных ограничений:
addEventListener)completeПоэтому завершение рассматривается как финальная точка одного цикла анимации, а не как часть расширяемой событийной модели.
Поведение завершения может незначительно отличаться в зависимости от выбранного режима:
delayed — завершение происходит после последовательной
отрисовки каждого path с задержкамиoneByOne — завершение фиксируется после последнего
элемента в очередиsync — завершение происходит одновременно для всех
путейНесмотря на различие внутренней логики, сигнал завершения унифицирован и не зависит от типа анимации.