ScrollMagic позволяет связывать анимации с прокруткой страницы, создавая динамичные эффекты параллакса. Параллакс в веб-разработке достигается за счёт движения различных слоёв с разной скоростью относительно скролла, создавая ощущение глубины. Основным инструментом для этого в ScrollMagic является объект Scene, который реагирует на положение прокрутки и запускает связанные с ним действия.
var controller = new ScrollMagic.Controller();
var scene = new ScrollMagic.Scene({
triggerElement: "#section1", // элемент, с которого начинается анимация
duration: 500, // длина эффекта параллакса
triggerHook: 0.5 // положение триггера на экране (0-верх, 1-низ)
})
.setTween("#parallaxElement", {y: "50%", ease: Linear.easeNone}) // анимация
.addTo(controller);
Ключевой момент: duration определяет, на какой длине
скролла будет происходить смещение элемента. Чем больше значение, тем
плавнее и медленнее эффект. Для параллакса важно использовать
Linear.easeNone, чтобы анимация была равномерной, без
ускорений.
Параллакс может сильно нагружать браузер, особенно при большом количестве элементов и сложных анимациях. Основные подходы к оптимизации:
Использование transform вместо
top/left Изменение позиции через CSS-свойства
transform: translateY() или translate3d()
гораздо эффективнее, чем top и left, так как
браузер применяет GPU-ускорение.
TweenMax.to("#parallaxElement", 1, {
y: "50%",
ease: Linear.easeNone,
force3D: true // принудительное использование GPU
});Минимизация количества Scene Каждый Scene создаёт обработчик скролла. Для множества мелких элементов лучше объединять анимации в один Scene или использовать группы анимаций через TimelineMax/TimelineLite.
var tl = new TimelineMax();
tl.to("#element1", 1, {y: "30%", ease: Linear.easeNone})
.to("#element2", 1, {y: "50%", ease: Linear.easeNone}, 0);
var scene = new ScrollMagic.Scene({
triggerElement: "#section",
duration: 800
})
.setTween(tl)
.addTo(controller);Throttle и requestAnimationFrame ScrollMagic уже
использует оптимизированные методы обновления, но при кастомных
обработчиках стоит применять requestAnimationFrame, чтобы
не перегружать основной поток.
Скрытие элементов вне экрана Если параллакс применяется к элементам, которые находятся далеко от видимой области, их анимацию лучше отключать или отложить до появления в зоне видимости.
Для параллакса часто используют фоновое изображение или слой с
контентом. В ScrollMagic можно применять анимацию к фоновой позиции
через background-position:
TweenMax.to("#background", 1, {
backgroundPosition: "50% 100%",
ease: Linear.easeNone
});
Для сложных сцен с несколькими слоями полезно использовать слоистый подход, где каждый слой имеет отдельный коэффициент смещения:
var layers = document.querySelectorAll(".layer");
layers.forEach(function(layer, index) {
var depth = layer.getAttribute("data-depth");
new ScrollMagic.Scene({
triggerElement: "#parallaxSection",
duration: "100%"
})
.setTween(layer, {y: (100 * depth) + "%", ease: Linear.easeNone})
.addTo(controller);
});
Использование Timeline позволяет синхронизировать несколько анимаций и параллакс-эффектов, создавая сложные композиции без создания множества Scene:
var tl = new TimelineMax();
tl.from("#foreground", 1, {y: "-20%", ease: Linear.easeNone})
.from("#midground", 1, {y: "-10%", ease: Linear.easeNone}, 0)
.from("#background", 1, {y: "0%", ease: Linear.easeNone}, 0);
new ScrollMagic.Scene({
triggerElement: "#parallaxContainer",
duration: 1200
})
.setTween(tl)
.addTo(controller);
Такой подход снижает нагрузку на систему и делает параллакс более плавным.
Для точной настройки параллакса важно понимать параметры Scene:
Эти параметры позволяют создавать гибкие эффекты: плавное появление объектов, «проскальзывающий» фон, смещение элементов с разной скоростью.
На слабых устройствах параллакс может тормозить. Рекомендации:
will-change: transform; в CSS для
оптимизации рендеринга.if (window.innerWidth > 768) {
// создаём Scene и анимации
}
transform и GPU-ускорение.Эти методы обеспечивают плавный и лёгкий параллакс, который работает эффективно как на десктопе, так и на мобильных устройствах.