В Lottie-анимациях изображения представляют собой отдельные ресурсы, которые не кодируются как геометрия или векторные формы, а подключаются как внешние или встроенные ассеты. При экспорте из After Effects через Bodymovin изображения выделяются в отдельный блок данных и связываются с элементами композиции через идентификаторы.
В JSON-файле Lottie изображения хранятся в секции:
assets — массив ресурсовТипичная структура:
"assets": [
{
"id": "image_0",
"w": 512,
"h": 512,
"u": "images/",
"p": "img_0.png",
"e": 0
}
]
Здесь:
id — идентификатор, используемый слоями анимацииw, h — размеры изображенияu — базовый путь (папка)p — имя файла или base64-строкаe — флаг встроенности (0/1)Связь изображения с анимацией происходит через слой, содержащий
ссылку на refId, который совпадает с id в
assets.
В Lottie Web изображения не «встраиваются» напрямую в DOM вручную. Вместо этого движок интерпретирует JSON и самостоятельно создаёт соответствующие элементы в зависимости от выбранного рендерера.
Инициализация анимации:
lottie.loadAnimation({
container: document.getElementById('anim'),
renderer: 'svg',
loop: true,
autoplay: true,
path: '/animations/data.json'
});
При использовании параметра path Lottie ожидает,
что:
images/ доступна по HTTPПри использовании SVG-рендерера изображения вставляются как
SVG-элементы <image>.
Особенности:
viewBoxxlink:href или
hrefpreserveAspectRatioПример внутренней структуры:
<image href="images/img_0.png" width="512" height="512" />
Преимущества:
Ограничения:
При canvas-рендере изображения загружаются как
HTMLImageElement и отрисовываются через
drawImage.
Механика:
Фрагмент логики:
ctx.drawImage(img, x, y, width, height);
Особенности:
HTML-рендерер использует DOM-элементы <img>.
Поведение:
Плюсы:
Минусы:
Lottie поддерживает хранение изображений внутри JSON в формате
base64. В этом случае поле p содержит Data URI:
"p": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUg..."
Преимущества:
Недостатки:
Base64-встраивание используется в случаях, когда критична автономность анимации или невозможность раздачи статических файлов.
При классическом экспорте Bodymovin создаёт структуру:
/animation
data.json
/images
img_0.png
img_1.png
В JSON указывается:
"u": "images/",
"p": "img_0.png"
Lottie Web формирует полный путь:
/animation/images/img_0.png
Критично, чтобы:
Lottie Web автоматически загружает изображения до старта анимации, если это возможно. Процесс включает:
assetsВ canvas-режиме изображения хранятся в Map-структуре, где ключом
является id.
Если один и тот же ассет используется в нескольких слоях:
Это снижает нагрузку на сеть при сложных анимациях.
Lottie не выполняет интеллектуального апскейла изображений. Поведение зависит от рендерера:
transform scalingПри увеличении масштаба выше оригинального размера:
Изображения в Lottie полностью поддерживают прозрачность:
Особенности наложения:
При использовании внешних URL:
"p": "https://cdn.example.com/img_0.png"
возникают ограничения:
Access-Control-Allow-OriginРекомендуемая практика — размещение ассетов на том же домене или CDN с корректными заголовками.
При работе с большим количеством ассетов критичны следующие аспекты:
Canvas-рендер особенно чувствителен к количеству больших bitmap-изображений.
Lottie Web позволяет менять изображения во время выполнения через API:
animation.addEventListener('DOMLoaded', () => {
animation.renderer.elements.forEach(el => {
if (el.data && el.data.refId === 'image_0') {
el.imageElement.src = 'new_image.png';
}
});
});
Используется для:
При этом важно учитывать:
Несмотря на универсальность, механизм изображений имеет ограничения:
При чрезмерном количестве ассетов производительность резко падает, особенно в canvas-режиме.
Если изображение недоступно:
Lottie не выполняет автоматический fallback на уровне движка, поэтому отсутствие ассета приводит к визуальному разрыву композиции.
Изображения могут:
Каждое изображение становится полноценным слоем композиции, участвующим в расчёте кадра наравне с векторными объектами.