Работа с цветом в анимациях, экспортированных из Adobe After Effects через Bodymovin, ограничена исходными параметрами композиции. Однако библиотека Lottie Web предоставляет механизмы для динамического изменения цветовой палитры уже на этапе выполнения в браузере. Основными инструментами выступают эффекты Tint и различные подходы к Color Correction, реализуемые через JSON-анимацию и JavaScript.
Tint — это эффект, позволяющий заменить цвета изображения или анимации на основе градаций яркости. Он работает по принципу сопоставления:
В результате создаётся градиентное преобразование всей анимации.
В экспортированном JSON эффект Tint представлен в блоке
ef (effects) слоя:
Map Black To — цвет для тёмных пикселейMap White To — цвет для светлых пикселейAmount — интенсивность применения эффекта (0–100%)Пример структуры:
"ef": [
{
"ty": 20,
"nm": "Tint",
"ef": [
{
"ty": 2,
"nm": "Map Black To",
"v": { "k": [1, 0, 0, 1] }
},
{
"ty": 2,
"nm": "Map White To",
"v": { "k": [0, 1, 0, 1] }
},
{
"ty": 0,
"nm": "Amount",
"v": { "k": 100 }
}
]
}
]
Lottie Web поддерживает эффект Tint частично:
При использовании необходимо учитывать:
Lottie Web не предоставляет прямого API для изменения эффектов, но есть обходные пути:
Наиболее надёжный способ — модификация JSON:
animationData.layers[0].ef[0].ef[0].v.k = [0, 0, 1, 1]; // Map Black To
animationData.layers[0].ef[0].ef[1].v.k = [1, 1, 0, 1]; // Map White To
После этого анимация загружается:
lottie.loadAnimation({
container: document.getElementById('anim'),
renderer: 'svg',
loop: true,
autoplay: true,
animationData: animationData
});
Expressions в After Effects экспортируются в Lottie, но:
Поэтому для Tint этот способ нестабилен.
В Lottie Web отсутствует полноценная система цветокоррекции, как в After Effects. Однако есть несколько способов добиться похожего результата.
Цвета фигур задаются через свойства fill
(fl) и stroke (st):
"c": {
"k": [0.2, 0.6, 0.8, 1]
}
Изменение цвета:
animationData.layers[0].shapes[0].it[1].c.k = [1, 0, 0, 1];
Преимущество:
Недостаток:
При использовании SVG-рендерера возможно применение CSS:
#anim svg {
filter: hue-rotate(90deg) brightness(1.2) contrast(1.1);
}
Доступные фильтры:
hue-rotate()brightness()contrast()saturate()grayscale()Плюсы:
Минусы:
Можно внедрить SVG-фильтр вручную:
<filter id="colorShift">
<feColorMatrix type="matrix" values="
1 0 0 0 0
0 0 1 0 0
0 1 0 0 0
0 0 0 1 0"/>
</filter>
И применить:
document.querySelector('#anim svg').style.filter = 'url(#colorShift)';
Это позволяет:
| Метод | Гибкость | Производительность | Управляемость |
|---|---|---|---|
| Tint (JSON) | Средняя | Высокая | Средняя |
| Изменение fill/stroke | Высокая | Высокая | Высокая |
| CSS-фильтры | Низкая | Очень высокая | Низкая |
| SVG-фильтры | Очень высокая | Средняя | Высокая |
Изменение цветов под светлую/тёмную тему:
if (darkMode) {
animationData.layers.forEach(layer => {
// изменение fill цветов
});
}
Изменение цвета при hover:
element.addEventListener('mouseenter', () => {
svg.style.filter = 'brightness(1.2)';
});
Подмена цветовой схемы под бренд:
Типичная структура слоя:
layers → shapes → it → fill/stroke → color
Поиск нужного элемента:
function findFill(layer) {
return layer.shapes.find(s => s.ty === 'fl');
}
Базовый цвет задаётся в After Effects
Экспортируется в JSON
Модифицируется:
Tint остаётся вспомогательным инструментом, тогда как основная гибкость достигается через программную обработку структуры анимации.