В библиотеке Lottie Web скорость воспроизведения анимации задаётся и изменяется динамически, что позволяет управлять ощущением «времени» в анимации без пересборки JSON или изменения таймлайна в After Effects. Основной механизм контроля скорости строится вокруг масштабирования времени, которое применяется ко всему циклу проигрывания.
Ключевой метод, отвечающий за скорость воспроизведения:
anim.setSpeed(1);
Параметр принимает числовое значение, где:
1 — нормальная скорость0.5 — замедление в два раза2 — ускорение в два разаФактически скорость интерпретируется как коэффициент временного масштаба. При изменении значения библиотека пересчитывает шаги анимации в рамках внутреннего таймлайна, не изменяя сами ключевые кадры.
Скорость можно менять в любой момент жизни экземпляра анимации:
anim.setSpeed(0.25);
setTimeout(() => {
anim.setSpeed(2);
}, 2000);
Изменение применяется мгновенно и влияет на текущую позицию воспроизведения без сброса состояния. Это особенно важно при создании интерактивных интерфейсов, где скорость зависит от пользовательского ввода или состояния приложения.
При этом:
При использовании loop: true изменение скорости влияет
на длительность одного цикла. Однако важно учитывать, что реальная
«длина» анимации в секундах становится плавающей величиной.
Пример:
const anim = lottie.loadAnimation({
container: document.getElementById('box'),
renderer: 'svg',
loop: true,
autoplay: true,
path: 'data.json'
});
anim.setSpeed(3);
В этом случае полный цикл проигрывания сокращается примерно в три раза.
Lottie Web поддерживает отрицательные значения скорости:
anim.setSpeed(-1);
Такое значение приводит к:
Особенности поведения:
Скорость в Lottie Web не является независимым параметром каждого слоя или композиции. Она применяется глобально ко всему экземпляру анимации.
Это означает:
Дополнительно стоит учитывать, что:
При использовании сегментов:
anim.playSegments([10, 60], true);
anim.setSpeed(2);
скорость применяется только внутри заданного диапазона кадров. Это позволяет создавать ускоренные или замедленные фрагменты анимации без изменения глобального поведения.
Важно учитывать:
Методы управления воспроизведением:
anim.pause();
anim.play();
anim.setSpeed(1.5);
Скорость начинает влиять только в момент активного воспроизведения.
Если анимация поставлена на паузу, изменение скорости не приводит к
визуальным изменениям до вызова play().
Помимо метода setSpeed, в некоторых реализациях доступно
прямое свойство:
anim.speed = 2;
Однако этот способ считается менее предпочтительным, так как:
Метод setSpeed() остаётся основным и стабильным API.
Изменение скорости напрямую влияет на частоту обновления кадров:
Векторные SVG-анимации особенно чувствительны к слишком высоким скоростям, так как браузеру приходится быстро перестраивать DOM-структуру.
Canvas-рендер более устойчив к высоким коэффициентам скорости, но может терять плавность при сложных сценах.
Часто управление скоростью применяется в интерфейсах, где анимация реагирует на действия пользователя:
document.addEventListener('mousemove', (e) => {
const speed = (e.clientX / window.innerWidth) * 3;
anim.setSpeed(speed);
});
Такой подход позволяет:
Скорость и направление воспроизведения связаны между собой:
anim.setDirection(-1);
anim.setSpeed(2);
В этом случае направление задаёт вектор движения, а скорость
масштабирует его интенсивность. При отрицательной скорости направление
фактически инвертируется, но setDirection остаётся более
явным способом управления логикой воспроизведения.
При loop: false изменение скорости влияет только на один
проход анимации. При loop: true поведение становится
цикличным, и скорость влияет на частоту повторений.
При резком изменении скорости во время перехода между циклами возможны микросдвиги тайминга, особенно в Canvas-рендере, где синхронизация кадров зависит от requestAnimationFrame.
При проектировании интерфейсов с динамической скоростью важно учитывать:
setSpeed могут создавать нагрузку на
главный потокОптимальным считается использование ограниченного диапазона значений, например от 0.25 до 2.5, если нет специальных требований к эффектам.
При вызове:
anim.destroy();
значение скорости не сохраняется. При повторной инициализации анимации скорость необходимо задавать заново, так как экземпляр полностью пересоздаётся вместе с внутренним состоянием таймлайна.