Метод setProgress() в библиотеке mo.js используется для
ручного управления состоянием анимации, позволяя
установить её на конкретную позицию во временной шкале. Это один из
ключевых инструментов при создании интерактивных интерфейсов, где
анимация должна синхронизироваться с действиями пользователя или
внешними событиями.
В отличие от автоматического воспроизведения (play()),
данный метод даёт полный контроль над текущим кадром анимации.
tween.setProgress(progress);
Параметры:
progress — число от 0 до
1, где:
0 — начало анимации1 — завершение анимацииВ основе mo.js лежит концепция временной шкалы (timeline). Любая анимация интерполирует значения свойств от начального к конечному состоянию.
Метод setProgress() напрямую задаёт положение на этой
шкале:
Важно: метод не запускает анимацию, а лишь устанавливает её состояние.
const circle = new mojs.Shape({
shape: 'circle',
radius: { 0: 50 },
duration: 1000
});
// Установить анимацию на середину
circle.setProgress(0.5);
Результат:
При использовании setProgress() значение
progress не равно линейному переходу
свойств, если задан easing.
const tween = new mojs.Tween({
duration: 1000,
easing: 'elastic.out',
onUpdate: (p) => {
console.log(p);
}
});
tween.setProgress(0.5);
Здесь:
0.5 передаётся как вход easing-функции0.8 или даже
больше (в случае “перелёта”)setProgress и play| Метод | Назначение |
|---|---|
play() |
Запуск анимации |
pause() |
Пауза |
setProgress() |
Установка конкретного состояния |
При работе с mojs.Timeline метод
setProgress() применяется ко всей группе анимаций:
const timeline = new mojs.Timeline();
timeline.add(circle1, circle2);
// Установить прогресс всей последовательности
timeline.setProgress(0.25);
Все дочерние анимации:
Один из самых распространённых сценариев — привязка анимации к пользовательскому вводу.
window.addEventListener('scroll', () => {
const scrollTop = window.scrollY;
const maxScroll = document.body.scrollHeight - window.innerHeight;
const progress = scrollTop / maxScroll;
tween.setProgress(progress);
});
Особенности:
Метод ожидает значения в диапазоне [0, 1], но:
Рекомендуется явно ограничивать диапазон:
const progress = Math.min(Math.max(value, 0), 1);
tween.setProgress(progress);
Каждый вызов setProgress():
Это делает метод детерминированным — одинаковый вход всегда даёт одинаковый результат.
delay)Если у анимации задан delay, метод
setProgress() учитывает его:
const tween = new mojs.Tween({
delay: 500,
duration: 1000
});
tween.setProgress(0.2);
Фактически:
delay + duration)setProgress() удобно использовать для синхронного
управления несколькими объектами:
const shapes = [shape1, shape2, shape3];
function update(progress) {
shapes.forEach(shape => shape.setProgress(progress));
}
Это позволяет:
Метод часто применяется при создании собственных контроллеров:
input.addEventListener('input', (e) => {
const value = e.target.value / 100;
tween.setProgress(value);
});
setProgress():
Рекомендации:
mousemove)requestAnimationFramelet progress = 0;
function update() {
tween.setProgress(progress);
requestAnimationFrame(update);
}
update();
onUpdateПри вызове setProgress() триггерится
onUpdate:
const tween = new mojs.Tween({
onUpdate: (p) => {
console.log('progress:', p);
}
});
tween.setProgress(0.7);
Это позволяет:
1. Ожидание запуска анимации
tween.setProgress(1); // не запускает, а сразу устанавливает конец
2. Игнорирование easing
// значение не будет линейным
3. Использование вне диапазона
tween.setProgress(5); // некорректное поведение
При вызове метода происходит:
progressonUpdate)tween
.setProgress(0.3)
.pause();
или:
tween.setProgress(0).play();
Такой подход позволяет:
Для реверса можно просто инвертировать значение:
tween.setProgress(1 - progress);
setProgress() превращает анимацию из временного процесса
в управляемое состояние. Это фундаментальный инструмент для создания
динамических и интерактивных интерфейсов, где анимация становится частью
логики приложения, а не просто визуальным эффектом.