Для работы с Locomotive Scroll необходимо сначала создать экземпляр
класса LocomotiveScroll. При этом ключевыми параметрами
являются контейнер, в котором будет происходить прокрутка, и флаги
настройки smooth-эффекта.
import LocomotiveScroll from 'locomotive-scroll';
const scroll = new LocomotiveScroll({
el: document.querySelector('#scroll-container'),
smooth: true,
multiplier: 1.2,
});
После создания экземпляра можно привязывать слушатели событий, которые позволяют реагировать на изменения прокрутки и состояние элементов на странице.
Locomotive Scroll предоставляет несколько категорий событий:
data-scroll-call.scrollСобытие scroll используется для получения текущей
позиции прокрутки и управления анимациями в реальном времени.
scroll.on('scroll', (args) => {
console.log('Позиция по оси Y:', args.scroll.y);
console.log('Позиция по оси X:', args.scroll.x);
});
Особенности:
Аргумент args содержит объект с полями:
scroll: текущие координаты прокрутки
{x, y}.limit: максимальные значения прокрутки
{x, y}.direction: направление прокрутки ('up' или
'down' для вертикальной прокрутки).speed: скорость прокрутки.Событие вызывается на каждом кадре при изменении позиции, поэтому
внутри обработчика не рекомендуется выполнять тяжелые вычисления без
оптимизации через requestAnimationFrame или
throttle.
callСобытие call позволяет реагировать на элементы с
атрибутом data-scroll-call.
Пример HTML:
<div data-scroll data-scroll-call="fadeIn" data-scroll-repeat>
Контент
</div>
Привязка слушателя в Jav * aScript:
scroll.on('call', (func, direction, obj) => {
if (func === 'fadeIn' && direction === 'enter') {
obj.el.classList.add('visible');
}
});
Пояснения:
func – значение из атрибута
data-scroll-call.direction – направление появления элемента:
'enter' или 'leave'.obj – объект с элементом и другими параметрами, такими
как прогресс видимости.Дополнительно: атрибут
data-scroll-repeat позволяет повторно срабатывать событию
при повторном входе элемента в зону видимости.
scrollToСобытие scrollTo срабатывает после завершения анимации
прокрутки к конкретной позиции, заданной методом
scroll.scrollTo().
scroll.scrollTo('#target-section', {
offset: -50,
duration: 800,
easing: [0.25, 0.00, 0.35, 1.00]
});
scroll.on('scrollTo', (obj) => {
console.log('Анимация прокрутки завершена', obj);
});
Параметры объекта scrollTo:
offset – смещение от целевого элемента.duration – время анимации в миллисекундах.easing – кривая ускорения анимации, задается массивом
из 4 чисел для cubic-bezier.Объект события содержит информацию о завершенной прокрутке и целевом элементе.
resizeСобытие resize используется для реагирования на
изменение размеров контейнера или окна, что важно для пересчета
внутренних параметров прокрутки.
scroll.on('resize', (obj) => {
console.log('Новые размеры контейнера:', obj.currentElements);
});
Советы по использованию:
scroll.update() для корректного пересчета координат.debounce, чтобы избежать частого
вызова при быстром изменении размера окна.Каждый элемент с атрибутами data-scroll и
data-scroll-repeat поддерживает отслеживание прогресса
появления на экране:
scroll.on('scroll', ({ currentElements }) => {
Object.values(currentElements).forEach(el => {
if (el.progress) {
el.el.style.opacity = el.progress;
}
});
});
currentElements – объект, где ключи – уникальные
идентификаторы элементов, а значения – информация о текущем
состоянии.progress – значение от 0 до 1, отражающее степень
видимости элемента.Это позволяет реализовать сложные анимации и эффекты при прокрутке, такие как fade, scale или parallax.
Для оптимизации работы страницы или при уничтожении экземпляра
LocomotiveScroll можно удалить слушатели:
scroll.off('scroll');
scroll.off('call');
scroll.destroy();
off – отключает конкретное событие.destroy – полностью уничтожает объект прокрутки,
освобождая ресурсы и убирая все слушатели.requestAnimationFrame для вычислений
внутри событий scroll.scroll.update() после динамических изменений
контента.data-scroll-repeat, чтобы события срабатывали корректно при
повторной видимости.С помощью этих инструментов можно полностью управлять поведением элементов при прокрутке, реализуя плавные анимации и интерактивные эффекты.