Механизм stagger в библиотеке mo.js
используется для создания последовательных задержек анимаций внутри
групп объектов. В отличие от фиксированного delay, который
применяется одинаково ко всем элементам, stagger позволяет
задать смещение во времени между элементами, формируя
каскадные или волновые эффекты.
Такой подход особенно важен при работе с множественными анимациями: частицами, элементами интерфейса или сложными композициями.
В mo.js stagger реализуется через функцию
mojs.stagger(). Она возвращает значение, которое изменяется
для каждого элемента в последовательности.
Пример:
const circles = new mojs.Shape({
shape: 'circle',
count: 5,
delay: mojs.stagger(100)
});
count: 5 создаёт 5 элементов
mojs.stagger(100) задаёт задержку:
Таким образом формируется линейная последовательность запуска анимации.
Сигнатура:
mojs.stagger(step, options)
Позволяет задать начальную задержку:
delay: mojs.stagger(100, { start: 200 })
Результат:
Определяет, откуда начинается расчёт последовательности:
delay: mojs.stagger(100, { from: 'center' })
Варианты:
'start' — по умолчанию (с начала)'end' — с конца'center' — от центра к краям2)При count: 5:
Изменяет направление расчёта:
delay: mojs.stagger(100, { direction: -1 })
Результат:
Позволяет применять функцию сглаживания к распределению задержек:
delay: mojs.stagger(100, { easing: 'cubic.out' })
Это влияет не на саму анимацию, а на распределение задержек:
Используется при двумерных сетках:
delay: mojs.stagger(100, { grid: [3, 3], from: 'center' })
stagger часто применяется в Burst для
создания динамических эффектов:
const burst = new mojs.Burst({
count: 7,
delay: mojs.stagger(50),
children: {
shape: 'circle',
radius: { 10: 0 }
}
});
Эффект:
stagger можно использовать не только для
delay, но и для других параметров:
const shapes = new mojs.Shape({
count: 5,
delay: mojs.stagger(100),
x: mojs.stagger(20),
scale: mojs.stagger([1, 0.5])
});
каждый элемент имеет уникальные:
Можно задавать диапазон:
delay: mojs.stagger([0, 500])
mo.js автоматически распределяет значения между элементами.
С помощью easing и диапазонов можно создавать сложные
временные структуры:
delay: mojs.stagger([0, 1000], {
easing: 'quad.inout'
})
items.forEach((el, i) => {
new mojs.Html({
el: el,
delay: mojs.stagger(100)(i)
}).play();
});
Позволяет создать эффект “появления по очереди”.
delay: mojs.stagger(100, {
from: 'center'
})
Используется для:
delay: mojs.stagger(30)
Создаёт:
stagger вычисляется на этапе
инициализацииcount необходимо
пересоздавать анимациюИспользование stagger:
Однако при большом количестве элементов (100+) рекомендуется:
step)easing для delaystagger можно комбинировать с функциями:
delay: mojs.stagger(100, {
start: 200,
easing: (p) => Math.sin(p * Math.PI)
})
const timeline = new mojs.Timeline();
timeline.add([
new mojs.Burst({
delay: mojs.stagger(100)
}),
new mojs.Burst({
delay: mojs.stagger(200, { start: 500 })
})
]);
Позволяет строить сложные временные композиции.
delay: mojs.stagger(100)
Это не число, а функция-генератор. Она корректно работает только внутри mo.js.
Без count stagger не имеет смысла:
new mojs.Shape({
delay: mojs.stagger(100) // не будет работать как ожидается
});
delay: mojs.stagger(1000)
Может привести к:
Правильно настроенный stagger:
Неправильный:
stagger особенно эффективен в связке с
Timeline:
const timeline = new mojs.Timeline();
const anim = new mojs.Shape({
count: 5,
delay: mojs.stagger(100)
});
timeline.add(anim);
timeline.play();
Позволяет:
stagger для delay — ключевой инструмент
для:
Он превращает статичную группу элементов в динамическую систему с временной структурой, что является одной из фундаментальных особенностей анимационного движка mo.js.