ScrollMagic позволяет реализовать сложные эффекты параллакса и анимации при прокрутке, управляя скоростью движения отдельных слоев относительно прокрутки страницы. Основная идея заключается в том, что элементы DOM могут двигаться с разной скоростью, создавая иллюзию глубины и динамики.
Каждое управление слоем начинается с создания сцены
(ScrollMagic.Scene). Ключевые параметры:
Пример создания сцены для движения слоя:
var controller = new ScrollMagic.Controller();
var scene = new ScrollMagic.Scene({
triggerElement: "#layer1",
duration: 500,
triggerHook: 0.5
})
.setTween("#layer1", {y: 200, ease: Linear.easeNone})
.addTo(controller);
Здесь слой с id="layer1" будет перемещаться по оси Y на
200 пикселей, пока сцена активна, с линейной скоростью.
Скорость движения элемента определяется соотношением между duration сцены и расстоянием, на которое должен двигаться элемент.
Формула для расчета скорости:
[ v = ]
где Δy — смещение элемента, duration —
длина сцены в пикселях прокрутки. Увеличение duration уменьшает скорость
движения элемента, а уменьшение duration — увеличивает.
Для более тонкого управления движением применяются библиотеки
анимации, такие как GSAP. В ScrollMagic они
используются через метод .setTween().
Пример параллакса с разной скоростью:
var scene1 = new ScrollMagic.Scene({
triggerElement: "#layer1",
duration: 1000
})
.setTween("#layer1", {y: 300, ease: Linear.easeNone})
.addTo(controller);
var scene2 = new ScrollMagic.Scene({
triggerElement: "#layer2",
duration: 500
})
.setTween("#layer2", {y: 150, ease: Linear.easeNone})
.addTo(controller);
В этом примере первый слой движется медленнее второго, создавая эффект глубины.
data-speed для динамического управленияДля удобства можно задавать скорость слоя через атрибут
data-speed и вычислять смещение автоматически:
document.querySelectorAll(".parallax-layer").forEach(function(layer){
var speed = parseFloat(layer.getAttribute("data-speed"));
var scene = new ScrollMagic.Scene({
triggerElement: layer,
duration: window.innerHeight
})
.setTween(layer, {y: speed * window.innerHeight, ease: Linear.easeNone})
.addTo(controller);
});
Здесь speed — коэффициент скорости, где 1 соответствует
стандартной прокрутке, 0.5 — половинной скорости, 2 — двойной.
Для создания эффекта замедленного движения при скролле вверх
используется свойство reverse. По умолчанию оно равно
true, что позволяет сцене «отматываться» при прокрутке
вверх.
var scene = new ScrollMagic.Scene({
triggerElement: "#layer3",
duration: 400,
reverse: true
})
.setTween("#layer3", {y: 100, ease: Linear.easeNone})
.addTo(controller);
Если reverse отключить (false), слой будет
двигаться только при скролле вниз и останется в конечной позиции при
обратной прокрутке.
Для создания сложных композиций параллакса можно объединять несколько слоев с разной длительностью и смещением.
var layers = [
{element: "#bg", y: 50, duration: 1200},
{element: "#mid", y: 150, duration: 800},
{element: "#fg", y: 300, duration: 400}
];
layers.forEach(function(layer){
new ScrollMagic.Scene({
triggerElement: layer.element,
duration: layer.duration
})
.setTween(layer.element, {y: layer.y, ease: Linear.easeNone})
.addTo(controller);
});
Слои движутся с разной скоростью, создавая ощущение объёмного пространства: фон медленно, средний слой быстрее, передний слой максимально динамично.
Скорость движения слоев часто зависит от размеров экрана. Для адаптивного контроля рекомендуется пересчитывать длительность сцены и смещения при изменении окна:
window.addEventListener('resize', function(){
controller.destroy(true);
controller = new ScrollMagic.Controller();
initScenes(); // функция, заново создающая сцены с пересчитанными параметрами
});
Это позволяет сохранять эффект параллакса на мобильных устройствах и больших экранах без потери пропорций скорости.
Эти техники позволяют гибко управлять динамикой элементов на странице, создавая профессиональные эффекты параллакса и визуально привлекательные анимации.