В mo.js прозрачность рассматривается не как статический визуальный
атрибут, а как полноценный анимационный канал, равноправный с масштабом,
положением и цветом. Практически любой визуальный модуль библиотеки —
Shape, Burst, Html,
Tween — поддерживает управление непрозрачностью через
параметры, которые могут интерполироваться во времени.
Базовый уровень управления строится вокруг свойства
opacity. Оно принимает значения от 0 до 1 и может быть как
фиксированным, так и анимируемым:
const circle = new mojs.Shape({
shape: 'circle',
fill: '#ff4d4d',
radius: 40,
opacity: { 0: 1 }
});
В этом случае объект появляется из полной прозрачности и достигает полной видимости. mo.js автоматически строит кривую интерполяции между ключевыми состояниями.
Ключевая особенность mo.js — декларативное описание переходов. Прозрачность можно задавать в виде временной функции:
const fadeShape = new mojs.Shape({
shape: 'rect',
fill: '#4d79ff',
radius: 20,
opacity: { 1: 0 }
});
Такая запись означает линейное затухание объекта. При необходимости можно использовать более сложные конструкции с несколькими ключевыми точками:
opacity: { 0: 1, 50: 0.2, 100: 0 }
Здесь формируется нелинейное поведение: быстрый выход в видимость, затем резкое затухание.
mo.js разделяет визуальные каналы, что позволяет тонко контролировать восприятие формы:
opacity — общая прозрачность элементаfillOpacity — прозрачность заливкиstrokeOpacity — прозрачность обводкиconst shape = new mojs.Shape({
shape: 'polygon',
fill: '#00e5ff',
stroke: '#ffffff',
strokeWidth: 4,
fillOpacity: { 0: 1 },
strokeOpacity: { 1: 0 }
});
Такое разделение позволяет создавать эффекты «проявляющейся структуры», где контур исчезает быстрее или медленнее заливки, создавая ощущение глубины.
mo.js тесно интегрирует прозрачность с системой Timeline
и Tween. Это позволяет синхронизировать появление и
исчезновение элементов с другими анимационными параметрами.
const timeline = new mojs.Timeline();
const fadeIn = new mojs.Tween({
duration: 500,
onUpdate: (progress) => {
circle.el.style.opacity = progress;
}
});
const fadeOut = new mojs.Tween({
duration: 500,
delay: 500,
onUpdate: (progress) => {
circle.el.style.opacity = 1 - progress;
}
});
timeline.add(fadeIn, fadeOut);
timeline.play();
Хотя прямое управление через Tween используется реже,
оно даёт доступ к низкоуровневому контролю, особенно при сложных
композициях.
В mo.js существует концепция состояний isShowStart и
isShowEnd, которые автоматически управляют видимостью
элемента. Они часто используются в комбинации с opacity для упрощённой
логики появления:
const burst = new mojs.Burst({
radius: { 0: 100 },
count: 6,
children: {
shape: 'circle',
fill: '#ffcc00',
opacity: { 0: 1 }
}
});
Эффект появления часто комбинируется с масштабированием, где прозрачность усиливает ощущение «вспышки» или «взрыва».
mo.js поддерживает easing-функции, влияющие на характер изменения opacity. Это критично для визуального восприятия:
const smoothFade = new mojs.Shape({
shape: 'circle',
fill: '#7c4dff',
opacity: { 0: 1 },
easing: 'cubic.out'
});
Использование easing позволяет избежать линейной «механичности» и добиться более органичных переходов. Особенно часто применяются:
quad.out — резкое появление и мягкое затуханиеcubic.inOut — сбалансированная динамикаexpo.out — эффект вспышкиХотя mo.js не предоставляет отдельного API для blend modes, они
активно используются через CSS или кастомные рендереры. Основной
механизм — mix-blend-mode, применяемый к DOM-элементам,
которые генерирует библиотека в режиме Html.
const htmlShape = new mojs.Html({
el: '#dot',
opacity: { 0: 1 }
});
document.querySelector('#dot').style.mixBlendMode = 'screen';
В контексте анимаций mo.js чаще всего используются следующие режимы:
Усиливает затемнение пересечений слоёв. Подходит для теневых эффектов и плотных визуальных групп.
mix-blend-mode: multiply;
Обратный режим к multiply. Используется для свечения, вспышек, частиц.
mix-blend-mode: screen;
Комбинирует осветление и затемнение в зависимости от базового цвета фона. Часто используется для сложных визуальных эффектов.
Создаёт инверсионный эффект при пересечении слоёв. Используется редко, но даёт выразительные результаты в экспериментальной графике.
Прозрачность и режим наложения не являются независимыми параметрами. Их комбинация формирует итоговое восприятие слоя.
Например:
opacity + screen → яркие
вспышкиopacity + overlay → мягкая
текстураopacity + multiply → плотные
затемнённые формыconst glow = new mojs.Shape({
shape: 'circle',
fill: '#00ffff',
opacity: { 0: 0.8 }
});
glow.el.style.mixBlendMode = 'screen';
В системах частиц mo.js прозрачность играет ключевую роль в создании
«жизни» эффекта. Каждый дочерний элемент Burst может иметь
собственную кривую fade:
const burst = new mojs.Burst({
radius: { 0: 120 },
count: 10,
children: {
shape: 'circle',
radius: 5,
opacity: { 1: 0 },
easing: 'quad.out'
}
});
Здесь частицы не просто исчезают, а «растворяются», сохраняя физическую правдоподобность движения.
При работе с несколькими слоями важно учитывать каскадное влияние opacity. Родительский элемент и дочерние могут суммировать эффекты:
opacity: 0.5opacity: 0.5Это критично при сложных Timeline, где элементы
накладываются друг на друга.
Использование прозрачности вместе с blend modes позволяет создавать эффекты, которые выходят за пределы стандартной геометрической анимации:
Пример неонового эффекта:
const neon = new mojs.Shape({
shape: 'circle',
radius: 30,
fill: '#ff00ff',
opacity: { 0: 1 }
});
neon.el.style.mixBlendMode = 'screen';
neon.el.style.filter = 'blur(6px)';
В HTML-режиме mo.js прозрачность часто синхронизируется с DOM-стилями, что позволяет интегрировать библиотеку в существующие интерфейсы:
const element = document.querySelector('.box');
const anim = new mojs.Tween({
duration: 800,
onUpdate: (p) => {
element.style.opacity = p;
}
});
anim.play();
Этот подход используется, когда mo.js выступает как слой анимации поверх UI, а не как самостоятельная графическая система.
На практике часто возникают проблемы, связанные с некорректной комбинацией opacity и blend modes:
screen приводит к «выгоранию»
сценыfilter: blur() и blend modes может резко
увеличивать нагрузку на рендерингОптимизация обычно сводится к минимизации количества пересекающихся слоёв и контролю глубины анимационных групп.
При большом количестве анимируемых элементов opacity остаётся одним из самых дешёвых параметров с точки зрения GPU, так как может обрабатываться на уровне композитинга. Однако сочетание с:
blurmix-blend-modeможет переводить рендеринг в более дорогие режимы.
Рациональная структура сцены обычно предполагает:
В композициях mo.js прозрачность используется не только для исчезновения объектов, но и для моделирования глубины сцены. Более прозрачные элементы воспринимаются как находящиеся дальше, особенно при одновременном изменении масштаба и blur:
const depthLayer = new mojs.Shape({
shape: 'circle',
radius: 60,
opacity: { 0.2: 0.7 },
scale: { 0.8: 1.2 }
});
Такой подход создаёт псевдотрёхмерность без использования WebGL или сложных шейдеров.