В основе анимационного поведения mo.js лежит управление изменением параметров во времени. Любое движение, трансформация, появление или исчезновение объекта описывается не линейным переходом, а функцией изменения — кривой. Именно кривые определяют характер анимации: резкость старта, плавность замедления, упругость, инерцию, динамику разлёта частиц и траектории движения.
Кривые в mo.js можно разделить на две фундаментальные категории:
Обе категории работают совместно, формируя итоговое поведение анимации.
Easing-кривые определяют, как значение параметра изменяется от начального к конечному во времени. В mo.js каждая анимация по умолчанию использует easing-функцию, даже если она не указана явно.
Линейное изменение:
new mojs.Tween({
duration: 1000,
onUpdate: (progress) => {
// progress изменяется линейно от 0 до 1
}
});
Линейность в анимации редко используется напрямую, так как она создаёт механическое и неестественное движение.
mo.js включает набор стандартных кривых, основанных на классических функциях плавности. Они определяют характер изменения прогресса анимации:
linearease.inease.outease.in.outelastic.outbounce.outback.inback.outКаждая кривая представляет собой математически заданное
преобразование интервала [0, 1].
Пример применения:
new mojs.Tween({
duration: 800,
easing: 'elastic.out',
onUpdate: (p) => {
// p изменяется по нелинейной кривой с "перелётом"
}
});
Форма, при которой движение начинается медленно и ускоряется к концу. Математически это выпуклая кривая.
Характер:
Противоположный эффект: быстрое начало и плавное торможение.
Характер:
Комбинированная кривая:
Используется как универсальная базовая форма.
mo.js позволяет задавать собственные кривые через функцию или параметризацию.
Функциональный easing:
const customEasing = (p) => {
return Math.pow(p, 3) * Math.sin(p * Math.PI);
};
new mojs.Tween({
duration: 1000,
easing: customEasing
});
Такая форма позволяет создавать нелинейные, физически правдоподобные или стилизованные движения.
Большинство easing-функций в mo.js основаны на кубических Bézier-кривых. Они задаются четырьмя контрольными точками:
Форма кривой определяется положением двух внутренних контрольных точек.
Пример:
easing: 'cubic-bezier(0.25, 0.1, 0.25, 1)'
Смысл параметров:
Кривая фактически задаёт функцию:
Это позволяет:
Помимо временных easing-кривых, mo.js поддерживает движение по траекториям. Это второй тип кривых — геометрические.
new mojs.Html({
el: '.box',
x: { 0: 300 },
y: { 0: 200 },
easing: 'linear'
});
При добавлении сложных зависимостей координат движение перестаёт быть линейным и формирует траекторию.
mo.js поддерживает движение по заранее заданной кривой пути, чаще всего основанной на SVG.
new mojs.Html({
el: '.dot',
path: 'M0,0 C100,200 200,-100 300,0',
duration: 1200
});
Здесь движение определяется не отдельными координатами, а непрерывной кривой Безье.
SVG path использует те же принципы кубических кривых:
Кривая интерпретируется как функция положения объекта во времени.
Сложные анимации в mo.js часто строятся на наложении двух уровней кривых:
Пример эффекта:
В Burst-модуле mo.js кривые используются для управления
разлётом частиц.
new mojs.Burst({
radius: { 0: 100 },
count: 10,
children: {
shape: 'circle',
radius: 5,
easing: 'quad.out'
}
});
Здесь кривая влияет на:
Некоторые эффекты mo.js используют кривые для изменения не только позиции, но и параметров формы:
Пример:
new mojs.Shape({
shape: 'circle',
scale: { 0: 1 },
opacity: { 0: 1 },
easing: 'elastic.out'
});
Кривая здесь задаёт амплитуду изменения параметров.
mojs.Timeline позволяет синхронизировать несколько
анимаций, каждая из которых имеет собственную кривую, но общая временная
ось также может быть нелинейной.
const timeline = new mojs.Timeline();
timeline.add(
new mojs.Tween({ duration: 1000, easing: 'ease.out' }),
new mojs.Tween({ duration: 500, easing: 'back.out' })
);
Комбинация кривых формирует сложное поведение композиции.
В сложных сценах mo.js кривые накладываются друг на друга:
Результирующее движение является суперпозицией всех уровней.
Внутри движка кривые не вычисляются непрерывно, а дискретизируются по кадрам:
Это позволяет поддерживать производительность при сложных траекториях.
Кривые mo.js можно интерпретировать как упрощённые физические модели:
Такое представление позволяет строить анимации без явной физической симуляции, но с визуально схожим поведением.