Событие onRepeatStart используется для отслеживания
момента, когда анимация в библиотеке mo.js начинает
новый цикл повторения. Оно срабатывает каждый раз перед стартом
очередной итерации, если для анимации задан параметр
repeat.
Внутренний цикл анимации в mo.js состоит из нескольких фаз:
onStart)onUpdate)onComplete)repeat)При наличии повторений (repeat > 0 или
repeat: Infinity) между завершением одной итерации и
началом следующей возникает точка, в которой срабатывает
onRepeatStart.
Ключевая особенность:
onRepeatStart вызывается до начала следующего
цикла, но после завершения предыдущегоЭто позволяет:
const tween = new mojs.Tween({
duration: 1000,
repeat: 3,
onRepeatStart() {
console.log('Новый цикл начался');
}
});
tween.play();
repeat| Значение repeat | Поведение onRepeatStart |
|---|---|
0 |
Не вызывается |
1 |
Не вызывается (нет повторов) |
2+ |
Вызывается перед каждым новым циклом |
Infinity |
Вызывается бесконечно |
Для одной итерации с повторением порядок выглядит следующим образом:
onStart
onUpdate (многократно)
onComplete
onRepeatStart ← ключевой
момент
следующий цикл:
onStart (не всегда вызывается повторно, зависит от типа
анимации)onUpdatelet scale = 1;
const tween = new mojs.Tween({
duration: 500,
repeat: 5,
onRepeatStart() {
scale += 0.2;
console.log(`Новый масштаб: ${scale}`);
}
});
const circle = new mojs.Shape({
shape: 'circle',
fill: 'red',
radius: 20,
duration: 800,
repeat: 3,
onRepeatStart() {
this.tune({
fill: `hsl(${Math.random() * 360}, 100%, 50%)`
});
}
});
circle.play();
Метод tune() позволяет динамически менять свойства
объекта перед новым циклом.
const timeline = new mojs.Timeline();
const tween1 = new mojs.Tween({
duration: 1000,
repeat: 2,
onRepeatStart() {
tween2.replay();
}
});
const tween2 = new mojs.Tween({
duration: 500
});
timeline.add(tween1, tween2).play();
onStart
и onComplete| Событие | Когда вызывается |
|---|---|
onStart |
При первом запуске |
onComplete |
После завершения |
onRepeatStart |
Перед новым циклом |
Важно: onStart не всегда вызывается при
каждом повторе — onRepeatStart специально предназначен для
контроля именно повторных итераций.
delay)Если задан delay:
const tween = new mojs.Tween({
duration: 500,
delay: 300,
repeat: 2,
onRepeatStart() {
console.log('Повтор с задержкой');
}
});
Поведение:
delay применяется к каждому циклуonRepeatStart вызывается до применения задержки
следующего циклаyoyoПри использовании yoyo: true анимация чередует
направление:
const tween = new mojs.Tween({
duration: 600,
repeat: 4,
yoyo: true,
onRepeatStart() {
console.log('Смена направления');
}
});
В этом случае:
onRepeatStart вызывается перед каждым изменением
направленияonRepeatStart привязан к внутреннему счётчику
повторений:
onRepeatStart и запускает следующий
цикл1. Ожидание вызова при repeat: 1
repeat: 1 // повторов нет
Фактически:
onRepeatStart не вызывается2. Путаница с onStart
onStart() {
console.log('Каждый раз'); // ❌ неверно
}
onStart не гарантирует вызов на каждой итерации.
3. Изменение свойств без tune()
this.fill = 'blue'; // ❌ не работает
Правильно:
this.tune({ fill: 'blue' });
const timeline = new mojs.Timeline({
repeat: 3,
onRepeatStart() {
console.log('Повтор всей последовательности');
}
});
В этом случае:
onRepeatStart() {
console.log('Iteration:', this._repeat);
}
Можно отслеживать:
onRepeatStartrepeat — определяет количество повторовdelay — задержка между цикламиyoyo — направление анимацииonUpdate — обновление кадраonComplete — завершение[Цикл 1]
↓
onComplete
↓
onRepeatStart
↓
[Цикл 2]
↓
onComplete
↓
onRepeatStart
↓
...
this) текущего объекта
анимацииlet radius = 10;
const shape = new mojs.Shape({
radius,
repeat: 5,
onRepeatStart() {
radius += 5;
this.tune({ radius });
}
});
let opacity = 1;
const tween = new mojs.Tween({
repeat: 4,
onRepeatStart() {
opacity -= 0.2;
this.tune({ opacity });
}
});
let duration = 1000;
const tween = new mojs.Tween({
duration,
repeat: 3,
onRepeatStart() {
duration -= 200;
this.tune({ duration });
}
});
repeatthis.tune()thisВнутри onRepeatStart:
onRepeatStart() {
console.log(this); // текущий Tween / Shape / Timeline
}
Доступны:
play, pause,
tune)При построении сложных интерфейсов onRepeatStart часто
используется как:
Это делает его ключевым инструментом для создания динамических, неповторяющихся анимаций в mo.js.