Работа с именованными маркерами в Lottie Web опирается на механизм меток (markers), которые задаются на этапе создания анимации и экспортируются в JSON-файл. Маркеры позволяют разбивать анимацию на логические сегменты, к которым можно обращаться по имени, а не по числовым кадрам. Это критично для сложных интерфейсных анимаций, где требуется управление состояниями, переходами и интерактивными сценариями.
После экспорта из After Effects в JSON файл Lottie содержит секцию
markers, если они были заданы в композиции. Каждый маркер
описывает именованный участок времени.
Типичная структура:
"markers": [
{
"tm": 0,
"dr": 30,
"cm": "start"
},
{
"tm": 30,
"dr": 45,
"cm": "loading"
},
{
"tm": 75,
"dr": 25,
"cm": "success"
}
]
Ключевые поля:
Именование маркеров становится основой для управления анимацией на уровне логики приложения.
Использование строковых идентификаторов вместо числовых диапазонов решает несколько проблем:
Пример логических состояний:
idleloadingsuccesserrorТакая модель превращает анимацию в конечный автомат.
После инициализации анимации через lottie.loadAnimation
объект анимации содержит данные JSON, включая маркеры.
const animation = lottie.loadAnimation({
container: document.getElementById('anim'),
renderer: 'svg',
loop: false,
autoplay: false,
path: 'animation.json'
});
Доступ к маркерам:
animation.addEventListener('DOMLoaded', () => {
console.log(animation.markers);
});
Каждый элемент массива содержит:
Основной способ работы с именованными маркерами — переход к сегменту по его имени.
animation.goToAndPlay('loading', true);
Здесь второй аргумент определяет интерпретацию значения:
true — значение трактуется как имя маркераfalse — значение трактуется как кадрПереход останавливается на границах маркера и воспроизводит сегмент.
Метод playSegments позволяет проигрывать диапазоны,
включая именованные маркеры.
animation.playSegments(['loading', 'success'], true);
Поведение:
true активирует интерпретацию именЭто особенно полезно для переходных анимаций, где важно проиграть строго ограниченный участок.
Именованные маркеры часто используются как слой управления UI состояниями.
Пример модели:
function setState(state) {
switch (state) {
case 'idle':
animation.goToAndStop('idle', true);
break;
case 'loading':
animation.goToAndPlay('loading', true);
break;
case 'success':
animation.playSegments(['loading', 'success'], true);
break;
case 'error':
animation.goToAndPlay('error', true);
break;
}
}
Такой подход позволяет полностью абстрагироваться от кадров.
Именованные маркеры могут использоваться как триггеры событий.
animation.addEventListener('enterFrame', () => {
const currentFrame = animation.currentFrame;
animation.markers.forEach(marker => {
if (currentFrame === marker.time) {
console.log('Вход в маркер:', marker.name);
}
});
});
Хотя более эффективным является контроль через явные вызовы переходов, а не через отслеживание кадров.
Именованные маркеры позволяют строить динамические сценарии:
Пример цепочки:
animation.goToAndPlay('loading', true);
animation.addEventListener('complete', () => {
animation.goToAndPlay('success', true);
});
Частые проблемы:
animation.goToAndPlay('Loadng', true); // ошибка: опечатка
Имена чувствительны к точному совпадению.
Если экспорт не содержит секцию markers, вызовы по имени
не работают:
animation.markers // undefined или []
При использовании false во втором аргументе:
animation.goToAndPlay('loading', false);
значение трактуется как кадр, что приводит к некорректному поведению.
Для устойчивой архитектуры анимаций используется строгая система именования:
state_idle,
state_loadingaction_open, action_closeresult_success,
result_errorЭто снижает риск конфликтов и повышает читаемость JSON.
В компонентных системах именованные маркеры становятся связующим слоем между состоянием компонента и визуальной анимацией.
class Loader {
constructor(animation) {
this.animation = animation;
}
setLoading(isLoading) {
if (isLoading) {
this.animation.goToAndPlay('loading', true);
} else {
this.animation.goToAndPlay('idle', true);
}
}
}
Такой подход делает анимацию реактивной по отношению к состоянию.
Именованные маркеры особенно эффективны в следующих случаях:
Несмотря на гибкость, модель имеет ограничения:
При включенном loop поведение маркеров может терять предсказуемость:
animation.loop = true;
animation.goToAndPlay('loading', true);
В таком случае сегмент будет повторяться внутри заданных границ, если не управлять loop на уровне сегмента.
Именованные маркеры часто используются вместе с прямыми диапазонами:
animation.playSegments([10, 50], true);
animation.playSegments(['loading', 'success'], true);
Это позволяет постепенно мигрировать от числовой модели к семантической.
При масштабных проектах используется принцип:
Такой подход снижает стоимость изменений и упрощает поддержку анимаций в долгосрочной перспективе.