В экосистеме Lottie Web отсутствует нативный механизм морфинга между двумя разными JSON-анимациями как единого математического преобразования форм. Каждая Lottie-анимация представляет собой набор слоёв, ключевых кадров и векторных контуров, экспортированных из After Effects через Bodymovin, и интерпретируется как независимая сцена. Поэтому под морфингом в контексте Lottie Web понимается набор техник, имитирующих непрерывный переход между состояниями анимации.
Ключевая сложность заключается в различии структур: даже визуально похожие формы могут иметь несопоставимую иерархию слоёв, количество точек path и наборы анимационных кривых. Это исключает прямую интерполяцию между JSON-структурами без предварительной унификации контента.
Библиотека lottie-web оперирует готовым деревом
анимационных элементов, где каждая композиция фиксируется на этапе
экспорта. Основные ограничения:
В результате любые переходы между анимациями реализуются через композиционные приёмы, а не через встроенный morph-engine.
Наиболее распространённый способ имитации морфинга заключается в наложении двух Lottie-инстансов и управлении их прозрачностью.
Создаются два независимых экземпляра:
const animA = lottie.loadAnimation({
container: containerA,
renderer: 'svg',
loop: false,
autoplay: true,
animationData: dataA
});
const animB = lottie.loadAnimation({
container: containerB,
renderer: 'svg',
loop: false,
autoplay: false,
animationData: dataB
});
Переход реализуется через синхронное управление прогрессом и opacity контейнеров:
containerA.style.opacity = 1;
containerB.style.opacity = 0;
animB.goToAndPlay(0, true);
function transition(progress) {
containerA.style.opacity = 1 - progress;
containerB.style.opacity = progress;
}
Преимущество подхода заключается в предсказуемости результата. Однако визуально морфинг ограничен лишь прозрачным наложением, без деформации контуров.
Lottie Web поддерживает проигрывание фрагментов анимации через
playSegments. Этот механизм позволяет объединять разные
состояния внутри одной композиции, что является более устойчивым
способом переходов.
anim.playSegments([0, 30], true);
При проектировании в After Effects создаются переходные сцены внутри одной композиции, где:
Такая техника фактически переносит задачу морфинга на этап анимационного дизайна, полностью избегая необходимости объединения JSON.
Для более близкого к морфингу результата применяется подготовка shape layers в исходном проекте:
При экспорте Bodymovin сохраняет возможность интерполяции между ключевыми кадрами path внутри одной композиции.
Если два состояния находятся внутри одного shape layer, Lottie способен интерполировать их как:
Это единственный способ получить настоящий morph-like эффект в рамках Lottie.
При необходимости смены одной анимации на другую без резкого разрыва применяется стратегия мягкой замены экземпляра.
const oldAnim = lottie.loadAnimation({
container,
renderer: 'svg',
animationData: dataA
});
function swap(newData) {
const currentFrame = oldAnim.currentFrame;
const newAnim = lottie.loadAnimation({
container,
renderer: 'svg',
animationData: newData,
autoplay: false
});
newAnim.goToAndStop(0, true);
oldAnim.destroy();
newAnim.play();
}
Недостаток метода — отсутствие визуальной непрерывности. Однако при правильной синхронизации кадров создаётся ощущение логического перехода состояния.
При использовании SVG-рендерера можно управлять DOM-структурой анимации, что открывает возможность более тонкого контроля переходов.
Каждый Lottie-инстанс создаёт набор SVG-элементов:
<path><g><mask><clipPath>Эти элементы могут быть анимированы дополнительно через CSS:
containerA.style.transition = 'opacity 400ms linear';
containerB.style.transition = 'opacity 400ms linear';
Дополнительно возможно применение трансформаций:
containerA.style.transform = 'scale(1)';
containerB.style.transform = 'scale(1.1)';
Комбинация масштабирования и прозрачности создаёт иллюзию пространственного перехода между формами.
Более сложный вариант заключается в синхронном управлении прогрессом двух Lottie-инстансов.
function sync(progress) {
animA.goToAndStop(progress * animA.totalFrames, true);
animB.goToAndStop(progress * animB.totalFrames, true);
}
При этом важно, чтобы обе анимации были выровнены по длительности или приведены к единому временно́му масштабу:
Иначе синхронизация теряет визуальную согласованность.
В профессиональных пайплайнах часто создаётся третья анимация, которая выступает мостом между двумя состояниями.
Структура выглядит как цепочка:
Каждая из частей представляет собой отдельный JSON, но переход осуществляется внутри одной логики переключения сегментов.
anim.playSegments([0, 40], true); // A
anim.playSegments([40, 70], true); // transition
anim.playSegments([70, 120], true); // B
Такой подход позволяет контролировать морфинг как управляемую сцену, а не как автоматическую интерполяцию.
В SVG-рендерере возможно динамическое управление видимостью отдельных слоёв:
anim.addEventListener('DOMLoaded', () => {
const layers = anim.renderer.elements;
layers.forEach(layer => {
if (layer.data.nm === 'Shape Layer 1') {
layer.hide();
}
});
});
Хотя API не документирует полноценную работу с внутренними слоями, доступ к ним позволяет реализовывать псевдоморфинг через поэтапное раскрытие геометрии.
Маскирование применяется для создания эффекта «растворения формы», когда одна анимация постепенно проявляет другую.
.mask {
overflow: hidden;
clip-path: circle(0% at 50% 50%);
transition: clip-path 600ms ease;
}
При расширении маски одна форма заменяется другой без резкого скачка.
Для получения стабильного визуального результата критично соблюдение архитектурных правил при создании анимаций:
Без этой подготовки любые техники морфинга превращаются в визуально несогласованные переходы.
Наиболее устойчивый результат достигается сочетанием нескольких методов одновременно:
Такой многослойный подход компенсирует отсутствие нативного morph
engine в lottie-web и позволяет строить сложные визуальные
переходы между состояниями интерфейса или сценами анимации.