В Motion One управление жизненным циклом анимации строится вокруг
объекта Animation, который возвращается при вызове функций
animate() или timeline(). Этот объект
предоставляет набор методов, позволяющих динамически контролировать
выполнение анимации после её создания.
Основные методы управления состоянием анимации:
play() — запускает или возобновляет анимациюpause() — приостанавливает выполнениеstop() — полностью останавливает и сбрасывает
анимациюЭти методы работают как с одиночными анимациями, так и с последовательностями в таймлайне.
play() —
запуск и возобновление анимацииМетод play() используется для старта анимации либо
продолжения её выполнения после паузы.
play()
инициирует выполнение.play()
продолжает её с текущего прогресса.repeat.import { animate } from "motion";
const animation = animate(
".box",
{ x: 300, opacity: 0.5 },
{ duration: 2 }
);
animation.play();
В большинстве случаев play() вызывается автоматически
при создании анимации, но ручное управление требуется при работе с
внешними событиями.
const animation = animate(".box", { x: 500 }, { duration: 5 });
animation.pause();
// позже
animation.play();
play()Многократный вызов play() не создаёт новых анимаций и не
сбрасывает состояние:
animation.play();
animation.play();
animation.play();
Анимация продолжит выполнение без перезапуска.
finishedЕсли анимация завершена, повторный play() не гарантирует
повторный запуск без repeat:
const animation = animate(".box", { x: 100 }, { duration: 1, repeat: 0 });
pause() —
остановка без сброса состоянияМетод pause() фиксирует текущее состояние анимации и
сохраняет прогресс.
const animation = animate(".box", { x: 400 }, { duration: 4 });
setTimeout(() => {
animation.pause();
}, 1000);
После вызова pause() элемент остаётся в текущем
состоянии трансформации.
pause()animation.pause();
setTimeout(() => {
animation.play();
}, 2000);
Состояние не сбрасывается, прогресс сохраняется внутри
Animation.
pause()В отличие от stop(), метод не возвращает анимацию в
начальное состояние.
Скорость, easing и другие параметры остаются неизменными.
stop() — полная
остановка и сбросМетод stop() полностью прекращает выполнение анимации и
возвращает элемент в начальное состояние (или в состояние, определённое
логикой библиотеки).
const animation = animate(".box", { x: 600 }, { duration: 3 });
setTimeout(() => {
animation.stop();
}, 1000);
После вызова stop() элемент возвращается к исходным
стилям.
pause()| Метод | Состояние анимации | Возможность продолжения |
|---|---|---|
| pause | сохраняется | да |
| stop | сбрасывается | нет (нужно создать заново) |
stop()После остановки:
animation.stop();
animation.play(); // не всегда ожидаемое поведение
В большинстве случаев анимацию нужно создавать заново:
animate(".box", { x: 600 }, { duration: 3 });
const animation = animate(".box", { x: 300 }, { duration: 2 });
buttonStart.addEventListener("click", () => animation.play());
buttonPause.addEventListener("click", () => animation.pause());
buttonStop.addEventListener("click", () => animation.stop());
let isRunning = true;
toggleButton.addEventListener("click", () => {
if (isRunning) {
animation.pause();
} else {
animation.play();
}
isRunning = !isRunning;
});
При использовании timeline() методы работают аналогично,
но влияют на всю последовательность анимаций.
import { timeline } from "motion";
const sequence = timeline([
[".box", { x: 200 }, { duration: 1 }],
[".box", { opacity: 0 }, { duration: 1 }]
]);
sequence.pause();
sequence.play();
sequence.stop();
pause() фиксирует текущее положение в
последовательностиplay() продолжает выполнение с текущего шагаstop() сбрасывает весь таймлайн в начало// неэффективно
button.addEventListener("click", () => {
animate(".box", { x: 200 });
});
Правильнее:
const animation = animate(".box", { x: 200 });
button.addEventListener("click", () => animation.play());
stop()После stop() объект анимации не предназначен для
повторного использования:
animation.stop();
animation.play(); // поведение может быть некорректным
Рекомендуется пересоздание экземпляра.
При отсутствии хранения ссылки на Animation управление
методами становится невозможным:
animate(".box", { x: 300 });
// нет доступа к pause/stop/play
const animation = animate(".box", { x: 500 }, { duration: 5 });
setTimeout(() => animation.pause(), 1000);
setTimeout(() => animation.play(), 3000);
setTimeout(() => animation.stop(), 5000);
async function runSequence() {
const animation = animate(".box", { x: 400 }, { duration: 4 });
await new Promise(r => setTimeout(r, 1500));
animation.pause();
await new Promise(r => setTimeout(r, 1000));
animation.play();
await new Promise(r => setTimeout(r, 1000));
animation.stop();
}
Анимация в Motion One проходит через логические состояния:
Методы play, pause, stop
напрямую управляют переходами между этими состояниями, определяя
поведение времени, прогресса и повторного запуска.