В ScrollMagic объект Scene предоставляет возможность
отслеживать прогресс прокрутки относительно заданного триггера и
продолжительности сцены. Прогресс сцены изменяется от 0 до
1 в зависимости от того, насколько пользователь прокрутил
элемент, связанный с триггером. Это ключевой инструмент для создания
плавных анимаций, синхронизированных с прокруткой страницы.
var scene = new ScrollMagic.Scene({
triggerElement: "#trigger", // элемент, с которого начинается сцена
duration: 500 // длина сцены в пикселях
})
.addTo(controller);
scene.on("progress", function (event) {
console.log(event.progress); // значение от 0 до 1
});
Значение event.progress позволяет динамически управлять
любыми свойствами элементов, например, прозрачностью, масштабом или
положением.
Для создания сложных анимаций часто используют библиотеку GSAP вместе с ScrollMagic. В этом случае прогресс сцены напрямую контролирует время воспроизведения анимации.
var tween = gsap.to("#box", { x: 500, rotation: 360, duration: 1 });
var scene = new ScrollMagic.Scene({
triggerElement: "#trigger",
duration: 1000
})
.setTween(tween)
.addTo(controller);
При использовании метода .setTween() ScrollMagic
автоматически синхронизирует прогресс прокрутки с прогрессом анимации
GSAP. Это позволяет создать «скролл-зависимую» анимацию без
дополнительной логики.
Иногда требуется не просто линейное воспроизведение анимации, а
тонкая настройка отдельных свойств. Для этого используется событие
progress сцены и непосредственное управление стилями:
scene.on("progress", function(event) {
var progress = event.progress;
document.querySelector("#circle").style.transform = `scale(${0.5 + 0.5 * progress})`;
document.querySelector("#circle").style.opacity = progress;
});
В этом примере масштаб и прозрачность элемента плавно изменяются пропорционально прогрессу прокрутки, создавая эффект «живой» анимации.
Для более сложных сцен с несколькими элементами можно использовать прогресс для запуска различных анимаций в зависимости от диапазона прокрутки:
scene.on("progress", function(event) {
var progress = event.progress;
if (progress < 0.33) {
gsap.to("#box1", { x: 100 * progress });
} else if (progress < 0.66) {
gsap.to("#box2", { y: 200 * (progress - 0.33) });
} else {
gsap.to("#box3", { rotation: 360 * (progress - 0.66) });
}
});
Такой подход позволяет разбивать сцену на логические сегменты, управляя несколькими элементами через один контроллер и одну сцену.
ScrollMagic позволяет «закреплять» элементы на экране при прокрутке с
помощью метода .setPin(). В сочетании с прогрессом это
открывает возможности для сложных интерактивных эффектов:
var scene = new ScrollMagic.Scene({
triggerElement: "#section",
duration: 800
})
.setPin("#pinnedElement")
.addTo(controller);
scene.on("progress", function(event) {
document.querySelector("#pinnedElement").style.backgroundColor = `rgba(255,0,0,${event.progress})`;
});
Закрепленный элемент может плавно изменять свои свойства в зависимости от прокрутки, создавая визуально выразительные эффекты.
Для больших страниц часто требуется использовать несколько сцен одновременно. Прогресс каждой сцены независим, что позволяет комбинировать эффекты:
var scene1 = new ScrollMagic.Scene({ triggerElement: "#section1", duration: 400 })
.on("progress", e => { /* анимация для section1 */ })
.addTo(controller);
var scene2 = new ScrollMagic.Scene({ triggerElement: "#section2", duration: 600 })
.on("progress", e => { /* анимация для section2 */ })
.addTo(controller);
Каждая сцена может управлять своим набором элементов, а прогресс позволяет синхронизировать действия без сложных вычислений.
Прогресс от 0 до 1 можно масштабировать или
модифицировать с помощью функций интерполяции для создания нелинейных
анимаций:
scene.on("progress", function(event) {
var easedProgress = Math.pow(event.progress, 2); // квадратичное ускорение
document.querySelector("#box").style.transform = `translateX(${easedProgress * 300}px)`;
});
Использование нелинейного прогресса позволяет создавать более естественные эффекты движения и визуальные «повороты» в анимациях.
0 до
1 и меняется непрерывно..setTween() упрощает синхронизацию с
GSAP-анимациями, но ручной контроль через progress дает
больше гибкости.Эти подходы открывают широкие возможности для создания интерактивных и выразительных анимаций, полностью управляемых прокруткой страницы.