Анимация в формате Lottie представляет собой временную шкалу, состоящую из ключевых кадров, экспортированных из After Effects через Bodymovin. Внутри этой шкалы можно выделять сегменты — диапазоны кадров, которые интерпретируются как самостоятельные логические части анимации.
Сегмент определяется парой значений:
Такая структура позволяет воспроизводить не всю анимацию целиком, а её фрагменты, что критично для интерфейсных сценариев: микроинтеракции, состояния UI, переходы между экранами.
Основной API для работы с сегментами в Lottie Web — метод
playSegments.
animation.playSegments([10, 60], true);
Первый аргумент задаёт диапазон кадров:
10 — стартовый кадр60 — конечный кадрВторой аргумент управляет поведением переключения:
true — немедленный переход к сегменту с принудительным
прерыванием текущего состоянияfalse — плавное продолжение очереди анимацииВнутренне механизм работает через переопределение текущего состояния таймлайна и установку ограничителей playback range.
Наиболее прямолинейный способ задания сегмента:
animation.playSegments([0, 30], true);
Используется абсолютная шкала кадров, соответствующая композиции After Effects.
Сегмент может задаваться в обратном порядке:
animation.playSegments([60, 10], true);
В этом случае направление воспроизведения инвертируется. Это используется для обратных переходов интерфейса или анимаций закрытия.
Lottie поддерживает последовательность сегментов:
animation.playSegments([[0, 20], [20, 40], [40, 80]], true);
Поведение:
При использовании playSegments с
forceFlag = false сегменты добавляются в очередь:
animation.playSegments([10, 50], false);
animation.playSegments([50, 100], false);
В этом режиме движок:
Такой подход используется для построения сложных сценариев анимации интерфейса без ручного контроля состояния.
Внутри Lottie Web существует несколько состояний воспроизведения:
При вызове playSegments происходит переход в сегментный
режим, при котором:
currentFrame становится локальным внутри сегментаХотя playSegments является основным механизмом,
альтернативный контроль возможен через прямое позиционирование
кадров.
animation.goToAndPlay(10, true);
animation.goToAndStop(50, true);
Параметр isFrame определяет интерпретацию значения:
true — значение трактуется как кадрfalse — как время в секундахИспользование в связке с сегментами позволяет:
Помимо числовых диапазонов, сегменты могут быть определены через markers, экспортируемые из After Effects.
Маркер представляет собой именованную точку или диапазон на таймлайне.
animation.play("hover");
или через API маркеров:
const markers = animation.markers;
Структура маркера:
Сегментное воспроизведение через маркеры фактически заменяет числовые диапазоны на семантические идентификаторы.
Маркер может быть конвертирован в диапазон:
const marker = animation.markers.find(m => m.name === "open");
animation.playSegments(
[marker.time, marker.time + marker.duration],
true
);
Такой подход позволяет:
Сегменты могут быть зациклены через комбинацию loop и
playSegments:
animation.loop = true;
animation.playSegments([20, 40], true);
Поведение:
Дополнительно возможна ручная реализация через события:
animation.addEventListener("complete", () => {
animation.playSegments([20, 40], true);
});
Скорость анимации влияет на сегмент аналогично полной композиции:
animation.setSpeed(2);
animation.playSegments([0, 50], true);
Особенности:
Направление воспроизведения задаётся через
setDirection:
animation.setDirection(-1);
animation.playSegments([0, 40], true);
Значения:
1 — прямое воспроизведение-1 — обратное воспроизведениеПри обратном направлении:
Lottie Web предоставляет события для контроля завершения сегментов:
animation.addEventListener("complete", () => {
// завершён текущий сегмент
});
Дополнительно используются:
enterFrame — каждый кадрloopComplete — завершение циклаsegmentStart (в некоторых реализациях через кастомные
обёртки)Событийная модель позволяет строить state-machine поверх сегментов.
Поведение при повторном вызове playSegments зависит от
forceFlag:
animation.playSegments([10, 40], true);
animation.playSegments([50, 90], true);
В этом случае:
При false:
Сегменты могут формироваться на основе вычислений:
const start = 0;
const step = 25;
for (let i = 0; i < 4; i++) {
animation.playSegments([start + i * step, start + (i + 1) * step], false);
}
Такой подход используется для:
Использование сегментов влияет на производительность косвенно:
Однако сама композиция остаётся загруженной целиком, поэтому выигрыш проявляется преимущественно в логике управления временем, а не в памяти.
Сегментный подход позволяет представить анимацию как набор состояний:
Каждое состояние становится независимым playback-блоком:
const states = {
init: [0, 20],
active: [20, 40],
done: [40, 60],
reset: [60, 80]
};
animation.playSegments(states.active, true);
Такой подход заменяет ручное управление keyframe timeline логикой управления UI.
Сегменты часто связываются с внешними событиями интерфейса:
button.addEventListener("mousedown", () => {
animation.playSegments([0, 30], true);
});
button.addEventListener("mouseup", () => {
animation.playSegments([30, 60], true);
});
В этом случае Lottie функционирует как реактивный визуальный слой, управляемый внешней логикой.
Сегментное воспроизведение в Lottie Web формирует абстракцию:
Эта модель позволяет использовать анимацию как систему состояний, а не как непрерывный видеоряд.