В формате Lottie прозрачность слоя описывается через параметр
opacity, который в JSON-структуре анимации представлен
как свойство o внутри блока трансформации ks.
Значение задаётся в диапазоне от 0 до 100, где
0 означает полную прозрачность, а 100 — полную
непрозрачность.
"ks": {
"o": {
"k": 100
}
}
Если значение является анимированным, структура принимает форму массива ключевых кадров:
"o": {
"k": [
{
"t": 0,
"s": [100],
"e": [0]
},
{
"t": 20,
"s": [0]
}
]
}
В таком случае opacity становится временной функцией, управляемой кривыми интерполяции, заданными в After Effects и экспортированными в JSON.
В библиотеке Lottie Web нет прямого публичного метода изменения opacity слоя в рантайме, так как вся анимация интерпретируется как заранее вычисленная система ключевых кадров. Контроль прозрачности реализуется косвенными методами.
Одним из базовых способов влияния на визуальную прозрачность является управление прогрессом анимации:
const anim = lottie.loadAnimation({
container: document.getElementById('box'),
renderer: 'svg',
loop: false,
autoplay: false,
path: 'animation.json'
});
anim.goToAndStop(10, true);
Изменяя кадр, можно фактически переключать состояние opacity, если оно заложено в ключевых кадрах композиции.
При использовании renderer: "svg" каждая композиция
превращается в набор DOM-элементов. Это позволяет вмешиваться в итоговый
рендеринг через CSS.
Самый грубый и стабильный способ:
const container = document.getElementById('box');
container.style.opacity = 0.5;
Этот метод влияет на всю анимацию целиком, не затрагивая внутреннюю структуру Lottie.
В SVG-режиме каждый слой получает отдельный g-элемент.
Через инспектор DOM можно обнаружить структуру:
<g data-name="Layer 1"></g>
Далее возможно прямое изменение прозрачности:
const layer = document.querySelector('[data-name="Layer 1"]');
layer.style.opacity = 0.2;
Такой подход применим только при стабильной структуре экспорта и отсутствии динамического пересоздания DOM.
Параметр «видимость» в Lottie не существует как отдельное публичное свойство. Вместо него используется комбинация механизмов:
ip и op)hidden слои
(hd)oКаждый слой имеет параметры начала и конца жизни:
"ip": 0,
"op": 60
Слой отображается только в пределах этого диапазона. За его пределами он фактически невидим.
В рантайме Lottie Web отсутствует стабильный API скрытия конкретного слоя, однако поведение можно имитировать несколькими способами.
function hideAnimation(anim) {
anim.setSpeed(1);
anim.goToAndStop(anim.currentFrame, true);
anim.renderer.elements.forEach(el => {
if (el?.updateDocumentData) {
el.baseElement.style.opacity = 0;
}
});
}
Доступ к renderer.elements относится к внутренним
структурам и не гарантируется между версиями, но отражает реальный
механизм отрисовки.
let anim;
function show() {
anim = lottie.loadAnimation({
container: document.getElementById('box'),
renderer: 'svg',
loop: true,
autoplay: true,
path: 'animation.json'
});
}
function hide() {
anim.destroy();
anim = null;
}
Такой подход полностью убирает DOM-структуру анимации, что эквивалентно visibility: hidden на уровне всей композиции.
При использовании renderer: "canvas" вся композиция
отрисовывается на <canvas>, и управление opacity
через DOM невозможно.
const anim = lottie.loadAnimation({
container: document.getElementById('box'),
renderer: 'canvas',
loop: true,
autoplay: true,
path: 'animation.json'
});
document.getElementById('box').style.opacity = 0.3;
В этом режиме изменение opacity применяется только к canvas-элементу как к текстуре, без доступа к слоям.
Режим renderer: "html" создаёт структуру из DOM-блоков.
В отличие от SVG, элементы чаще представлены
<div>-контейнерами, что делает управление visibility
более предсказуемым через CSS:
const anim = lottie.loadAnimation({
container: document.getElementById('box'),
renderer: 'html',
loop: true,
autoplay: true,
path: 'animation.json'
});
document.querySelector('#box > div').style.visibility = 'hidden';
Различие между visibility: hidden и
opacity: 0:
opacity: 0 сохраняет интерактивную областьvisibility: hidden полностью исключает элемент из
визуального потокаХотя Lottie Web не предоставляет прямого метода для изменения keyframe opacity, можно эмулировать плавные переходы через внешнюю анимацию контейнера.
function fadeOut(element, duration) {
let start = performance.now();
function animate(time) {
let progress = (time - start) / duration;
if (progress > 1) progress = 1;
element.style.opacity = 1 - progress;
if (progress < 1) {
requestAnimationFrame(animate);
}
}
requestAnimationFrame(animate);
}
Применение:
const container = document.getElementById('box');
fadeOut(container, 500);
Изменение opacity на уровне контейнера или слоя влияет на compositing pipeline браузера:
Наиболее дешёвым с точки зрения производительности считается изменение opacity у контейнера, содержащего canvas, так как оно обрабатывается GPU-композитингом без пересчёта сцены.
В Lottie Web можно управлять видимостью косвенно через сегменты воспроизведения:
anim.playSegments([0, 30], true);
Или исключение части анимации:
anim.playSegments([30, 60], true);
Если ключевые кадры opacity заложены в определённые диапазоны, такой метод становится эквивалентом переключения видимости состояний.
В реальных сценариях применяется комбинация нескольких уровней управления:
function setAnimationState(anim, state) {
const container = anim.wrapper;
if (state === 'hidden') {
container.style.opacity = 0;
}
if (state === 'visible') {
container.style.opacity = 1;
}
if (state === 'disabled') {
anim.destroy();
}
}
При зацикливании анимации (loop: true) opacity, заданный
внутри JSON, будет повторяться синхронно с циклами. Это приводит к
повторяющимся фазам:
Такое поведение важно учитывать при комбинировании с внешним CSS-opacity, так как итоговое значение становится произведением двух уровней прозрачности: внутреннего и внешнего.