Контейнер для Lottie-анимации представляет собой обычный DOM-элемент, внутри которого библиотека Lottie Web рендерит SVG, Canvas или HTML-структуру в зависимости от выбранного режима. От правильной подготовки этого контейнера зависит стабильность анимации, её масштабирование, производительность и корректное поведение при изменении размеров страницы.
В основе любой интеграции Lottie лежит один элемент, в который будет
вставлена анимация. Чаще всего используется
<div>.
<div id="lottie-container"></div>
Этот элемент становится точкой монтирования, внутри которой библиотека создаёт собственную графику. Важно понимать, что сам контейнер не содержит анимацию как набор DOM-элементов до инициализации — он лишь резервирует область на странице.
Контейнер должен удовлетворять нескольким базовым условиям:
Без этих условий возможны проблемы: обрезка анимации, нулевая высота, смещения или отсутствие отображения.
Lottie Web не создаёт размеры самостоятельно. Если контейнер не имеет высоты, итоговая анимация будет невидима.
Наиболее простой вариант — задать явные размеры:
<div id="lottie-container" style="width: 400px; height: 400px;"></div>
Такой подход гарантирует предсказуемое поведение, особенно в статичных интерфейсах.
В реальных интерфейсах чаще используется адаптивная модель:
<div class="lottie-wrapper">
<div id="lottie-container"></div>
</div>
.lottie-wrapper {
width: 100%;
max-width: 600px;
aspect-ratio: 1 / 1;
}
#lottie-container {
width: 100%;
height: 100%;
}
Ключевой момент — контейнер должен наследовать размеры родителя, который контролирует геометрию.
Для сложных интерфейсов используется комбинация flex или grid:
.layout {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
.lottie-box {
width: min(80vw, 500px);
height: min(80vw, 500px);
}
Такой подход обеспечивает корректное масштабирование без искажений.
Lottie часто используется как декоративный или интерактивный элемент, поэтому важно учитывать его слой и позицию.
.lottie-container {
position: relative;
}
Это позволяет размещать внутренние элементы поверх анимации, если требуется наложение UI.
.lottie-container {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
Такой вариант используется при интеграции в фоновые анимации или hero-секции.
Часто Lottie используется как фон:
.background-animation {
position: absolute;
z-index: 0;
pointer-events: none;
}
Ключевой момент — отключение pointer-events, чтобы анимация не блокировала интерфейс.
После подготовки DOM-элемента происходит подключение библиотеки.
import lottie from "lottie-web";
Инициализация:
const animation = lottie.loadAnimation({
container: document.getElementById("lottie-container"),
renderer: "svg",
loop: true,
autoplay: true,
path: "/animations/example.json"
});
Параметр container определяет:
Lottie создаёт внутри контейнера собственную структуру:
<svg> при SVG-рендере<canvas> при Canvas-рендереНаиболее распространённый режим:
renderer: "svg"
Особенности контейнера в этом режиме:
Контейнер в этом случае выступает как оболочка для SVG-дерева.
renderer: "canvas"
Используется при высокой нагрузке или сложных сценах.
Контейнер содержит <canvas> элемент:
renderer: "html"
Используется ограниченно, чаще для специфических кейсов.
Одна из частых проблем — обрезание анимации.
.lottie-container {
overflow: visible;
}
или
.lottie-container {
overflow: hidden;
}
Выбор зависит от сценария:
hidden — если анимация строго ограничена блокомvisible — если допускаются выходы за границыLottie не всегда автоматически адаптируется под размеры контейнера. Используются два подхода:
animation.setSubframe(false);
И управление масштабом через API:
animation.resize();
#lottie-container svg {
width: 100%;
height: 100%;
}
Важно учитывать, что SVG может игнорировать внешние ограничения, если viewBox задан некорректно.
При SPA-навигации контейнер может уничтожаться и создаваться заново:
animation.destroy();
document.getElementById("lottie-container").innerHTML = "";
lottie.loadAnimation({
container: document.getElementById("lottie-container"),
renderer: "svg",
loop: true,
autoplay: true,
path: "/anim.json"
});
Ключевой момент — очистка DOM перед повторной инициализацией.
<div class="lottie-item" id="a1"></div>
<div class="lottie-item" id="a2"></div>
<div class="lottie-item" id="a3"></div>
document.querySelectorAll(".lottie-item").forEach((el) => {
lottie.loadAnimation({
container: el,
renderer: "svg",
loop: true,
autoplay: true,
path: "/anim.json"
});
});
Каждый контейнер изолирует собственный экземпляр анимации.
#lottie-container {
display: block;
margin: 0 auto;
}
.wrapper {
display: flex;
justify-content: center;
align-items: center;
}
#lottie-container {
opacity: 0.8;
}
Важно учитывать, что opacity влияет на весь рендер, включая SVG-слои.
Причина — отсутствие заданных размеров.
Решение:
#lottie-container {
height: 300px;
}
Причины:
Решение:
document.addEventListener("DOMContentLoaded", () => {
lottie.loadAnimation({ container: document.getElementById("lottie-container") });
});
Причина — overflow у родителя.
Решение:
.parent {
overflow: visible;
}
Причина — некорректный viewBox внутри JSON-анимации или CSS трансформации контейнера.
Контейнер влияет на производительность косвенно через:
Оптимальные практики:
filter: blur() на контейнереtransform: translateZ(0) для
GPU-ускорения#lottie-container {
transform: translateZ(0);
}
<div class="modal">
<div id="lottie-container"></div>
</div>
Важно инициализировать анимацию только после открытия модального окна, иначе размеры будут равны нулю.
Каждая карточка должна иметь свой изолированный контейнер:
<div class="card">
<div class="lottie"></div>
</div>
Инициализация происходит лениво при появлении в viewport.
const observer = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
lottie.loadAnimation({
container: entry.target,
renderer: "svg",
loop: true,
autoplay: true,
path: "/anim.json"
});
observer.unobserve(entry.target);
}
});
});
document.querySelectorAll(".lottie").forEach((el) => observer.observe(el));
Контейнер становится активным только при необходимости, снижая нагрузку.
Контейнер Lottie Web можно рассматривать как:
Его корректная настройка определяет стабильность всей анимационной системы интерфейса.