Метод replay() в библиотеке mo.js
используется для полного перезапуска анимации независимо от её текущего
состояния. В отличие от play(), который продолжает
воспроизведение с текущего момента или запускает анимацию только если
она остановлена, replay() всегда сбрасывает прогресс к
началу и запускает заново.
При вызове replay() происходит:
progress = 0)Это особенно важно для интерактивных интерфейсов, где требуется гарантированно одинаковое поведение при каждом запуске.
animation.replay();
Где animation — любой объект mo.js, поддерживающий
анимацию:
mojs.Tweenmojs.Htmlmojs.Shapemojs.ShapeSwirlmojs.Burstmojs.Timelinemojs.Shapeconst circle = new mojs.Shape({
shape: 'circle',
radius: { 0: 50 },
duration: 1000,
fill: 'cyan'
});
// первый запуск
circle.play();
// повторный запуск через 2 секунды
setTimeout(() => {
circle.replay();
}, 2000);
В этом примере:
play() запускает анимацию один разreplay() через 2 секунды полностью её перезапускает,
игнорируя текущее состояниеreplay() от
play()| Метод | Поведение |
|---|---|
play() |
Запускает анимацию с текущей позиции |
replay() |
Всегда начинает с нуля |
tween.play(); // запускает
tween.play(); // ничего не меняет, если уже играет
tween.replay(); // сбрасывает и запускает заново
const burst = new mojs.Burst({
radius: { 0: 100 },
count: 10,
duration: 800
});
document.addEventListener('click', () => {
burst.replay();
});
Каждый клик вызывает полный перезапуск анимации, даже если предыдущая ещё не завершилась.
TimelineМетод replay() особенно полезен при работе с временными
шкалами (Timeline), где объединено несколько анимаций.
const timeline = new mojs.Timeline();
timeline.add(circle, burst);
// первый запуск
timeline.play();
// повторный запуск
timeline.replay();
При вызове replay():
Если replay() вызывается во время выполнения:
Это делает replay() безопасным способом принудительного
обновления визуального эффекта.
replay() + pause()animation.pause();
animation.replay();
Даже после паузы replay() гарантированно запустит
анимацию заново.
replay() +
setProgress()animation.setProgress(0.5);
animation.replay();
Установка прогресса игнорируется — replay() всегда
сбрасывает его.
delay применяется заново при каждом
replay()easing пересчитывается с начальной точки{ from: to })
переинициализируютсяЕсли анимация настроена с repeat:
const tween = new mojs.Tween({
duration: 500,
repeat: 3
});
Вызов replay():
1. Кнопки с анимацией при каждом нажатии
button.addEventListener('click', () => {
animation.replay();
});
2. Перезапуск анимации при повторном показе элемента
modal.onOpen(() => {
animation.replay();
});
3. Сброс состояния интерфейса
function resetUI() {
timeline.replay();
}
replay() не создаёт новый объект — используется тот же
экземплярBurst с большим количеством элементов) может влиять на
FPSАльтернатива:
animation.setProgress(0);
animation.play();
Однако:
setProgress(0) не всегда корректно сбрасывает
внутренние состоянияreplay() гарантирует полный и чистый перезапускПри использовании chained-анимаций:
animation.then({
duration: 500
});
replay():
Timeline и вложенными
анимациямиplay()