GSAP (GreenSock Animation Platform) предоставляет гибкие средства для создания сложных анимаций, включая анимации прокрутки. Горизонтальный скролл реализуется с помощью ScrollTrigger, который позволяет синхронизировать анимацию с прокруткой страницы, а также с помощью методов управления свойствами объектов.
Для реализации горизонтальной прокрутки создаётся контейнер с фиксированной высотой и шириной, превышающей ширину видимой области. Элементы внутри располагаются в ряд с использованием CSS:
.scroll-container {
display: flex;
overflow-x: hidden;
width: 100vw;
height: 100vh;
}
.scroll-item {
flex: 0 0 auto;
width: 100vw;
height: 100vh;
}
Такой подход позволяет контролировать движение всех элементов внутри контейнера с помощью анимации смещения по оси X.
Для горизонтальной анимации используется метод gsap.to()
с параметром x или xPercent, совместно с
ScrollTrigger. Например:
gsap.registerPlugin(ScrollTrigger);
const container = document.querySelector(".scroll-container");
const items = gsap.utils.toArray(".scroll-item");
gsap.to(items, {
xPercent: -100 * (items.length - 1),
ease: "none",
scrollTrigger: {
trigger: container,
pin: true,
scrub: 1,
end: () => "+=" + container.offsetWidth
}
});
Ключевые моменты:
xPercent — используется для смещения элементов
относительно их ширины, что упрощает адаптивность.pin: true фиксирует контейнер на экране во время
прокрутки.scrub: 1 связывает скорость анимации с прокруткой
страницы.end рассчитывается динамически, чтобы анимация
завершалась после полной прокрутки всех элементов.Параметр scrub может быть числом или true.
Значение true делает движение полностью синхронизированным
с прокруткой, а числовое значение добавляет эффект инерции.
scrollTrigger: {
trigger: container,
pin: true,
scrub: 0.5
}
Для корректной работы на разных устройствах важно учитывать
динамическую ширину контейнера. Использование
xPercent вместо фиксированных пикселей упрощает
адаптивность.
Если контейнер содержит изображения или динамически создаваемые элементы, перед запуском анимации необходимо дождаться их загрузки:
window.addEventListener("load", () => {
// запуск анимации после полной загрузки
});
Для реализации последовательного горизонтального скролла нескольких
секций можно использовать gsap.timeline():
const tl = gsap.timeline({
scrollTrigger: {
trigger: container,
pin: true,
scrub: 1,
end: () => "+=" + container.scrollWidth
}
});
tl.to(".section1", { xPercent: -100 })
.to(".section2", { xPercent: -200 })
.to(".section3", { xPercent: -300 });
Преимущества использования timeline:
GSAP позволяет комбинировать горизонтальный скролл с другими визуальными эффектами. Например, добавление масштабирования и прозрачности при движении:
gsap.to(".scroll-item", {
xPercent: -100 * (items.length - 1),
scale: 0.8,
opacity: 0.7,
ease: "power1.out",
scrollTrigger: {
trigger: container,
pin: true,
scrub: true,
end: () => "+=" + container.scrollWidth
}
});
snap для эффектов перелистыванияДля создания ощущения «перелистывания» можно использовать свойство
snap:
scrollTrigger: {
trigger: container,
pin: true,
scrub: 1,
end: () => "+=" + container.scrollWidth,
snap: 1 / (items.length - 1)
}
Snap автоматически фиксирует прокрутку на каждой секции,
делая горизонтальное движение более удобным для пользователя.
xPercent вместо x уменьшает
нагрузку на рендеринг.pin) требует GPU-ускорения,
поэтому рекомендуется применять
transform: translate3d(0,0,0) через GSAP или CSS.Горизонтальный скролл с GSAP сочетает контроль, плавность и
адаптивность. Использование ScrollTrigger,
xPercent и timeline позволяет создавать сложные визуальные
эффекты с минимальным количеством кода и высокой
производительностью.