ScrollMagic — это библиотека для создания скролл-анимаций в веб-приложениях, которая изначально ориентирована на вертикальный скролл. Однако она также поддерживает горизонтальные триггеры и анимации, что позволяет создавать интерактивные эффекты при движении по оси X. Основная идея горизонтального скролла заключается в том, что ScrollMagic может отслеживать смещение элемента по горизонтали и запускать сцены (scenes) аналогично вертикальному скроллу.
Для работы с горизонтальным скроллом важно правильно подготовить
контейнер. Обычно используется overflow-x: scroll и
фиксированная ширина контента. Пример HTML-разметки:
<div class="scroll-container">
<section class="panel" id="panel1"></section>
<section class="panel" id="panel2"></section>
<section class="panel" id="panel3"></section>
</div>
CSS для горизонтального скролла:
.scroll-container {
display: flex;
overflow-x: scroll;
scroll-snap-type: x mandatory;
width: 100%;
height: 100vh;
}
.panel {
flex: 0 0 100%;
height: 100%;
}
Здесь каждый .panel занимает всю ширину окна, а
контейнер обеспечивает горизонтальную прокрутку.
По умолчанию ScrollMagic использует вертикальный скролл страницы. Для
горизонтальной прокрутки нужно задать контроллер с
vertical: false и указать container:
var controller = new ScrollMagic.Controller({
vertical: false,
container: document.querySelector(".scroll-container")
});
Параметр vertical: false сообщает библиотеке, что
движение будет происходить по оси X.
Сцена (Scene) — основной объект, который отслеживает позицию и запускает анимацию. Для горизонтального скролла важны следующие ключевые параметры:
triggerElement.Пример создания сцены для сдвига блока при горизонтальном скролле:
var scene = new ScrollMagic.Scene({
triggerElement: "#panel2",
triggerHook: 0.5, // середина контейнера
duration: 300, // 300px горизонтального скролла
offset: 50
})
.setTween("#panel2", { x: -200 }) // сдвигаем блок по оси X
.addTo(controller);
Важное отличие от вертикального скролла — x и
y координаты анимации ориентируются на горизонталь.
setPin в горизонтальном скроллеМетод .setPin() позволяет закреплять элементы на месте
во время прокрутки. При горизонтальном скролле setPin
работает аналогично вертикальному:
new ScrollMagic.Scene({
triggerElement: "#panel3",
triggerHook: 0,
duration: 500
})
.setPin("#panel3")
.addTo(controller);
Элемент будет «приклеен» к левому краю контейнера, пока длится сцена. Для горизонтальных эффектов это особенно полезно при создании параллакса и слайдеров.
tween и
GSAP-анимацийДля плавных анимаций часто используется GSAP. Пример анимации движения нескольких блоков при горизонтальном скролле:
var tween = gsap.timeline()
.to("#panel1", { x: -100 })
.to("#panel2", { x: -200 });
var scene = new ScrollMagic.Scene({
triggerElement: ".scroll-container",
duration: 800,
triggerHook: 0
})
.setTween(tween)
.addTo(controller);
GSAP автоматически учитывает координаты по оси X, что упрощает создание сложных последовательностей анимаций.
В горизонтальном скролле часто требуется запускать сцены в
зависимости от позиции элемента, которая может изменяться при ресайзе
окна. ScrollMagic позволяет использовать функции для
triggerElement и duration:
var scene = new ScrollMagic.Scene({
triggerElement: () => document.querySelector("#panel2"),
duration: () => window.innerWidth / 2
})
.setTween("#panel2", { x: -150 })
.addTo(controller);
Это позволяет сцены адаптироваться к ширине экрана и размерам контейнера, делая анимацию отзывчивой.
ScrollMagic предоставляет события enter,
leave, start, end для
отслеживания состояния сцены. Например:
scene.on("enter", () => console.log("Элемент достигнут по горизонтали"));
scene.on("leave", () => console.log("Элемент покинут"));
Для отладки удобно использовать .addIndicators(),
который визуально показывает триггеры и длительность сцены:
scene.addIndicators({name: "panel2 horizontal"});
white-space: nowrap или
display: flex для контейнера.triggerHook: 0 или 0.5 для
точного позиционирования.Горизонтальные триггеры в ScrollMagic открывают возможность создания
сложных интерфейсов: слайдеров, параллаксов, горизонтальных лендингов.
Комбинация Controller с vertical: false,
Scene, setPin и GSAP-анимаций позволяет гибко
управлять поведением элементов и создавать динамичный пользовательский
опыт.