Lottie Web при рендеринге анимаций формирует в DOM сложную, но
предсказуемую иерархию элементов, зависящую от выбранного режима
отрисовки: svg, canvas или html.
Понимание этой структуры критично для отладки, оптимизации
производительности и интеграции анимаций в интерфейсы.
После инициализации через lottie.loadAnimation в DOM
появляется корневой контейнер, внутри которого библиотека строит
собственное дерево элементов.
Типичная структура:
<div id="lottie">
<svg ...>
<defs>...</defs>
<g>...</g>
</svg>
</div>
или при canvas-рендеринге:
<div id="lottie">
<canvas></canvas>
</div>
или при DOM-based рендеринге:
<div id="lottie">
<div class="bm-root">
<div class="bm-layer">...</div>
</div>
</div>
Ключевой момент: структура не фиксирована на уровне HTML, она генерируется движком в зависимости от настроек.
SVG-режим является наиболее распространённым и инспектируемым вариантом.
svg — корневой контейнер сценыdefs — определения градиентов, масок, клиппингаg — группы слоёвpath — векторные формыimage — растровые элементыtext — текстовые слоиПример типовой иерархии:
<svg>
<defs>
<clipPath id="cp_1">...</clipPath>
<linearGradient id="gr_1">...</linearGradient>
</defs>
<g class="bm-layer" transform="matrix(...)">
<g class="bm-shape">
<path d="..." />
</g>
</g>
</svg>
Lottie Web использует внутренние префиксы:
bm-layer — слой композицииbm-shape — векторная формаbm-fill — заливкаbm-stroke — обводкаbm-text — текстовый слойbm-image — растровый слойЭти классы стабильно присутствуют при SVG-рендеринге и позволяют идентифицировать элементы без анализа JSON-анимации.
Каждый DOM-узел соответствует объектам JSON:
{
"layers": [
{
"ty": 4,
"nm": "Shape Layer",
"shapes": [...]
}
]
}
Соответствие:
layers[] → g.bm-layershapes[] → g.bm-shapeks (keyframes) → inline styles / transformsc (color) → fill /
strokeDOM не является прямым отражением JSON, а представляет компиляцию структуры в SVG-дерево.
Основной механизм анимации в Lottie Web основан на
transform-атрибутах:
<g transform="matrix(1,0,0,1,120,80)">
или:
<g style="transform: translate3d(0px, 0px, 0px) scale(1);">
Типы трансформаций:
Каждый слой содержит собственную матрицу, вычисляемую движком на каждом кадре.
Формируются через комбинацию:
<g class="bm-shape">
<path d="M0 0 L100 0 L100 100 Z"></path>
</g>
Множественные формы группируются внутри одного слоя.
<path class="bm-fill" fill="#ff0000"></path>
<path class="bm-stroke" stroke-width="2"></path>
Инспекция позволяет отслеживать динамическое изменение:
Текстовые элементы представлены через SVG <text>
или набор <tspan>:
<text class="bm-text">
<tspan x="0" y="0">Sample</tspan>
</text>
Особенность: текст может быть разбит на несколько сегментов для анимации отдельных символов.
При использовании canvas-рендеринга DOM не содержит визуальных элементов сцены:
<div id="lottie">
<canvas width="500" height="500"></canvas>
</div>
В этом режиме:
HTML-рендеринг формирует структуру из div-элементов:
<div class="bm-layer">
<div class="bm-shape">
<div class="bm-fill"></div>
</div>
</div>
Особенности:
Использование селекторов:
document.querySelectorAll('.bm-layer')
или:
document.querySelector('svg')
const layer = document.querySelector('.bm-layer');
const observer = new MutationObserver(() => {
console.log(layer.getAttribute('transform'));
});
observer.observe(layer, { attributes: true });
Основные узкие места:
pathtransformLottie активно использует SVG-механизмы:
<clipPath id="clip_1">
<rect width="100" height="100"></rect>
</clipPath>
<g clip-path="url(#clip_1)">
Маски часто создают дополнительные группы g, увеличивая
глубину DOM.
Типичная структура сложной композиции:
svg
├── defs
├── g (comp root)
│ ├── g (layer 1)
│ │ ├── g (shape group)
│ │ ├── path
│ ├── g (layer 2)
│ ├── text
│ ├── tspan
Глубина напрямую зависит от количества:
Lottie Web не хранит статическую DOM-структуру. Вместо этого:
При работе с DevTools наблюдаются следующие эффекты:
transform меняются на каждом frame tickDOM-структура позволяет:
Через экземпляр:
const anim = lottie.loadAnimation({...});
доступны данные, которые косвенно отражаются в DOM:
anim.currentFrameanim.totalFramesanim.rendererDOM выступает визуальным слепком состояния этого экземпляра на каждом кадре.