Для работы с Locomotive Scroll необходимо подключить библиотеку через npm или CDN. При использовании npm достаточно выполнить:
npm install locomotive-scroll
После установки импортируется класс и создаётся экземпляр:
import LocomotiveScroll from 'locomotive-scroll';
const scroll = new LocomotiveScroll({
el: document.querySelector('#js-scroll'),
smooth: true,
multiplier: 1,
lerp: 0.1
});
Ключевые параметры:
el — контейнер с контентом, к которому применяется
скролл. Обычно это блок с overflow: hidden.smooth — включает плавный скроллинг.multiplier — скорость скролла, где 1 — стандартная, 2 —
в два раза быстрее.lerp — коэффициент сглаживания для инерции
движения.Контейнер должен содержать атрибут data-scroll-container
для корректной работы:
<div id="js-scroll" data-scroll-container>
<section>Секция 1</section>
<section>Секция 2</section>
<section>Секция 3</section>
</div>
Каждая секция лендинга может иметь собственные анимации при появлении
в области видимости. Для этого используется атрибут
data-scroll и опционально data-scroll-speed
или data-scroll-delay.
<section data-scroll data-scroll-speed="2">
<h2>Заголовок с ускорением</h2>
</section>
<section data-scroll data-scroll-delay="0.2">
<p>Текст с задержкой анимации</p>
</section>
Пояснения:
data-scroll — активирует анимацию скролла для
элемента.data-scroll-speed — регулирует скорость движения
относительно скролла. Положительное значение ускоряет движение,
отрицательное замедляет или создаёт эффект параллакса.data-scroll-delay — задаёт задержку анимации при входе
элемента в область видимости.Locomotive Scroll предоставляет возможность реагировать на события:
scroll.on('scroll', (instance) => {
console.log(instance.scroll.y); // Текущая позиция скролла по Y
});
scroll.on('call', (func, way, obj) => {
console.log(func, way, obj); // Вызов при достижении элемента с data-scroll-call
});
События позволяют:
Для более сложных эффектов сочетание Locomotive Scroll с IntersectionObserver позволяет запускать анимации только когда элемент видим. Пример:
const sections = document.querySelectorAll('section');
sections.forEach(section => {
const observer = new IntersectionObserver(entries => {
entries.forEach(entry => {
if (entry.isIntersecting) {
section.classList.add('active');
} else {
section.classList.remove('active');
}
});
}, { threshold: 0.5 });
observer.observe(section);
});
Добавление классов к секциям позволяет управлять CSS-анимациями через трансформации, opacity, translateY и scale.
Параллакс создаётся через data-scroll-speed для
элементов внутри секции. Пример:
<section class="hero">
<h1 data-scroll data-scroll-speed="3">Главный заголовок</h1>
<img src="background.jpg" data-scroll data-scroll-speed="-1" />
</section>
Принцип работы:
3).-1), создавая эффект
глубины.Для более точного контроля можно комбинировать
data-scroll-direction (vertical или
horizontal) и data-scroll-target, чтобы
ограничить эффект конкретными контейнерами.
При динамическом добавлении контента необходимо уведомлять Locomotive Scroll о новых элементах:
scroll.update();
Это важно для лендингов с секциями, которые подгружаются по мере скролла или появляются при клике на кнопку.
<section class="section">
<div data-scroll data-scroll-speed="2" class="text">Текст</div>
<div data-scroll data-scroll-speed="-2" class="image"><img src="img.jpg" /></div>
</section>
<section class="horizontal">
<div data-scroll-container>
<div data-scroll-section style="display: flex;">
<div data-scroll data-scroll-speed="1">Блок 1</div>
<div data-scroll data-scroll-speed="2">Блок 2</div>
<div data-scroll data-scroll-speed="3">Блок 3</div>
</div>
</div>
</section>
<p data-scroll data-scroll-speed="0.5" data-scroll-delay="0.1">Плавный текст</p>
Элементы с небольшой скоростью создают ощущение лёгкого движения, а с задержкой — более плавное появление при прокрутке.
requestAnimationFrame только для ключевых анимаций.data-scroll-speed.scroll.update() только после добавления или
удаления контента, чтобы избежать лишних перерасчётов.Locomotive Scroll легко комбинируется с:
Пример интеграции с GSAP:
gsap.to('.text', {
scrollTrigger: {
trigger: '.text',
scroller: '#js-scroll',
start: 'top 80%',
end: 'bottom 20%',
scrub: true
},
y: -100,
opacity: 1
});
Использование scroller: '#js-scroll' позволяет
синхронизировать Locomotive Scroll с GSAP ScrollTrigger.