Библиотека Locomotive Scroll предоставляет мощный инструмент для управления скроллингом с плавной анимацией и контролем положения страницы. Одним из ключевых аспектов является синхронизация скролл-позиции, которая позволяет связывать состояние страницы с другими событиями, анимациями и внешними библиотеками.
Locomotive Scroll хранит текущее положение скролла в объекте scroll.instance.scroll.y. Этот параметр обновляется динамически при каждом скролле.
const scroll = new LocomotiveScroll({
el: document.querySelector('#main-container'),
smooth: true
});
scroll.on('scroll', (instance) => {
console.log('Текущая позиция Y:', instance.scroll.y);
});
el — элемент, который управляет скроллом (часто это
body или контейнер с
data-scroll-container).smooth: true активирует плавный скролл.scroll вызывается при любом изменении
положения, предоставляя объект instance с полной
информацией о скролле.Для синхронизации с анимациями или другими библиотеками иногда требуется программно установить позицию скролла:
scroll.scrollTo(500, {
duration: 1000,
easing: [0.25, 0.0, 0.35, 1.0]
});
scrollTo может принимать числовое значение, элемент DOM
или селектор.duration задает продолжительность анимации в
миллисекундах.easing определяет кривую ускорения для плавного
эффекта.Locomotive Scroll предоставляет несколько событий, которые критичны для синхронизации:
data-scroll-call, позволяет запускать кастомные
функции.scroll.on('call', (value, way, obj) => {
console.log('Элемент достигнут:', value, way);
});
value — значение из атрибута
data-scroll-call.way — направление скролла (up или
down).obj — объект элемента, на котором сработало
событие.Для сложных анимаций часто требуется связать скролл-позицию с таймлайнами GSAP:
gsap.registerPlugin(ScrollTrigger);
ScrollTrigger.scrollerProxy('#main-container', {
scrollTop(value) {
return arguments.length ? scroll.scrollTo(value, 0) : scroll.instance.scroll.y;
},
getBoundingClientRect() {
return { top: 0, left: 0, width: window.innerWidth, height: window.innerHeight };
}
});
scroll.on('scroll', ScrollTrigger.update);
scrollerProxy позволяет ScrollTrigger работать с
кастомным скроллом Locomotive.scrollTop синхронизирует положение скролла между
библиотеками.ScrollTrigger.update гарантирует актуальность анимаций
на каждом кадре.Locomotive Scroll поддерживает горизонтальный скролл и виртуальные контейнеры:
const scroll = new LocomotiveScroll({
el: document.querySelector('#horizontal-container'),
smooth: true,
direction: 'horizontal'
});
direction: 'horizontal' меняет ось
скролла.При синхронизации с анимациями важно избегать лишних пересчетов DOM:
requestAnimationFrame при обработке
тяжелых скролл-событий.scroll.update() после изменений в DOM, чтобы
Locomotive Scroll пересчитал размеры.data-scroll-call для
уменьшения нагрузки на рендер.scroll.on('scroll', () => {
requestAnimationFrame(() => {
// обновление анимаций
});
});
Для синхронизации с навигацией применяют плавный скролл к якорям:
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function(e) {
e.preventDefault();
const target = document.querySelector(this.getAttribute('href'));
scroll.scrollTo(target);
});
});
scrollTo автоматически учитывает текущую позицию и
плавно анимирует переход.scroll.instance.scroll.y.scroll.scrollTo().scroll, call и resize
позволяют синхронизировать внешние анимации.scrollerProxy и вызова
ScrollTrigger.update.Соблюдение этих принципов обеспечивает точную и предсказуемую синхронизацию скролл-позиции с внешними компонентами и анимациями, позволяя строить сложные интерактивные интерфейсы с высокой производительностью.