Композиция эффектов в библиотеке mo.js строится на
объединении нескольких анимационных объектов в единое синхронизированное
поведение. Базовыми строительными блоками выступают классы
Shape, ShapeSwirl, Burst,
Html, а также таймлайны (Timeline),
позволяющие координировать сложные сценарии.
Ключевая идея — разделение анимации на независимые элементы с последующим управлением их взаимодействием через общие временные параметры.
Timeline объединяет несколько анимаций в одну
структуру:
const timeline = new mojs.Timeline();
const circle = new mojs.Shape({
shape: 'circle',
radius: { 0: 50 },
fill: 'red',
duration: 500
});
const rect = new mojs.Shape({
shape: 'rect',
radius: { 0: 40 },
fill: 'blue',
duration: 500
});
timeline.add(circle, rect);
timeline.play();
Особенности:
delay) для каждого
элементаДля создания последовательных эффектов используется смещение по времени:
const timeline = new mojs.Timeline();
const first = new mojs.Shape({
shape: 'circle',
radius: { 0: 30 },
duration: 400
});
const second = new mojs.Shape({
shape: 'rect',
radius: { 0: 30 },
delay: 400,
duration: 400
});
timeline.add(first, second).play();
Подход:
delay, равный
длительности предыдущейКомбинирование параллельных и последовательных элементов позволяет создавать более сложные сценарии:
const timeline = new mojs.Timeline();
const burst = new mojs.Burst({
radius: { 0: 100 },
count: 10,
duration: 600
});
const circle = new mojs.Shape({
shape: 'circle',
radius: { 0: 50 },
delay: 300,
duration: 500
});
timeline.add(burst, circle).play();
Здесь:
Burst начинается сразуShape стартует в середине первой анимацииПовторяющиеся элементы можно анимировать с небольшими задержками:
const burst = new mojs.Burst({
count: 5,
radius: { 0: 80 },
children: {
shape: 'circle',
delay: 'stagger(100)',
duration: 400
}
});
burst.play();
Результат:
Анимации могут включать другие анимации как логические группы:
const innerTimeline = new mojs.Timeline();
innerTimeline.add(
new mojs.Shape({ radius: { 0: 20 }, duration: 300 }),
new mojs.Shape({ radius: { 20: 0 }, duration: 300, delay: 300 })
);
const mainTimeline = new mojs.Timeline();
mainTimeline.add(innerTimeline).play();
Преимущества:
Композиция становится выразительнее при согласовании кривых ускорения:
const shape1 = new mojs.Shape({
radius: { 0: 50 },
easing: 'cubic.out'
});
const shape2 = new mojs.Shape({
radius: { 0: 50 },
easing: 'elastic.out'
});
Комбинирование:
cubic) + упругие (elastic)back, bounce)Контраст easing-функций усиливает визуальный эффект.
mo.js позволяет синхронизировать параметры:
const base = new mojs.Shape({
radius: { 0: 50 }
});
const dependent = new mojs.Shape({
radius: { 0: base.radius },
delay: 200
});
Чаще используется косвенно через одинаковые значения:
x, y)Для сложных эффектов важно управлять общей точкой:
const x = 200;
const y = 200;
const burst = new mojs.Burst({ x, y });
const circle = new mojs.Shape({ x, y });
new mojs.Timeline().add(burst, circle).play();
Это создаёт ощущение единого события.
Композиция часто строится вокруг комбинации transform-свойств:
new mojs.Shape({
scale: { 0: 1 },
rotate: { 0: 180 },
opacity: { 1: 0 }
});
Комбинации:
Сложные композиции требуют контроля:
duration — длительностьdelay — задержкаrepeat — повторyoyo — обратное воспроизведениеnew mojs.Shape({
radius: { 0: 50 },
duration: 500,
repeat: 2,
yoyo: true
});
Композиция может строиться программно:
const timeline = new mojs.Timeline();
for (let i = 0; i < 5; i++) {
timeline.add(new mojs.Shape({
x: i * 20,
delay: i * 100,
radius: { 0: 20 }
}));
}
timeline.play();
Преимущества:
Часто используется для создания “взрывов”:
const burst = new mojs.Burst({
count: 8,
radius: { 0: 100 }
});
const center = new mojs.Shape({
radius: { 0: 30 },
fill: 'yellow',
duration: 400
});
new mojs.Timeline().add(burst, center).play();
Логика:
Эффекты могут запускаться по событиям:
document.addEventListener('click', (e) => {
new mojs.Burst({
x: e.pageX,
y: e.pageY
}).play();
});
Добавление нескольких эффектов создаёт сложную реакцию:
document.addEventListener('click', (e) => {
const timeline = new mojs.Timeline();
timeline.add(
new mojs.Burst({ x: e.pageX, y: e.pageY }),
new mojs.Shape({ x: e.pageX, y: e.pageY })
).play();
});
Композиции удобно оформлять в функции:
function createExplosion(x, y) {
return new mojs.Timeline().add(
new mojs.Burst({ x, y }),
new mojs.Shape({ x, y })
);
}
createExplosion(100, 100).play();
При большом количестве элементов важно:
durationisShowStart: false1. Всплеск (Burst + fade):
2. Волна:
3. Пульсация:
4. Каскад:
const t1 = new mojs.Timeline().add(
new mojs.Shape({ radius: { 0: 20 } })
);
const t2 = new mojs.Timeline().add(
new mojs.Shape({ radius: { 20: 0 } })
);
const master = new mojs.Timeline();
master.add(t1, t2).play();
Такой подход позволяет:
Методы:
play()pause()replay()setProgress()timeline.setProgress(0.5);
Это даёт возможность:
Html-класс позволяет анимировать реальные элементы:
new mojs.Html({
el: '#element',
x: { 0: 100 },
opacity: { 1: 0 }
}).play();
Композиция может включать:
Композиция может учитывать логические зависимости:
shape1.then({
radius: { 50: 0 }
});
При построении сложных эффектов важно:
Композиция в mo.js — это не просто объединение анимаций, а проектирование временной и визуальной структуры, где каждая часть усиливает общую динамику.