В основе анимаций Lottie лежит дискретная временная шкала, построенная вокруг кадровой модели, унаследованной от Adobe After Effects. Вся анимация описывается не как непрерывное изменение во времени, а как набор ключевых состояний, привязанных к конкретным кадрам композиции.
Каждая Lottie-анимация содержит композицию, определяющую базовые параметры временной шкалы:
Длительность анимации вычисляется как разница между op и
ip, переведённая в секунды через frame rate:
duration (sec) = (op - ip) / fr
В Lottie Web внутренняя шкала чаще оперирует кадрами, а не миллисекундами, что делает поведение строго детерминированным при рендеринге.
Любое изменяемое свойство в Lottie представляется через набор ключевых кадров. Ключевой кадр описывает состояние свойства в конкретный момент времени.
Базовая структура keyframe:
{
"t": 10,
"s": [100, 100],
"e": [200, 200],
"i": { "x": [0.42], "y": [1] },
"o": { "x": [0.58], "y": [0] }
}
Если ключевой кадр единственный, используется только s,
а интерполяция отсутствует.
Lottie использует кривые Безье для описания плавности переходов между ключевыми кадрами. В отличие от линейной интерполяции, easing задаётся вручную через control points.
Каждый переход между кадрами можно представить как функцию:
p(t) = (1 - t)^3 * P0 + 3(1 - t)^2 t * P1 + 3(1 - t) t^2 * P2 + t^3 * P3
Где:
o и iВ Lottie почти любое свойство может быть анимировано:
"ks": {
"o": { "k": 100 },
"r": { "k": 45 },
"p": { "k": [540, 960, 0] },
"a": { "k": [0, 0, 0] },
"s": { "k": [100, 100, 100] }
}
Каждое поле может быть либо статическим значением, либо массивом keyframes.
Если свойство содержит простой массив значений:
"s": {
"k": [
{ "t": 0, "s": [0, 0] },
{ "t": 20, "s": [100, 100] }
]
}
то движение интерпретируется как анимация между точками времени.
Если присутствуют i и o, используется cubic
easing.
В Lottie Web временная шкала доступна через объект
animationItem, возвращаемый после загрузки анимации:
import lottie from "lottie-web";
const anim = lottie.loadAnimation({
container: document.getElementById("app"),
renderer: "svg",
loop: true,
autoplay: false,
path: "animation.json"
});
anim.goToAndStop(30, true);
anim.goToAndPlay(10, true);
Сегменты позволяют проигрывать части анимации:
anim.playSegments([0, 50], true);
Сегменты особенно важны для сложных анимаций интерфейсов, где одна композиция содержит несколько состояний.
anim.currentFrame;
anim.totalFrames;
anim.currentTime;
currentFrame — текущий кадрtotalFrames — общее число кадровcurrentTime — время в секундахLottie Web предоставляет доступ к внутреннему циклу проигрывания:
anim.addEventListener("enterFrame", (e) => {
console.log(e.currentTime);
});
Во время рендеринга движок выполняет несколько этапов:
Для SVG-рендерера это означает динамическое обновление атрибутов элементов DOM на каждом кадре.
"c": {
"k": [
{ "t": 0, "s": [1, 0, 0] },
{ "t": 20, "s": [0, 0, 1] }
]
}
Цвета интерполируются по RGB-компонентам.
Пути используют набор вершин, где каждая точка также может анимироваться:
"ks": {
"k": [
{
"t": 0,
"s": [[0,0],[100,100]],
"i": [[0,0],[0,0]],
"o": [[0,0],[0,0]]
}
]
}
Каждый сегмент пути интерполируется отдельно.
Экспорт через Bodymovin преобразует AE-анимацию в JSON:
prsoEase curves из AE конвертируются в bezier handles (i,
o).
Особенность модели: After Effects допускает выражения и time-remapping, но Lottie фиксирует результат в виде дискретных ключевых кадров.
Time remapping в AE преобразуется в пересчёт временной шкалы слоя:
В Lottie это выражается через пересчитанные значения t
без сохранения исходной функции ремаппинга.
Lottie Web не предоставляет полноценного API редактирования keyframes на лету, но позволяет:
anim.setSpeed(2); // ускорение в 2 раза
При работе с несколькими Lottie-инстансами временная шкала может синхронизироваться вручную:
const t = masterAnim.currentFrame;
slaveAnim.goToAndStop(t, true);
Это создаёт единый временной контур между композициями.
Ключевая особенность временной модели Lottie:
Это делает систему подходящей для UI-анимаций, где важна воспроизводимость состояния.