Библиотека mo.js строит анимации вокруг набора унифицированных параметров, которые описывают поведение объектов во времени. Каждый эффект — это конфигурационный объект, в котором задаются геометрия, временные характеристики, трансформации и принципы повторного воспроизведения.
Ключевая идея заключается в том, что любая анимация описывается декларативно: значения параметров определяют траекторию и динамику, а движок интерпретирует их в виде последовательности кадров.
Параметр duration определяет длительность одного цикла
анимации в миллисекундах.
const anim = new mojs.Shape({
duration: 1000
});
Чем больше значение, тем более растянутым становится переход между начальным и конечным состоянием. В контексте интерфейсных эффектов малые значения (200–400 мс) применяются для микровзаимодействий, тогда как более длинные (800–2000 мс) используются для выразительных сценических эффектов.
delay задаёт задержку перед стартом анимации.
const anim = new mojs.Shape({
delay: 300
});
Задержка применяется для построения последовательных сценариев, где элементы появляются с временным сдвигом. В сложных композициях delay становится инструментом управления иерархией движения.
Параметр repeat определяет количество повторов анимации
после первого запуска.
const anim = new mojs.Shape({
repeat: 2
});
Значение -1 используется для бесконечного повторения.
Повторы применяются в циклических интерфейсных индикаторах и
декоративных эффектах.
yoyo управляет направлением повторного воспроизведения.
При включении анимация разворачивается обратно к начальному состоянию,
формируя симметричный цикл.
const anim = new mojs.Shape({
duration: 800,
repeat: 3,
yoyo: true
});
Такой режим снижает резкость переходов и часто используется в пульсирующих эффектах, где требуется возвратно-поступательное движение.
Параметры x и y управляют смещением объекта
относительно исходной позиции.
const anim = new mojs.Shape({
x: 100,
y: -50
});
Значения могут быть фиксированными или анимируемыми. При использовании анимации смещения формируется линейная или нелинейная траектория движения.
angle задаёт поворот объекта в градусах.
const anim = new mojs.Shape({
angle: 180
});
В анимационном контексте вращение часто комбинируется с масштабированием и изменением прозрачности, создавая эффект динамической трансформации формы.
radius определяет размер формы, особенно актуален для
круговых и радиальных элементов.
const anim = new mojs.Shape({
radius: 50
});
При анимации радиуса создаются эффекты расширения, импульса или взрыва.
scale изменяет масштаб объекта относительно его базового
состояния.
const anim = new mojs.Shape({
scale: { 0: 1 }
});
Использование объектной записи позволяет задать интерполяцию от начального к конечному значению. Масштабирование часто применяется для появления и исчезновения элементов.
Параметр opacity контролирует степень видимости
объекта.
const anim = new mojs.Shape({
opacity: { 0: 1 }
});
Плавное изменение прозрачности является базовым механизмом построения эффектов fade-in и fade-out. В сочетании с scale создаётся эффект «появления из точки».
fill задаёт внутренний цвет фигуры, а
stroke — цвет контура.
const anim = new mojs.Shape({
fill: "cyan",
stroke: "blue",
strokeWidth: 3
});
Эти параметры могут изменяться во времени, создавая эффект смены состояния объекта.
mo.js поддерживает объектную форму записи значений, позволяющую задавать ключевые состояния анимации.
const anim = new mojs.Shape({
x: { 0: 200 },
opacity: { 0: 1 },
scale: { 0.5: 1.2 }
});
Такая запись интерпретируется как переход от начального значения к конечному. В более сложных случаях допускается многоступенчатая интерполяция:
const anim = new mojs.Shape({
x: { 0: 100, 200: -50, 400: 0 }
});
Каждая пара ключ-значение формирует промежуточную точку кривой движения.
Параметр easing определяет математическую функцию
ускорения и замедления.
const anim = new mojs.Shape({
duration: 1000,
easing: "ease.out"
});
Наиболее часто применяются:
Функции сглаживания влияют на восприятие физики движения, создавая ощущение массы, инерции и сопротивления среды.
В групповых анимациях применяется принцип смещения параметров между
элементами. Хотя сам stagger чаще относится к композиции,
его эффект проявляется в распределении значений delay,
duration и x/y.
const timeline = new mojs.Timeline();
const shape1 = new mojs.Shape({ delay: 0 });
const shape2 = new mojs.Shape({ delay: 100 });
const shape3 = new mojs.Shape({ delay: 200 });
timeline.add(shape1, shape2, shape3);
Такой подход формирует каскадное появление объектов, где временная структура становится визуальным ритмом.
Комбинация нескольких параметров в одном объекте формирует сложные
анимационные состояния. Например, одновременное изменение
scale, opacity и angle создаёт
эффект трансформации:
const anim = new mojs.Shape({
duration: 1200,
x: { 0: 150 },
scale: { 0: 1 },
angle: { 0: 360 },
opacity: { 0: 1 },
easing: "cubic.out"
});
Каждый параметр интерполируется независимо, но синхронизируется по времени, формируя единое движение.
mo.js использует условные единицы, где:
Такое разделение упрощает комбинирование параметров без необходимости ручной конвертации единиц.
Параметры могут задаваться функциями, возвращающими значения во время инициализации анимации.
const anim = new mojs.Shape({
x: () => Math.random() * 300,
duration: () => 500 + Math.random() * 1000
});
Функциональная форма используется для создания вариативных эффектов, где каждый запуск анимации отличается от предыдущего.
Каждый параметр в mo.js привязан к внутреннему таймеру анимации.
Изменения вычисляются на основе нормализованного времени
t ∈ [0,1], которое затем преобразуется через
easing-функцию. После этого итоговое значение интерполируется между
заданными ключевыми точками.
Такая модель позволяет одновременно управлять множеством параметров без потери синхронизации, даже при сложных композициях из десятков объектов.
В сложных сценах параметры начинают взаимодействовать друг с другом:
scale визуально усиливает эффект изменения
opacityangle влияет на восприятие траектории
x/ydelay формирует иерархию движенияКомбинация этих эффектов создаёт многослойные анимационные структуры, в которых каждый параметр выполняет отдельную функциональную роль, но итоговый результат воспринимается как единое движение.