Повторение (repeat) — один из ключевых инструментов управления жизненным циклом анимации в библиотеке mo.js. Он позволяет воспроизводить анимацию несколько раз без ручного перезапуска, обеспечивая компактный и выразительный код.
repeatСвойство repeat определяет, сколько дополнительных раз
будет воспроизведена анимация после первого запуска.
const circle = new mojs.Shape({
shape: 'circle',
radius: { 0: 50 },
duration: 1000,
repeat: 2
});
Особенности:
repeat: 2 означает, что анимация выполнится
3 раза всего (1 начальный + 2 повтора)repeat равен 0 (без
повторений)yoyoДля создания эффекта возврата используется yoyo. При
включении анимация будет проигрываться вперёд и назад.
const circle = new mojs.Shape({
radius: { 0: 50 },
duration: 1000,
repeat: 2,
yoyo: true
});
Поведение:
Для создания пауз между циклами используется
repeatDelay.
const circle = new mojs.Shape({
radius: { 0: 50 },
duration: 1000,
repeat: 3,
repeatDelay: 500
});
Что происходит:
delay и repeatDelaydelay — задержка перед первым запускомrepeatDelay — задержка между повторамиconst circle = new mojs.Shape({
radius: { 0: 50 },
duration: 1000,
delay: 300,
repeat: 2,
repeatDelay: 400
});
Порядок выполнения:
Для бесконечного воспроизведения используется значение
Infinity.
const pulse = new mojs.Shape({
radius: { 20: 40 },
duration: 800,
repeat: Infinity,
yoyo: true
});
Применение:
При использовании mojs.Timeline повтор можно задавать
как на уровне отдельных анимаций, так и для всей временной шкалы.
const shape1 = new mojs.Shape({
radius: { 0: 30 },
duration: 500
});
const shape2 = new mojs.Shape({
radius: { 30: 0 },
duration: 500
});
const timeline = new mojs.Timeline({
repeat: 2
});
timeline.add(shape1, shape2);
timeline.play();
Особенности:
При сочетании repeat и yoyo важно
учитывать:
| Свойство | Эффект |
|---|---|
| repeat | Количество повторений |
| yoyo: false | Всегда одно направление |
| yoyo: true | Чередование направлений |
Значение repeat можно изменять программно:
const shape = new mojs.Shape({
radius: { 0: 50 },
duration: 1000
});
shape.play();
shape.repeat(3);
Также доступны методы управления:
play() — запускpause() — паузаstop() — остановкаДля отслеживания повторов используются callbacks:
const shape = new mojs.Shape({
radius: { 0: 50 },
duration: 1000,
repeat: 2,
onRepeatStart() {
console.log('Повтор начался');
},
onRepeatComplete() {
console.log('Повтор завершён');
}
});
Возможности:
1. Пульсация элемента
new mojs.Shape({
shape: 'circle',
scale: { 1: 1.5 },
opacity: { 1: 0 },
duration: 1000,
repeat: Infinity
}).play();
2. Анимация «дыхания»
new mojs.Shape({
scale: { 1: 1.2 },
duration: 800,
repeat: Infinity,
yoyo: true
}).play();
3. Мигание
new mojs.Shape({
opacity: { 1: 0 },
duration: 200,
repeat: 5,
yoyo: true
}).play();
repeatDelay вместо сложной логики
таймеровTimeline для централизованного
управления1. Неправильное понимание количества повторов
repeat: 1 // это 2 проигрывания, а не 1
2. Конфликт yoyo и ожидаемого
результата
При yoyo: true финальное состояние может отличаться от
ожидаемого, так как анимация возвращается назад.
3. Отсутствие контроля бесконечных анимаций
repeat: Infinity
Без механизма остановки может привести к утечкам ресурсов.
Каждый цикл применяет easing заново:
new mojs.Shape({
radius: { 0: 50 },
duration: 1000,
easing: 'ease.inout',
repeat: 2
});
При yoyo easing применяется в обе стороны, что может
визуально отличаться от линейного возврата.
В mo.js отсутствует встроенная поддержка изменения значений на каждом повторе, однако это можно реализовать через callbacks:
let count = 0;
const shape = new mojs.Shape({
radius: { 0: 50 },
duration: 500,
repeat: 3,
onRepeatStart() {
count++;
shape.tune({
fill: count % 2 === 0 ? 'red' : 'blue'
});
}
});
Повторения можно комбинировать:
const inner = new mojs.Shape({
radius: { 0: 20 },
duration: 300,
repeat: 2
});
const timeline = new mojs.Timeline({
repeat: 2
});
timeline.add(inner);
Результат:
Важно учитывать:
tune() не сохраняются
автоматическиsetProgress() позволяет вручную управлять
состояниемПри использовании mojs.stagger:
const shapes = new mojs.Stagger(mojs.Shape, {
radius: { 0: 30 },
duration: 500,
repeat: 2
});
Каждый элемент повторяется независимо, но с учётом общего смещения.
const tl = new mojs.Timeline({
repeat: Infinity,
repeatDelay: 1000
});
Позволяет:
shape.then({
scale: { 1: 0 },
duration: 300
});
Метод then() запускается после всех повторов, что удобно
для построения цепочек.
shape.setProgress(0.5);
При повторении:
repeat вместо ручных циклов
setIntervalshape.stop();
onRepeatCompleteВыполняется delay
Запускается первый цикл
После завершения:
onRepeatStartrepeatDelayЦикл повторяется заданное количество раз
После последнего:
onCompleteТакое поведение делает repeat мощным инструментом для
построения как простых, так и сложных анимационных сценариев.