ScrollMagic — это мощная библиотека для управления анимацией элементов на странице в зависимости от скролла. Одной из продвинутых техник является сочетание вертикального и горизонтального скролла, что позволяет создавать сложные эффекты прокрутки, включая параллакс, слайды и многоуровневые анимации.
Контроллер — центральный объект, который управляет сценами. Для сочетания вертикального и горизонтального скролла важно понимать, что контроллер по умолчанию ориентирован на вертикальную прокрутку страницы:
var controller = new ScrollMagic.Controller();
Для горизонтальной прокрутки необходимо использовать CSS-трюки с
контейнером, чтобы прокрутка шла по оси X, либо использовать
horizontal: true в случае адаптации сторонних расширений
ScrollMagic.
Чтобы реализовать эффект горизонтальной прокрутки, управляемой вертикальным скроллом, создаётся контейнер с фиксированной высотой, внутри которого элементы располагаются горизонтально:
Секция 1
Секция 2
Секция 3
.horizontal-wrapper {
height: 100vh;
overflow: hidden;
position: relative;
}
.horizontal-container {
display: flex;
width: 300%; /* 3 секции */
transition: transform 0.3s ease-out;
}
.panel {
width: 100vw;
flex-shrink: 0;
}
Далее создаётся сцена ScrollMagic для управления трансформацией контейнера:
var horizontalScene = new ScrollMagic.Scene({
triggerElement: ".horizontal-wrapper",
triggerHook: "onLeave",
duration: () => document.querySelector(".horizontal-container").scrollWidth - window.innerWidth
})
.setPin(".horizontal-wrapper")
.setTween(TweenMax.to(".horizontal-container", 1, {x: "-66.666%" })) // смещение на 2 панели
.addTo(controller);
Ключевые моменты:
setPin фиксирует контейнер на время анимации.duration рассчитывается исходя из ширины всех
внутренних секций.TweenMax.to (или GSAP) управляет горизонтальным
смещением контейнера.В сложных интерфейсах могут понадобиться одновременно вертикальные и горизонтальные анимации. Для этого создаются несколько сцен с разными триггерами:
// Вертикальная анимация
new ScrollMagic.Scene({
triggerElement: "#vertical-section",
duration: 500
})
.setTween(TweenMax.from("#vertical-section h2", 1, {opacity:0, y:50}))
.addTo(controller);
// Горизонтальная анимация внутри вертикального скролла
new ScrollMagic.Scene({
triggerElement: ".horizontal-wrapper",
triggerHook: "onEnter",
duration: () => document.querySelector(".horizontal-container").scrollWidth - window.innerWidth
})
.setPin(".horizontal-wrapper")
.setTween(TweenMax.to(".horizontal-container", 1, {x: "-66.666%"}))
.addTo(controller);
Такой подход позволяет создавать многоуровневые эффекты, где элементы вертикального скролла взаимодействуют с горизонтально движущимися блоками.
Для придания динамики можно анимировать элементы внутри горизонтальных секций независимо:
document.querySelectorAll(".panel").forEach((panel, index) => {
new ScrollMagic.Scene({
triggerElement: panel,
triggerHook: 0.5,
duration: "50%"
})
.setTween(TweenMax.from(panel.querySelector(".content"), 1, {scale: 0.8, opacity:0}))
.addTo(controller);
});
Особенности:
triggerHook: 0.5 означает середину экрана как точку
активации.Горизонтальные сцены требуют динамического расчёта ширины, чтобы анимация корректно работала на разных устройствах:
function updateHorizontalScene() {
horizontalScene.duration(document.querySelector(".horizontal-container").scrollWidth - window.innerWidth);
}
window.addEventListener("resize", updateHorizontalScene);
Без этой адаптации горизонтальная прокрутка будет некорректно работать при изменении размеров окна.
Можно создавать цепочки сцен, где:
Используется принцип вложенных сцен и setPin, чтобы
фиксировать нужные блоки, а GSAP управляет всеми трансформациями. Это
позволяет создавать эффект “скролл-истории”, где движения по обеим осям
управляются одним контроллером.