Анимации Lottie, экспортируемые через Bodymovin из After Effects, часто содержат текстовые слои. При рендеринге в браузере библиотекой Lottie Web текст не является «векторной формой», а зависит от доступности шрифтов в среде выполнения. Если нужный шрифт отсутствует, происходит подмена, которая может полностью изменить композицию: ломается выравнивание, переносы строк, размеры блоков и визуальная иерархия.
В отличие от статических SVG-экспортов, Lottie хранит метаданные о шрифтах и пытается восстановить текстовую структуру на стороне клиента. Это делает подключение внешних шрифтов критически важным этапом интеграции.
При экспорте через Bodymovin в JSON-файл попадает описание текстовых элементов:
В браузере Lottie Web пытается сопоставить эти данные с реальными шрифтами, доступными через:
@font-faceЕсли совпадение не найдено, используется fallback, что почти всегда приводит к визуальным искажениям.
Внутри файла анимации присутствует секция fonts:
"fonts": {
"list": [
{
"fName": "Roboto-Bold",
"fFamily": "Roboto",
"fStyle": "Bold",
"ascent": 75,
"fPath": "",
"fWeight": "700"
}
]
}
Ключевые поля:
Текстовые слои ссылаются именно на fName, а не на
CSS-семейство, что создаёт необходимость явного маппинга.
Базовый способ подключения внешних шрифтов — использование стандартного CSS:
@font-face {
font-family: "Roboto";
src: url("/fonts/Roboto-Bold.woff2") format("woff2"),
url("/fonts/Roboto-Bold.woff") format("woff");
font-weight: 700;
font-style: normal;
}
После этого браузер начинает загружать шрифт, и Lottie Web может использовать его при рендеринге текста.
Критически важно:
font-family должен совпадать с fFamily из
JSONfont-weight и font-style должны
соответствовать метаданным LottieLottie Web не блокирует рендеринг до загрузки шрифтов. Это означает, что при запуске анимации до завершения загрузки:
Для предотвращения этого используются стратегии предварительной загрузки:
<link
rel="preload"
href="/fonts/Roboto-Bold.woff2"
as="font"
type="font/woff2"
crossorigin="anonymous"
/>
await document.fonts.load('700 16px Roboto');
Только после этого запускается Lottie-анимация:
lottie.loadAnimation({
container: document.getElementById('anim'),
renderer: 'svg',
loop: true,
autoplay: true,
path: '/animation.json'
});
В реальных проектах имена шрифтов в JSON часто не совпадают с CSS-именами. Для этого используется ручное сопоставление.
const fontMap = {
"Roboto-Bold": "Roboto",
"Roboto-Regular": "Roboto",
"Inter-SemiBold": "Inter"
};
Далее подключается обработчик через document.fonts или
глобальную замену:
Object.keys(fontMap).forEach((key) => {
document.fonts.load(`16px ${fontMap[key]}`);
});
Lottie Web предоставляет доступ к внутреннему менеджеру шрифтов:
lottie.setFonts({
addFont: (font) => {
console.log(font);
}
});
Однако в стандартной практике чаще используется подход с предварительной загрузкой и CSS, так как внутренний API ограничен и зависит от версии библиотеки.
При использовании внешних сервисов шрифтов, например Google Fonts, важно учитывать задержку загрузки и CORS.
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap">
Проблема в том, что CSS может примениться быстрее, чем загрузятся реальные файлы шрифтов, поэтому визуально возможен FOUT (Flash of Unstyled Text).
Для снижения эффекта применяются:
font-display: swap.woff2 файловdocument.fonts.readyЕсли шрифты загружаются с CDN, обязательно корректно настроенный CORS:
Access-Control-Allow-Origin: *
Без этого браузер может загрузить файл, но не применить его к тексту Lottie, что приведёт к тихой подмене шрифта.
After Effects:
Roboto-Bold
CSS:
Roboto
Результат — отсутствие точного совпадения и fallback.
Даже при совпадении family:
700400Итог — замена начертания.
Шрифт может поддерживать латиницу, но не содержать кириллицу. В Lottie это проявляется как:
Анимация стартует до загрузки шрифтов, текст пересчитывается позже, что ломает композицию.
Стабильная схема обычно строится вокруг трёх этапов:
document.fonts.loadawait document.fonts.ready;
lottie.loadAnimation({
container: el,
renderer: 'svg',
path: '/anim.json'
});
При использовании renderer: 'svg' текст остаётся текстом
DOM:
При canvas рендере текст растеризуется, и контроль над
шрифтами становится ещё более критичным на этапе инициализации.
Bodymovin позволяет включать шрифты в экспорт, но это редко используется из-за:
Даже при наличии встроенных шрифтов браузер всё равно может требовать локальное соответствие для корректного рендеринга текста.
Стабильность Lottie-анимаций с текстом зависит от строгого соответствия трёх уровней:
Любое расхождение приводит к визуальному дрейфу композиции, особенно в интерфейсных анимациях, где текст участвует в сетке и выравнивании элементов.