Lottie-анимации основаны на композиции, созданной в After Effects и экспортированной через Bodymovin. Центральная единица измерения — размеры композиции (width/height), которые определяют исходное соотношение сторон. Любое отклонение от этого соотношения при рендеринге приводит к искажению графики, если не заданы корректные правила масштабирования.
Сохранение пропорций в Lottie Web реализуется через сочетание параметров рендера, контейнерной верстки и поведения SVG/Canvas на уровне браузера.
Исходное соотношение сторон задаётся формулой:
a =
Это значение фиксируется в JSON-анимации в полях w и
h. Например:
{
"w": 800,
"h": 600
}
Соотношение 4:3 становится эталоном для всех последующих масштабирований.
При любом изменении контейнера важно сохранять:
= const
При использовании SVG (renderer: "svg") ключевую роль
играет атрибут preserveAspectRatio, который Lottie Web
устанавливает автоматически, но может быть переопределён через
настройки.
Типовое значение:
preserveAspectRatio="xMidYMid meet"
xMidYMid — центрирование по обеим осямmeet — масштабирование с сохранением пропорций без
обрезкиslice — заполнение контейнера с возможным
обрезаниемПоведение:
meet сохраняет всю композицию целикомslice заполняет область, но может обрезать краяnone растягивает без сохранения пропорцийОсновная точка конфигурации:
lottie.loadAnimation({
container: element,
renderer: "svg",
loop: true,
autoplay: true,
path: "animation.json",
rendererSettings: {
preserveAspectRatio: "xMidYMid meet"
}
});
Параметр rendererSettings.preserveAspectRatio влияет
только на SVG-режим. В Canvas-режиме поведение определяется
масштабированием контекста.
Наиболее стабильный способ сохранения пропорций — управление через контейнер:
.lottie-wrapper {
width: 100%;
aspect-ratio: 16 / 9;
}
Альтернативный вариант без aspect-ratio:
.lottie-wrapper {
width: 100%;
height: 0;
padding-top: 56.25%;
position: relative;
}
Внутренний canvas или svg растягивается:
.lottie-wrapper svg,
.lottie-wrapper canvas {
position: absolute;
width: 100%;
height: 100%;
}
При renderer: "canvas" отсутствует SVG-атрибут
preserveAspectRatio. Вместо этого используется
масштабирование контекста:
Формула масштабирования:
s = (, )
где:
W, H — размеры контейнераw, h — размеры композицииЭто обеспечивает режим contain по умолчанию.
s = (, )
При масштабировании сохраняется точка привязки:
transform-origin: 50% 50%Для SVG это выражается через:
xMidYMid
Для canvas — через смещение контекста перед отрисовкой.
При изменении размеров окна требуется пересчёт масштабного коэффициента. Типовой алгоритм:
function resizeAnimation(anim, container, w, h) {
const cw = container.clientWidth;
const ch = container.clientHeight;
const scale = Math.min(cw / w, ch / h);
anim.setRendererSettings({
clearCanvas: true
});
anim.resize();
}
В большинстве реализаций Lottie Web пересчёт происходит автоматически, но при нестандартных контейнерах требуется ручное управление.
При несоответствии пропорций возникают три сценария:
Поведение зависит от комбинации:
preserveAspectRatioviewBox
на SVG-отрисовкуSVG-режим использует внутренний viewBox, совпадающий с
размером композиции:
viewBox="0 0 800 600"
Любое несоответствие контейнера этому прямоугольнику приводит к масштабированию всей сцены как единого блока без деформации элементов.
aspect-ratio или padding-хаковpreserveAspectRatioКорректное поведение достигается при трёх условиях: