mo.js содержит систему управления анимациями, основанную на двух
ключевых сущностях: отдельные анимационные объекты (tween) и временные
контейнеры (timeline). Управление скоростью воспроизведения в этой
системе реализуется через метод setSpeed(), влияющий на
темп проигрывания всей связанной цепочки анимаций без изменения их
внутренней логики.
setSpeed() изменяет коэффициент временного
масштабирования анимации. Этот коэффициент применяется к внутреннему
таймеру, который рассчитывает прогресс анимации относительно времени
выполнения.
Базовая логика:
1 — нормальная скорость< 1 — замедление> 1 — ускорение0 — фактическая остановка прогресса
времениПри изменении скорости не пересчитываются ключевые кадры, easing-функции или структура анимации. Изменяется только интерпретация времени.
Метод применяется как к отдельным tween-объектам, так и к timeline:
tween.setSpeed(speed);
timeline.setSpeed(speed);
Параметр speed — числовое значение коэффициента.
Внутренне значение сохраняется в объекте анимации и используется при каждом тике обновления времени.
Tween в mo.js представляет собой атомарную анимацию с ограниченным
временем жизни. При вызове setSpeed():
Изменение скорости во время выполнения не вызывает перезапуск tween, а корректирует временную шкалу «на лету».
const tween = new mojs.Tween({
duration: 2000,
onUpdate: (progress) => {
console.log(progress);
}
});
tween.play();
tween.setSpeed(2);
В данном случае фактическая длительность выполнения сокращается примерно вдвое.
Timeline агрегирует несколько tween-объектов и синхронизирует их
временную ось. При применении setSpeed() к timeline:
const timeline = new mojs.Timeline();
timeline.add(
new mojs.Tween({ duration: 1000 }),
new mojs.Tween({ duration: 1000, delay: 200 })
);
timeline.play();
timeline.setSpeed(0.5);
Все элементы timeline начинают проигрываться в два раза медленнее, сохраняя структуру последовательности.
Изменение скорости может происходить во время активного воспроизведения. В таком случае система пересчитывает текущий прогресс на основе нового коэффициента без обнуления времени старта.
Особенность реализации:
Такой подход исключает рывки при изменении скорости.
timeline.play();
setTimeout(() => {
timeline.setSpeed(0.25);
}, 500);
Анимация продолжает выполнение с новым временным масштабом без перезапуска.
Easing-функции не модифицируются при изменении скорости. Они получают уже нормализованный прогресс (0–1), который зависит от скорректированного времени.
Это означает:
Таким образом, ускорение не делает easing более резким, а замедление не растягивает его математическую форму, а лишь увеличивает длительность прохождения.
При работе с последовательными tween в timeline изменение скорости влияет на:
Если используется сложная композиция, основанная на нескольких
timeline, setSpeed() может применяться иерархически:
Итоговая скорость становится произведением коэффициентов.
Динамическое управление скоростью часто применяется в реактивных интерфейсах:
timeline.setSpeed(1);
element.addEventListener('mouseenter', () => {
timeline.setSpeed(0.3);
});
element.addEventListener('mouseleave', () => {
timeline.setSpeed(1);
});
Механизм изменения скорости не требует пересоздания анимации, что делает его дешевым по производительности.
Поведение setSpeed() имеет ряд технических
особенностей:
Внутренне система опирается на requestAnimationFrame, поэтому точность зависит от частоты обновления кадров.
В сложных анимационных графах изменение скорости через
setSpeed() влияет на всю временную структуру:
Это делает метод инструментом управления глобальным темпом сцен, а не только отдельных эффектов.