В ScrollMagic пиннинг (pinning) позволяет закрепить элемент на экране на определённый промежуток прокрутки. В стандартном вертикальном режиме это достаточно просто: элемент фиксируется по вертикали на время действия сцены. Для горизонтального режима нужно учитывать изменения координат и направления прокрутки, поскольку по умолчанию ScrollMagic ориентирован на вертикальную прокрутку страницы.
Ключевой момент: горизонтальный пиннинг работает
через преобразование оси прокрутки с y на x.
Для этого необходимо использовать настройки сцены и контейнера с
горизонтальной прокруткой.
var controller = new ScrollMagic.Controller({vertical: false});
Параметр vertical: false сообщает контроллеру, что
основная ось прокрутки — горизонтальная. Все сцены, созданные этим
контроллером, будут рассчитываться по горизонтальной оси.
Для закрепления элемента в горизонтальном режиме используется метод
.setPin(). Синтаксис аналогичен вертикальному режиму,
однако следует учитывать размеры элемента и контейнера.
var scene = new ScrollMagic.Scene({
triggerElement: "#trigger",
duration: 500 // длина сцены по горизонтальной оси
})
.setPin("#pinnedElement")
.addTo(controller);
Особенности:
triggerElement — элемент, при котором начинается
пиннинг. Он должен быть видимым в контейнере с горизонтальной
прокруткой.duration — длина сцены в пикселях по оси
x. В горизонтальном режиме это определяет, насколько долго
элемент остаётся закреплённым при прокрутке вправо.При горизонтальном пиннинге часто требуется смещать элемент относительно начала сцены:
var scene = new ScrollMagic.Scene({
triggerElement: "#trigger",
duration: 600,
offset: 100 // смещение относительно триггера
})
.setPin("#pinnedElement")
.addTo(controller);
Здесь:
offset задаёт расстояние от начала триггерного
элемента, после которого начинается пиннинг.offset и duration для
создания плавных анимаций, когда элемент закрепляется постепенно.Для создания динамических эффектов пиннинг в горизонтальном режиме можно совмещать с анимациями через GSAP или другие tween-библиотеки:
var tween = gsap.to("#pinnedElement", {x: 300, rotation: 15, duration: 1});
var scene = new ScrollMagic.Scene({
triggerElement: "#trigger",
duration: 800
})
.setTween(tween)
.setPin("#pinnedElement")
.addTo(controller);
Важные моменты:
x в GSAP указывает смещение по горизонтальной оси, что
идеально сочетается с горизонтальным пиннингом ScrollMagic.duration) по
мере прокрутки, создавая синхронный эффект движения и закрепления.Иногда требуется закрепить элемент горизонтально, но при этом внутри него остаётся вертикальный контент. Для этого нужно правильно настроить CSS контейнера:
#horizontalContainer {
display: flex;
overflow-x: scroll;
height: 300px;
}
.pinnedElement {
flex-shrink: 0;
width: 200px;
}
display: flex и overflow-x: scroll.При горизонтальном пиннинге важно учитывать ширину экрана и устройства:
duration.duration
динамически:var sceneDuration = document.querySelector('#horizontalContainer').scrollWidth - window.innerWidth;
var scene = new ScrollMagic.Scene({
triggerElement: "#trigger",
duration: sceneDuration
})
.setPin("#pinnedElement")
.addTo(controller);
Пояснение: так сцена будет занимать ровно всю ширину контента, обеспечивая корректное закрепление элемента независимо от размера окна.
touchmove.overflow: hidden на родителе.Можно закреплять несколько элементов одновременно, создавая горизонтальные «секции»:
var controller = new ScrollMagic.Controller({vertical: false});
var sections = document.querySelectorAll(".section");
sections.forEach(function(section, index) {
new ScrollMagic.Scene({
triggerElement: section,
duration: 400
})
.setPin(section)
.addTo(controller);
});
ScrollMagic отлично работает с GSAP, Velocity.js и другими библиотеками. В горизонтальном пиннинге анимации могут быть синхронизированы с прокруткой:
setTween() управляет анимацией смещения или
трансформаций.setClassToggle() позволяет менять классы для запуска
CSS-анимаций на определённом отрезке прокрутки.Эта техника горизонтального пиннинга позволяет создавать сложные визуальные эффекты, карусели, горизонтальные параллаксы и интерактивные секции, которые реагируют на прокрутку пользователя, сохраняя плавность и контроль над элементами интерфейса.