Событие onComplete — один из ключевых механизмов
управления жизненным циклом анимации в библиотеке
mo.js. Оно срабатывает в момент полного завершения
проигрывания анимации, позволяя выполнять дополнительные действия:
запуск цепочек, изменение состояния интерфейса, очистку ресурсов или
повторную инициализацию.
В основе mo.js лежит декларативный подход к созданию анимаций. Каждый
объект (например, mojs.Tween, mojs.Shape,
mojs.Timeline) имеет набор хуков жизненного цикла:
onStart — начало анимацииonUpdate — каждый кадрonComplete — завершение анимацииonComplete вызывается один раз, когда
анимация полностью доходит до конца с учётом всех параметров (duration,
delay, repeat и easing).
const tween = new mojs.Tween({
duration: 1000,
onComplete: function () {
console.log('Анимация завершена');
}
});
tween.play();
Допускается использование стрелочных функций:
onComplete: () => {
console.log('Done');
}
По умолчанию внутри onComplete:
this указывает на экземпляр анимации (например,
Tween)onComplete: function () {
console.log(this.progress); // всегда 1
}
Если используется repeat, onComplete
вызывается после последнего цикла:
new mojs.Tween({
duration: 500,
repeat: 3,
onComplete: () => {
console.log('Все повторы завершены');
}
});
Здесь анимация выполнится 4 раза (1 + 3 повтора), и только затем
сработает onComplete.
delay)Задержка влияет только на момент старта, но не на момент вызова
onComplete.
new mojs.Tween({
delay: 1000,
duration: 500,
onComplete: () => {
console.log('Фактическое завершение через 1500 мс');
}
});
yoyoПри использовании yoyo: true анимация проигрывается
вперёд и назад. onComplete срабатывает после
полного цикла вперёд-назад.
new mojs.Tween({
duration: 500,
yoyo: true,
onComplete: () => {
console.log('Цикл вперёд-назад завершён');
}
});
mojs.Shapeconst circle = new mojs.Shape({
shape: 'circle',
radius: { 0: 50 },
duration: 1000,
onComplete: function () {
this.el.style.opacity = 0;
}
});
circle.play();
Частый сценарий — удаление DOM-элемента:
onComplete: function () {
this.el.remove();
}
mojs.TimelineTimeline агрегирует несколько анимаций.
onComplete срабатывает, когда завершены все
вложенные элементы.
const timeline = new mojs.Timeline({
onComplete: () => {
console.log('Вся последовательность завершена');
}
});
timeline.add(tween1, tween2).play();
onComplete часто применяется для построения
последовательных анимаций без использования Timeline.
const first = new mojs.Tween({
duration: 500,
onComplete: () => second.play()
});
const second = new mojs.Tween({
duration: 500
});
first.play();
onComplete можно использовать для запуска асинхронных
действий:
onComplete: async () => {
await fetch('/api/data');
console.log('Данные загружены после анимации');
}
При повторном вызове .play() onComplete
будет вызываться снова:
tween.play();
tween.replay();
Каждый цикл завершения инициирует новый вызов обработчика.
onCompleteЕсли анимация остановлена вручную:
tween.stop();
onComplete не вызывается, так как
анимация не достигла конца.
onUpdate
и onStart| Хук | Когда вызывается |
|---|---|
| onStart | В начале анимации |
| onUpdate | Каждый кадр |
| onComplete | После полного завершения |
onComplete: () => {
button.disabled = false;
}
onComplete: () => {
showModal();
}
onComplete: function () {
this.el = null;
}
onComplete: () => {
analytics.track('animation_finished');
}
thisПри использовании стрелочной функции this не указывает
на экземпляр:
onComplete: () => {
console.log(this); // не mojs-объект
}
Решение — использовать обычную функцию:
onComplete: function () {
console.log(this);
}
Если анимация запускается несколько раз без контроля,
onComplete может срабатывать многократно.
durationЕсли duration: 0, onComplete вызывается
практически мгновенно, что может приводить к неожиданному порядку
выполнения.
Обёртка для превращения анимации в Promise:
function playTween(tween) {
return new Promise(resolve => {
tween.options.onCompl ete = resolve;
tween.play();
});
}
await playTween(tween);
Позволяет писать последовательные анимации в стиле async/await.
Внутри mo.js:
progress от 0 до 1)progress === 1onCompleteЭто означает, что событие строго связано с конечным состоянием интерполяции.
onComplete для логики
завершения, а не промежуточных действийTimeline вместо
ручных цепочекreplay()const burst = new mojs.Burst({
radius: { 0: 100 },
count: 10,
duration: 800,
onComplete: function () {
console.log('Эффект завершён');
this.el.remove();
}
});
burst.play();
В данном случае:
onComplete играет роль точки
синхронизации:
В сложных интерфейсах он выступает аналогом событийного обработчика в системах управления состоянием.