Locomotive Scroll реализует концепцию виртуального скролла, которая отличается от стандартного браузерного поведения прокрутки. В основе подхода лежит подмена нативного скролла управляемой анимацией, что позволяет создавать плавные эффекты инерции, параллакса и кастомные анимации при прокрутке.
Locomotive Scroll создаёт внутренний контейнер,
который управляет положением содержимого страницы через CSS-свойство
transform: translate3d. Вместо того чтобы полагаться на
нативный скролл браузера, библиотека отслеживает движение
контейнера виртуально, вычисляя текущую позицию скролла и
обновляя её в реальном времени:
[data-scroll-container] {
will-change: transform;
transform: translate3d(0, 0, 0);
}
data-scroll-container — элемент,
содержащий весь скроллируемый контент.will-change: transform позволяет браузеру заранее
оптимизировать отрисовку, что улучшает производительность.Благодаря этому подходу появляется возможность реализовать плавную прокрутку с эффектом инерции, даже если стандартный скролл страницы отключён.
Locomotive Scroll использует внутренние переменные, которые хранят текущее и целевое положение скролла. Основная логика сводится к следующему:
current) —
фактическая позиция контейнера на экране.target) — позиция,
которую задаёт пользователь с помощью колесика мыши, тачскрина или
свайпа.lerp) — плавное приближение
текущей позиции к целевой:current += (target - current) * ease;
ease — коэффициент сглаживания (обычно 0.1–0.15).Locomotive Scroll перехватывает несколько типов взаимодействий:
scrollTo).Каждое событие не изменяет стандартный скролл
браузера, а лишь обновляет target. После этого
библиотека запускает внутренний цикл анимации, который вычисляет
новое положение current и обновляет transform
контейнера.
Одним из ключевых преимуществ виртуального скролла является возможность привязывать элементы к прокрутке:
data-scroll — активирует отслеживание
позиции элемента.data-scroll-speed — задаёт скорость
движения относительно основной прокрутки.data-scroll-direction — направление
анимации (вертикальное или горизонтальное).Пример параллакс-эффекта:
<div data-scroll data-scroll-speed="2">
Плавающий элемент
</div>
2 означает, что элемент будет двигаться в два
раза быстрее базового скролла.transform и opacity
для создания сложных анимаций.Locomotive Scroll позволяет подписываться на события жизненного цикла скролла:
scroll — вызывается при каждом
обновлении положения.call — триггер для кастомных функций
при достижении определённых элементов.enter / leave — фиксируют
момент появления или исчезновения элемента из видимой области.Пример использования:
scroll.on('call', (func, way, obj) => {
if(func === 'animate') {
obj.el.classList.add('active');
}
});
way указывает направление
(up/down).obj.el — целевой элемент.Основная нагрузка ложится на GPU, поскольку
трансформация элементов через translate3d использует
аппаратное ускорение. Для оптимизации рекомендуется:
will-change: transform на
всех часто анимируемых элементах.smooth только на контейнерах,
где это реально необходимо.Locomotive Scroll поддерживает и горизонтальное направление:
const scroll = new LocomotiveScroll({
el: document.querySelector('[data-scroll-container]'),
smooth: true,
direction: 'horizontal'
});
x.data-scroll-speed будут смещаться
горизонтально.Виртуальный скролл Locomotive Scroll работает по циклу:
target позиции
скролла.current через интерполяцию.transform: translate3d.Благодаря такому подходу обеспечивается плавность, контроль над анимациями и возможность сложных визуальных эффектов, недоступных при стандартном скролле браузера.