Анимации Lottie основаны на данных, экспортированных из Adobe After Effects в JSON-формате. Внутри структуры каждой композиции находятся слои, ключевые кадры и набор трансформационных параметров, которые описывают положение, масштаб, поворот и якорную точку элементов. В Lottie Web эти параметры доступны для динамического изменения во время выполнения, что позволяет адаптировать анимации под состояние интерфейса без пересборки JSON.
Каждый слой в Lottie содержит объект transform, который включает основные параметры:
В зависимости от экспорта структура может отличаться, но логика остаётся одинаковой: все трансформации применяются относительно anchor point.
Пример структуры слоя:
{
"ty": 4,
"ks": {
"p": { "a": 0, "k": [100, 200] },
"r": { "a": 0, "k": 45 },
"s": { "a": 0, "k": [100, 100] },
"a": { "a": 0, "k": [0, 0] },
"o": { "a": 0, "k": 100 }
}
}
После инициализации анимации через lottie.loadAnimation
возвращается объект, через который можно управлять воспроизведением и
получать доступ к внутренним структурам.
const anim = lottie.loadAnimation({
container: document.getElementById('anim'),
renderer: 'svg',
loop: true,
autoplay: true,
path: 'animation.json'
});
Для модификации трансформаций используется метод getItem
или работа с внутренними слоями через rendererElements.
Позиция в Lottie представлена как двумерный или трёхмерный вектор. При изменении позиции важно учитывать, что значения могут быть как статическими, так и анимированными (keyframes).
const layer = anim.renderer.elements[0];
layer.transform.mProps.p.v = [300, 150];
Изменение происходит мгновенно и перезаписывает текущее значение позиции. Такой подход применим только к неанимированным свойствам.
Если позиция содержит ключевые кадры, используется доступ к текущему
значению через currentValue.
const pos = layer.transform.mProps.p;
pos.v = [pos.v[0] + 50, pos.v[1]];
При этом важно учитывать, что при следующем кадре анимации значение может быть пересчитано интерполяцией.
Масштаб задаётся как массив из двух значений:
[scaleX, scaleY]. Значения интерпретируются в
процентах.
layer.transform.mProps.s.v = [150, 150];
Увеличение масштаба влияет на весь слой целиком, включая вложенные элементы.
Изменение масштаба в реальном времени может использоваться для создания реактивных интерфейсов:
function pulse() {
let scale = 100 + Math.sin(Date.now() * 0.005) * 20;
layer.transform.mProps.s.v = [scale, scale];
requestAnimationFrame(pulse);
}
pulse();
Такой подход заменяет встроенную анимацию After Effects и позволяет управлять поведением слоя программно.
Поворот задаётся в градусах. В SVG-рендерере Lottie преобразует значение в соответствующую матрицу трансформации.
layer.transform.mProps.r.v = 90;
function rotate() {
layer.transform.mProps.r.v += 2;
requestAnimationFrame(rotate);
}
rotate();
При работе с вращением важно учитывать, что значения не нормализуются автоматически, и угол может расти бесконечно, сохраняя корректность вычислений.
Anchor point определяет точку, относительно которой применяются все трансформации. Изменение этой точки влияет на поведение позиции, масштаба и вращения.
layer.transform.mProps.a.v = [50, 50];
Смещение центра трансформации позволяет изменять поведение объекта без изменения его позиции на сцене.
Если anchor point смещён, вращение происходит вокруг новой точки, что может использоваться для сложных орбитальных эффектов:
layer.transform.mProps.a.v = [100, 0];
layer.transform.mProps.r.v += 10;
Внутри Lottie все трансформации сводятся к матричным операциям. Каждый слой имеет матрицу, которая объединяет:
Комбинация этих операций формирует итоговое положение пикселей на экране.
Упрощённая модель:
M = T × R × S × A
где:
Для получения локальных координат используется обратная матрица трансформации. Это необходимо при обработке взаимодействий с элементами.
const matrix = layer.transform.finalTransform;
const inverted = matrix.inverse();
Инверсия позволяет переводить координаты экрана в систему координат слоя.
Трансформации Lottie можно связывать с внешними данными, создавая реактивные анимации.
window.addEventListener('scroll', () => {
const value = window.scrollY * 0.5;
layer.transform.mProps.p.v = [100, 100 + value];
});
Такой подход используется для синхронизации анимаций с интерфейсом страницы.
При работе с Lottie Web важно учитывать ряд технических ограничений:
При наличии ключевых кадров и программного изменения значений применяется следующий порядок:
Это означает, что ключевые кадры могут перезаписать вручную заданные значения при следующем обновлении кадра.
Одновременное изменение позиции, масштаба и вращения позволяет формировать сложные анимационные сценарии:
function update() {
const time = Date.now() * 0.002;
layer.transform.mProps.p.v = [
200 + Math.cos(time) * 50,
200 + Math.sin(time) * 50
];
layer.transform.mProps.r.v = time * 30;
layer.transform.mProps.s.v = [
100 + Math.sin(time) * 20,
100 + Math.sin(time) * 20
];
requestAnimationFrame(update);
}
update();
В сложных композициях трансформации применяются иерархически. Родительские слои влияют на дочерние:
const parent = anim.renderer.elements[0];
const child = anim.renderer.elements[1];
parent.transform.mProps.p.v = [100, 100];
child.transform.mProps.p.v = [20, 20];
Итоговая позиция дочернего слоя вычисляется как сумма всех трансформаций по иерархии.
Трансформации Lottie часто применяются не только для визуальных эффектов, но и для построения интерактивных элементов интерфейса:
Каждый параметр трансформации становится точкой управления поведением анимации в реальном времени.