ScrollMagic — это мощная библиотека JavaScript для создания интерактивных эффектов при прокрутке страницы. Она работает на основе сцен (scenes) и контроллеров (controllers). Контроллер отслеживает позицию скролла, а сцены описывают, какие анимации должны происходить и в какой момент.
Ключевые компоненты:
Принцип работы заключается в отслеживании позиции скролла относительно триггер-элемента и запуске привязанных анимаций.
Создание контроллера осуществляется очень просто:
var controller = new ScrollMagic.Controller();
Контроллер можно настраивать через опции:
globalSceneOptions — объект с настройками по умолчанию
для всех сцен.vertical — направление скролла (true по
умолчанию).refreshInterval — частота обновления позиции скролла
для оптимизации производительности.Сцена создается с помощью конструктора
ScrollMagic.Scene, где указываются основные параметры:
var scene = new ScrollMagic.Scene({
triggerElement: "#slide1",
duration: 500,
offset: 0
})
.setTween("#slide1", {opacity: 1, y: -50})
.addTo(controller);
Пояснение параметров:
triggerElement — элемент, при появлении которого
начинается сцена.duration — длина сцены, определяет протяженность
анимации.offset — смещение от триггера.setTween — задает анимацию с помощью библиотеки GSAP
или CSS-свойств.addTo(controller) — добавляет сцену в контроллер для
отслеживания скролла.Для плавного слайдшоу ScrollMagic идеально интегрируется с GSAP. Простейший пример анимации сдвига и изменения прозрачности:
var tween = gsap.to("#slide1", {duration: 1, y: -100, opacity: 0});
var scene = new ScrollMagic.Scene({
triggerElement: "#slide1",
duration: 300
})
.setTween(tween)
.addTo(controller);
Можно комбинировать несколько анимаций с помощью
Timeline:
var timeline = gsap.timeline();
timeline
.to("#slide1", {y: -50, opacity: 0})
.to("#slide2", {y: -50, opacity: 1});
var scene = new ScrollMagic.Scene({
triggerElement: "#slides",
duration: 600
})
.setTween(timeline)
.addTo(controller);
Такой подход позволяет создавать плавные переходы между слайдами, синхронизированные с прокруткой страницы.
ScrollMagic отлично подходит для реализации параллакса. Основная идея — разные слои сдвигаются с разной скоростью при прокрутке.
var parallaxScene = new ScrollMagic.Scene({
triggerElement: "#parallax",
duration: 1000
})
.setTween("#background", {y: "50%", ease: Linear.easeNone})
.addTo(controller);
Особенности параллакса:
ease: Linear.easeNone для равномерного
смещения без ускорений.Сцену можно контролировать динамически:
.triggerHook(value) — задает точку активации сцены
относительно окна (0 — верх, 1 — низ)..reverse(true/false) — определяет, должна ли анимация
проигрываться в обратном направлении при скролле вверх..addIndicators({name: "Slide 1"}) — для отладки
показывает визуальные индикаторы на странице.Пример с настройкой триггер-хука и обратной анимации:
var scene = new ScrollMagic.Scene({
triggerElement: "#slide1",
duration: 500
})
.setTween("#slide1", {opacity: 1})
.triggerHook(0.5)
.reverse(true)
.addIndicators({name: "Slide1"})
.addTo(controller);
Для больших слайдшоу важно минимизировать нагрузку на рендеринг:
duration в процентах высоты окна вместо
фиксированных пикселей для адаптивности.transform: translate3d) вместо свойств top
или left.controller.addScene(scene) вместо создания всех сцен
сразу.Для полноценного слайдшоу удобно строить сцены последовательно:
var slides = document.querySelectorAll(".slide");
slides.forEach((slide, index) => {
var scene = new ScrollMagic.Scene({
triggerElement: slide,
duration: "100%"
})
.setTween(gsap.fromTo(slide, {opacity: 0, y: 50}, {opacity: 1, y: 0}))
.addTo(controller);
});
Такой подход позволяет легко добавлять новые слайды, не переписывая всю анимацию.
ScrollMagic может запускать CSS-классы вместо JS-анимаций:
var scene = new ScrollMagic.Scene({
triggerElement: "#slide3",
duration: 400
})
.setClassToggle("#slide3", "visible")
.addTo(controller);
Преимущества CSS-анимаций:
@keyframes.Эффект «липкого» слайда достигается за счет использования
pin:
var scene = new ScrollMagic.Scene({
triggerElement: "#slide2",
duration: 600
})
.setPin("#slide2")
.addTo(controller);
Особенности использования pin: