Модель слоёв в Lottie Web напрямую отражает структуру композиции,
созданной в After Effects. При экспорте через Bodymovin каждый слой
превращается в объект внутри массива layers, где
фиксируются ключевые параметры анимации, трансформации и привязки к
ресурсам.
Типовая структура слоя включает:
ty — тип слоя (shape, text, image, precomp)nm — имя слояind — индекс слояks — трансформации (position, scale, rotation,
opacity)shapes — векторные контуры (для shape layers)t — текстовая конфигурацияrefId — ссылка на precomposition или assetКлючевой момент заключается в том, что Lottie Web не работает напрямую со слоями как с DOM-элементами. После парсинга JSON создаётся внутренняя сцена, которая абстрагирует структуру слоёв в набор рендер-элементов.
Доступ к слоям возможен только через экземпляр анимации, возвращаемый
lottie.loadAnimation.
import lottie from "lottie-web";
const animation = lottie.loadAnimation({
container: document.getElementById("app"),
renderer: "svg",
loop: true,
autoplay: true,
path: "/animation.json"
});
После инициализации создаётся объект анимации, внутри которого содержится рендер-дерево. Именно оно отражает структуру слоёв в рабочем виде.
Наиболее важные точки доступа:
animation.renderer — активный рендерер
(svg/canvas/html)animation.renderer.elements — список внутренних
элементов сценыanimation.animationData — исходный JSONanimation.getDuration() — длительность анимацииanimation.goToAndStop() / goToAndPlay() —
управление временемLottie Web преобразует JSON-слои в набор объектов рендера. В зависимости от выбранного режима (SVG, Canvas, HTML) структура отличается, но логика остаётся общей:
BaseElementTransformManagerSVGShapeElementTextElementВ SVG-режиме каждый слой обычно соответствует группе
<g> в DOM, но доступ к ней через стандартный DOM API
ограничен, поскольку библиотека управляет обновлениями
самостоятельно.
Наиболее прямой способ получить доступ к слоям — использование внутреннего массива элементов рендера:
const elements = animation.renderer.elements;
Каждый элемент содержит ссылку на слой и связанные данные:
element.data — оригинальный слой из JSONelement.layerId — идентификатор слояelement.transform — объект трансформацийelement.updateFrame() — обновление состоянияПример обхода:
elements.forEach(el => {
console.log(el.data.nm);
});
Этот подход позволяет связать визуальные элементы с исходной структурой After Effects.
Имена слоёв (nm) часто используются как основной
идентификатор для логики управления. Несмотря на отсутствие официального
API поиска, доступ можно реализовать через обход дерева элементов.
function findLayerByName(animation, name) {
return animation.renderer.elements.find(el => el.data && el.data.nm === name);
}
Такой способ зависит от реализации рендерера, но на практике используется в большинстве проектов с Lottie Web.
Каждый слой содержит объект трансформаций ks, который в
рендер-слое преобразуется в управляемую структуру.
Основные параметры:
o — opacityp — positionr — rotations — scalea — anchor pointВ рендер-элементе доступ к этим данным осуществляется через
transform:
const layer = findLayerByName(animation, "Icon");
layer.transform.opacity = 50;
layer.transform.position[0] += 10;
Изменения могут не всегда применяться напрямую, так как многие значения кешируются и пересчитываются на уровне кадра.
Lottie Web не предоставляет полноценного публичного API для мутации слоёв в реальном времени, однако существует механизм принудительного обновления через перерисовку кадра.
animation.goToAndStop(animation.currentFrame, true);
или
animation.triggerRenderFrame();
(последний метод относится к внутренним API и может отсутствовать в некоторых версиях)
При изменении свойств слоя важно учитывать:
Shape layers представляют собой дерево объектов:
shapes → группыit → элементы (fill, stroke, path)Внутри рендер-слоя это преобразуется в структуру
ShapeElement.
Пример обхода:
const layer = findLayerByName(animation, "Button");
layer.elements.forEach(el => {
if (el.shapes) {
console.log(el.shapes);
}
});
Для более глубокого доступа используется рекурсивный обход:
function traverseShapes(group) {
group.shapes.forEach(item => {
if (item.it) traverseShapes(item);
if (item.ty === "fl") console.log("Fill color", item.c);
});
}
Текстовые слои преобразуются в TextElement, который
содержит:
textData — исходная текстовая конфигурацияrenderedText — текущая строкаtransform — позиционированиеПример получения текста:
const textLayer = findLayerByName(animation, "Title");
console.log(textLayer.textData.d.k[0].s.t);
Изменение текста возможно только через обновление структуры данных:
textLayer.textData.d.k[0].s.t = "New Text";
animation.goToAndStop(animation.currentFrame, true);
Precomp layers (ty: 0) представляют собой вложенные
композиции. Внутри они имеют собственный набор слоёв, который рендерится
отдельным деревом.
Доступ:
const precomp = findLayerByName(animation, "Scene 2");
const nestedElements = precomp.layers;
Внутренние слои precomp не всегда доступны напрямую через основной
renderer.elements, так как они инкапсулируются в отдельный
контекст.
Поведение доступа к слоям существенно зависит от рендерера.
<g>,
<path>, <text>Lottie Web разделяет доступ к слоям на две категории:
play, pause,
setSpeed)complete, loopComplete)renderer.elementstransform объектовshapes дереваtextDataИспользование внутренних структур даёт гибкость, но привязывает код к версии библиотеки.
Часто используется комбинированный подход:
renderer.elementsПример общей схемы:
function setLayerOpacity(animation, name, value) {
const layer = animation.renderer.elements.find(
el => el.data && el.data.nm === name
);
if (!layer) return;
layer.transform.opacity = value;
animation.goToAndStop(animation.currentFrame, true);
}
Lottie активно использует кеширование:
Из-за этого изменения в слоях могут требовать принудительного обновления кадра или повторного запуска анимации с текущей позиции.
Несмотря на наличие внутренних структур, прямое управление слоями ограничено архитектурой библиотеки:
Это приводит к тому, что управление слоями строится через: