Для интеграции анимаций с Locomotive Scroll необходимо подключить библиотеку GSAP. Она доступна несколькими способами: через CDN, npm или yarn.
Через CDN:
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.13.0/gsap.min.js"></script>
Через npm:
npm install gsap
После установки через npm импорт выполняется следующим образом:
import gsap from "gsap";
Если планируется использование плагинов GSAP, например, ScrollTrigger, необходимо подключить их отдельно:
import { ScrollTrigger } from "gsap/ScrollTrigger";
gsap.registerPlugin(ScrollTrigger);
Locomotive Scroll использует виртуальный скролл, поэтому стандартные события прокрутки браузера не применимы напрямую для GSAP ScrollTrigger. Для корректной работы необходимо синхронизировать скролл с GSAP.
import LocomotiveScroll from "locomotive-scroll";
const scrollContainer = document.querySelector("[data-scroll-container]");
const locoScroll = new LocomotiveScroll({
el: scrollContainer,
smooth: true,
multiplier: 1.2,
lerp: 0.1
});
Здесь el — контейнер с атрибутом
data-scroll-container, smooth включает плавную
прокрутку, multiplier управляет скоростью, а
lerp задаёт сглаживание.
GSAP ScrollTrigger необходимо уведомить о позициях скролла Locomotive Scroll:
locoScroll.on("scroll", ScrollTrigger.update);
ScrollTrigger.scrollerProxy(scrollContainer, {
scrollTop(value) {
return arguments.length ? locoScroll.scrollTo(value, 0, 0) : locoScroll.scroll.instance.scroll.y;
},
getBoundingClientRect() {
return { top: 0, left: 0, width: window.innerWidth, height: window.innerHeight };
},
pinType: scrollContainer.style.transform ? "transform" : "fixed"
});
scrollTop синхронизирует позицию прокрутки с GSAP.getBoundingClientRect возвращает размеры видимой
области.pinType определяет способ закрепления элементов (через
transform или fixed) в зависимости от
возможностей браузера.После настройки необходимо обновлять ScrollTrigger при ресайзе и инициализации:
ScrollTrigger.addEventListener("refresh", () => locoScroll.update());
ScrollTrigger.refresh();
Пример анимации элемента при скролле:
gsap.to(".box", {
scrollTrigger: {
trigger: ".box",
scroller: scrollContainer, // важный момент для работы с Locomotive Scroll
start: "top 80%",
end: "bottom 20%",
scrub: true,
},
x: 500,
rotation: 360,
duration: 3
});
scroller указывает контейнер Locomotive Scroll.scrub: true синхронизирует анимацию с прокруткой.start и end задают диапазон анимации
относительно позиции элемента и окна.Locomotive Scroll и GSAP ScrollTrigger поддерживают закрепление элементов:
gsap.to(".section", {
scrollTrigger: {
trigger: ".section",
scroller: scrollContainer,
start: "top top",
end: "+=100%",
pin: true,
pinSpacing: false,
scrub: true
},
backgroundColor: "#ff0000",
});
pin: true фиксирует элемент на экране в течение
скролла.pinSpacing: false отключает добавление отступов, что
важно при кастомном скролле.scrub аккуратно — плавная
синхронизация с прокруткой сильно нагружает рендер, особенно на
мобильных устройствах.scrollerProxy для синхронизации с GSAP.scrollTrigger, указывая контейнер
scroller.Эта схема позволяет комбинировать плавный виртуальный скролл и мощные анимации GSAP, создавая динамичные, отзывчивые интерфейсы.