В библиотеке lottie-web каждое воспроизведение анимации проходит
через полный жизненный цикл: загрузка, инициализация, проигрывание
кадров и завершение. Событие complete срабатывает в момент,
когда анимация доходит до своего конечного кадра при нормальном
направлении воспроизведения.
Ключевая особенность события заключается в том, что оно фиксирует завершение одного полного цикла проигрывания. Это означает, что событие не связано с уничтожением анимации или её скрытием, а исключительно с достижением конечной позиции временной шкалы.
Внутри движка Lottie Web анимация управляется через внутренний таймер и систему кадров. При каждом обновлении состояния проверяется текущая позиция:
fps и
времениtotalFrames)Событие complete срабатывает только при условии, что
направление воспроизведения — прямое (direction === 1) и
цикл не активирован или завершил текущую итерацию.
Обработчик события регистрируется через метод
addEventListener или через onComplete в
объекте анимации.
const animation = lottie.loadAnimation({
container: document.getElementById('icon'),
renderer: 'svg',
loop: false,
autoplay: true,
path: 'animation.json'
});
animation.addEventListener('complete', () => {
console.log('Анимация завершила воспроизведение');
});
Альтернативная форма:
animation.onCompl ete = function () {
console.log('Завершение анимации');
};
Обе формы эквивалентны, однако addEventListener
позволяет регистрировать несколько обработчиков одновременно.
При активированном циклическом воспроизведении
(loop: true) событие complete ведёт себя
иначе. Оно срабатывает в конце каждого полного цикла, но анимация
автоматически перезапускается.
const animation = lottie.loadAnimation({
container: document.getElementById('looped'),
renderer: 'svg',
loop: true,
autoplay: true,
path: 'loop.json'
});
animation.addEventListener('complete', () => {
console.log('Один цикл завершён');
});
При этом важно учитывать, что при бесконечном цикле событие будет вызываться потенциально неограниченное количество раз.
loopCompleteВ Lottie Web существует ещё одно связанное событие —
loopComplete. Оно срабатывает в момент завершения одного
цикла, но только если используется параметр loop в виде
числа или активирован бесконечный цикл.
Различие:
complete — завершение всей анимации или одного прохода
при отсутствии looploopComplete — завершение одного цикла при циклическом
воспроизведенииПри loop: true оба события могут пересекаться в
зависимости от версии библиотеки и конфигурации.
Lottie поддерживает изменение направления через свойство
setDirection. При обратном воспроизведении
(direction === -1) событие complete
срабатывает в момент достижения первого кадра.
animation.setDirection(-1);
animation.play();
animation.addEventListener('complete', () => {
console.log('Обратное воспроизведение завершено');
});
Таким образом, термин «завершение» всегда относится к достижению крайней точки временной шкалы в текущем направлении.
Событие complete не блокирует поток выполнения и
обрабатывается в рамках внутреннего цикла обновления. Это означает,
что:
В сложных интерфейсах это важно учитывать при синхронизации UI-логики.
На практике событие используется для координации последующих действий после завершения анимации:
animation.addEventListener('complete', () => {
document.body.classList.add('animation-finished');
});
При повторном вызове play() событие
complete будет срабатывать каждый раз при достижении конца
анимации. При этом состояние слушателей сохраняется, если они не были
удалены вручную.
Удаление обработчика:
function onComplete() {
console.log('завершено');
}
animation.addEventListener('complete', onComplete);
animation.removeEventListener('complete', onComplete);
Если анимация загружается асинхронно через
loadAnimation, событие complete становится
доступным только после полной инициализации JSON и построения внутренних
структур кадров. До этого момента регистрация событий возможна, но
фактическое срабатывание произойдёт только после старта
воспроизведения.
В Lottie Web событие complete часто используется вместе
с:
DOMLoaded — завершение построения DOM-структурыenterFrame — обновление каждого кадраdata_ready — готовность данных анимацииКомбинация этих событий позволяет точно контролировать жизненный цикл
анимации, но complete остаётся финальной точкой одного
прохода временной шкалы.
Событие может не сработать в следующих случаях:
stop() до достижения
концаgoToAndStop() на последнем
этапе без запуска воспроизведенияВ этих случаях завершение логически не фиксируется движком, так как конечный кадр не был достигнут в рамках нормального playback-цикла.