Работа со шрифтами

В Lottie-анимациях текстовые слои из Adobe After Effects экспортируются через Bodymovin в JSON-структуру, где сохраняются параметры шрифта, метрики, стилизация и ссылки на гарнитуры. На этапе воспроизведения в Lottie Web текст не является статичным графическим объектом — он либо рендерится через системные/веб-шрифты, либо преобразуется в геометрию в зависимости от настроек экспорта и окружения.

Работа со шрифтами в Lottie опирается на три ключевых слоя:

  • описание текстового слоя в JSON
  • механизм сопоставления шрифтов в рантайме
  • стратегия рендеринга (DOM / SVG / Canvas)

Каждый из этих уровней влияет на итоговый визуальный результат и предсказуемость отображения.

Представление текста в структуре Lottie JSON

Текстовый слой в экспортированном файле содержит блок t, внутри которого хранится описание шрифта и параметров отображения:

{
  "ty": "text",
  "t": {
    "d": {
      "k": [
        {
          "s": {
            "f": "Roboto-Bold",
            "t": "Hello",
            "s": 120,
            "fc": [0, 0, 0]
          }
        }
      ]
    }
  }
}

Основные параметры:

  • f — имя шрифта, заданное в After Effects
  • t — текстовая строка
  • s — размер шрифта
  • fc — цвет текста (RGB в диапазоне 0–1)

Критически важным является то, что Lottie не хранит сам шрифт. Он хранит только ссылку на его имя. Реальный рендеринг зависит от того, доступен ли шрифт в среде выполнения.

Механизм сопоставления шрифтов

Во время загрузки анимации Lottie Web формирует таблицу шрифтов и пытается сопоставить их с доступными ресурсами в браузере.

Система работает по следующему принципу:

  1. Из JSON извлекается список используемых шрифтов
  2. Проверяется наличие этих шрифтов в окружении
  3. При необходимости применяются fallback-шрифты
  4. При наличии пользовательской конфигурации выполняется подмена

Внутренне используется font manager, который отвечает за разрешение имен шрифтов.

Регистрация шрифтов

При необходимости можно явно определить соответствие между именами из After Effects и веб-шрифтами:

lottie.loadAnimation({
  container: document.getElementById('anim'),
  renderer: 'svg',
  loop: true,
  autoplay: true,
  path: 'animation.json',
  fonts: {
    customFonts: [
      {
        fFamily: 'Roboto-Bold',
        fPath: '/fonts/roboto-bold.woff2',
        fWeight: 'bold',
        fStyle: 'normal'
      }
    ]
  }
});

В этом случае Lottie Web использует указанный файл шрифта вместо системного.

Особенности загрузки веб-шрифтов

При использовании веб-шрифтов важна синхронизация загрузки ресурсов и инициализации анимации. Если анимация стартует до загрузки шрифта, происходит временная подмена системным аналогом, что приводит к изменению метрик текста.

Ключевые проблемы:

  • смещение позиционирования текста
  • изменение ширины строк
  • расхождение таймингов анимации
  • визуальные артефакты при масштабировании

Для устранения подобных эффектов используется стратегия предварительной загрузки через CSS:

@font-face {
  font-family: "Roboto-Bold";
  src: url("/fonts/roboto-bold.woff2") format("woff2");
  font-weight: bold;
  font-style: normal;
}

После этого браузер начинает загрузку шрифта до запуска JavaScript-логики.

Поведение при отсутствии шрифта

Если указанный в JSON шрифт недоступен, Lottie Web применяет fallback-цепочку:

  1. системный аналогичный шрифт
  2. ближайший доступный по метрикам шрифт
  3. дефолтный sans-serif

Однако даже визуально близкие шрифты редко совпадают по:

  • ширине символов
  • кернингу
  • высоте строки
  • базовой линии

Это приводит к нарушению композиции анимации, особенно в сценах с точным позиционированием текста.

Конвертация текста в кривые как стратегия стабилизации

Одним из способов устранения проблем со шрифтами является преобразование текста в кривые на этапе экспорта из After Effects.

В этом случае текст теряет семантическую структуру и становится набором векторных контуров. В Lottie JSON такие элементы уже не зависят от шрифтовой системы.

Преимущества:

  • полная визуальная идентичность
  • отсутствие зависимости от загрузки шрифтов
  • стабильность в разных браузерах

Недостатки:

  • увеличение размера JSON
  • невозможность динамической замены текста
  • ухудшение производительности при сложных композициях

Влияние рендерера на отображение шрифтов

Lottie Web поддерживает несколько режимов рендеринга:

  • SVG
  • Canvas
  • HTML (DOM)

Каждый из них по-разному работает со шрифтами.

SVG-рендеринг

В SVG текст остаётся текстом <text> и зависит от CSS-правил и доступности шрифта в системе. Это наиболее чувствительный к отсутствию шрифтов режим.

Особенности:

  • точное позиционирование
  • высокая зависимость от font metrics
  • возможные сдвиги при загрузке шрифта

Canvas-рендеринг

В Canvas текст рисуется через fillText и strokeText. Здесь используется текущий шрифт canvas-контекста.

Особенности:

  • более стабильные размеры
  • меньше визуальных сдвигов
  • сложнее добиться идентичности с After Effects

HTML-рендеринг

DOM-режим использует обычные HTML-элементы. Шрифты полностью контролируются CSS.

Особенности:

  • максимальная гибкость
  • возможность анимации через CSS
  • зависимость от каскада стилей

Font Manager в Lottie Web

Внутренний модуль управления шрифтами выполняет несколько функций:

  • регистрация пользовательских шрифтов
  • сопоставление имен из JSON с реальными font-family
  • генерация временных стилей для DOM/SVG
  • управление fallback-логикой

При загрузке анимации создаётся карта:

fontName (JSON) → fontFamily (browser)

Если карта не задана явно, используется прямое совпадение имени.

Метрики шрифта и проблема несовпадений

Критический аспект работы с текстом в Lottie — различие метрик между средами After Effects и браузером.

Основные параметры:

  • ascent / descent
  • line-height
  • glyph advance width
  • kerning pairs

Даже при одинаковом font-family браузер может интерпретировать метрики иначе, что приводит к:

  • смещению ключевых кадров текста
  • нарушению масок и обрезок
  • рассинхронизации анимации по времени

Динамическая подмена шрифтов

В некоторых сценариях требуется заменить шрифт уже после загрузки анимации. Это возможно через обновление стилей или пересоздание текста.

Принцип работы:

  1. доступ к внутренней структуре анимации
  2. изменение font-family в текстовых слоях
  3. перерисовка сцены

Однако такие изменения не всегда синхронизируются с кэшированными вычислениями размеров текста, поэтому требуется принудительный ре-рендер слоя.

Поддержка многоязычных шрифтов

При использовании кириллицы, иероглифов или комбинированных наборов символов важна поддержка полного Unicode-контейнера.

Типичные проблемы:

  • отсутствие глифов в кастомном шрифте
  • fallback на системные шрифты с другим стилем
  • разная ширина символов в разных наборах

Решением становится использование шрифтов с расширенной кодировкой или предварительная проверка покрытия glyph set.

Оптимизация работы со шрифтами

Производительность рендеринга текста в Lottie зависит от количества текстовых слоёв и сложности шрифтовых вычислений.

Оптимизационные подходы:

  • минимизация количества уникальных шрифтов
  • использование одного font-family на композицию
  • кэширование измерений текста
  • отказ от динамического пересчёта layout при анимации

В Canvas-режиме особую роль играет частота вызовов перерисовки текста, так как каждый frame может инициировать перерасчёт glyph positioning.

Встраивание шрифтов в окружение выполнения

Для стабильного результата шрифты должны быть доступны до старта анимации. Это достигается через:

  • предварительную загрузку через CSS
  • использование FontFace API
  • локальное хранение и кеширование
  • подключение через CDN с контролем готовности

Пример загрузки через API:

const font = new FontFace('Roboto-Bold', 'url(/fonts/roboto-bold.woff2)');
await font.load();
document.fonts.add(font);

После этого Lottie Web может безопасно использовать данный шрифт без риска подмены.

Итоговые особенности поведения шрифтов в Lottie Web

Поведение текста определяется не только данными из JSON, но и совокупностью факторов:

  • доступность шрифтов в браузере
  • стратегия рендеринга
  • момент загрузки ресурсов
  • соответствие метрик оригинальному дизайну
  • наличие или отсутствие конвертации в кривые

Система остаётся чувствительной к окружению, поэтому корректная работа со шрифтами требует строгого контроля на всех этапах — от экспорта до выполнения анимации.