Механизм прогресса в ScrollMagic позволяет отслеживать, насколько далеко пользователь продвинулся внутри сцены (Scene). Это ключевая возможность для создания анимаций, синхронизированных со скроллом, где состояние элементов зависит не от факта попадания в область видимости, а от степени прокрутки.
Каждая сцена в ScrollMagic имеет параметр progress,
принимающий значения от 0 до 1:
0 — сцена только началась (триггер достигнут)1 — сцена полностью пройденаПрогресс рассчитывается автоматически на основе:
duration)triggerElement,
triggerHook)Прогресс можно получить через API сцены:
scene.progress();
Этот метод возвращает текущее значение прогресса (число от 0 до 1).
Пример:
var scene = new ScrollMagic.Scene({
triggerElement: "#section",
duration: 300
});
controller.addScene(scene);
window.addEventListener("scroll", function() {
console.log(scene.progress());
});
ScrollMagic предоставляет событие progress, которое
срабатывает при каждом изменении значения:
scene.on("progress", function(event) {
console.log(event.progress);
});
Объект event содержит:
progress — текущее значениеstate — состояние сцены (BEFORE,
DURING, AFTER)scrollDirection — направление скролла
(FORWARD, REVERSE)Прогресс имеет смысл только при наличии duration. Если
duration не задан:
0 сразу на 1Пример сцены с прогрессом:
var scene = new ScrollMagic.Scene({
triggerElement: "#block",
duration: 500
});
Здесь:
#blockПрогресс удобно использовать для управления CSS:
scene.on("progress", function(event) {
var progress = event.progress;
var scale = 1 + progress;
var opacity = progress;
document.querySelector("#box").style.transform = "scale(" + scale + ")";
document.querySelector("#box").style.opacity = opacity;
});
Результат:
scene.on("progress", function(event) {
var y = event.progress * 200;
document.querySelector(".parallax").style.transform =
"translateY(" + y + "px)";
});
ScrollMagic часто используется вместе с GSAP. В этом случае прогресс сцены напрямую управляет таймлайном:
var tween = gsap.to("#box", {
x: 500,
rotation: 360,
duration: 1
});
var scene = new ScrollMagic.Scene({
triggerElement: "#trigger",
duration: 400
})
.setTween(tween)
.addTo(controller);
Особенности:
duration сцены управляет временем анимацииИногда требуется изменить линейное поведение:
scene.on("progress", function(event) {
var p = event.progress;
var eased = Math.pow(p, 2); // ускорение
document.querySelector("#box").style.transform =
"translateX(" + (eased * 300) + "px)";
});
Варианты преобразования:
p * p — ускорениеMath.sqrt(p) — замедлениеMath.sin(p * Math.PI) — плавная криваяМожно использовать только часть прогресса:
scene.on("progress", function(event) {
var p = event.progress;
if (p < 0.3) return;
var normalized = (p - 0.3) / 0.7;
document.querySelector("#box").style.opacity = normalized;
});
Это позволяет запускать анимации не сразу, а в определённый момент сцены.
Для сложных интерфейсов используется объединение прогресса:
var totalProgress = 0;
scene1.on("progress", function(e) {
totalProgress = e.progress * 0.5;
});
scene2.on("progress", function(e) {
totalProgress = 0.5 + e.progress * 0.5;
});
Таким образом создаётся единая шкала от 0 до 1 для нескольких сцен.
Частое обновление прогресса может нагружать браузер. Рекомендуется:
progressrequestAnimationFrame при сложной
логикеПример оптимизации:
var ticking = false;
scene.on("progress", function(event) {
if (!ticking) {
requestAnimationFrame(function() {
update(event.progress);
ticking = false;
});
ticking = true;
}
});
Иногда важно учитывать направление:
scene.on("progress", function(event) {
if (event.scrollDirection === "FORWARD") {
console.log("вниз");
} else {
console.log("вверх");
}
});
Это полезно для:
При отсутствии duration:
var scene = new ScrollMagic.Scene({
triggerElement: "#trigger"
});
Прогресс:
Такой режим подходит для событий, но не для плавных анимаций.
При использовании setPin:
scene.setPin("#section");
Прогресс отражает время “закрепления” элемента:
Это удобно для:
Для визуализации используется индикатор:
scene.addIndicators();
Позволяет увидеть:
1. Отсутствие duration
2. Избыточные вычисления
3. Неправильная нормализация
4. Работа с DOM внутри цикла
Стандартный шаблон:
var scene = new ScrollMagic.Scene({
triggerElement: "#trigger",
duration: 400
})
.addTo(controller);
scene.on("progress", function(event) {
var p = event.progress;
// логика
});
Эта конструкция лежит в основе большинства scroll-driven интерфейсов:
Прогресс выступает как универсальный параметр времени, управляемый прокруткой, что делает ScrollMagic мощным инструментом для синхронизации визуальных состояний с поведением пользователя.