В библиотеке Locomotive Scroll плавное скроллирование реализуется через внутренние методы интерполяции. Одним из ключевых инструментов для управления плавностью является lerp (linear interpolation). Этот механизм позволяет сглаживать движения, создавая эффект естественного замедления и ускорения, а также предотвращает резкие «рывки» при прокрутке страницы.
Функция линейной интерполяции (lerp) вычисляет значение между двумя точками на основе коэффициента интерполяции:
lerp(current, target, ease)
Принцип работы: каждый кадр Locomotive Scroll пересчитывает позицию с
использованием lerp. В результате фактическая прокрутка
никогда не скачет напрямую к целевому значению, а постепенно
подстраивается под него.
При инициализации скролла можно задать параметр lerp,
который определяет степень плавности:
const scroll = new LocomotiveScroll({
el: document.querySelector('#scroll-container'),
smooth: true,
lerp: 0.1
});
Важно помнить: lerp влияет на скорость отклика скролла. При слишком низком значении движение будет «тянущимся», при слишком высоком – скролл станет почти мгновенным, теряя эффект плавности.
Помимо стандартного скролла, lerp удобно использовать для синхронизации анимаций элементов с прокруткой. Пример с элементом, который должен следовать за скроллом с плавным смещением:
const target = 0;
let current = 0;
const ease = 0.08;
scroll.on('scroll', (obj) => {
const scrollY = obj.scroll.y;
current = lerp(current, scrollY, ease);
element.style.transform = `translateY(${current}px)`;
});
function lerp(start, end, t) {
return start * (1 - t) + end * t;
}
Такой подход позволяет разделить визуальное смещение от реальной прокрутки, создавая параллакс-эффекты и плавные движения, которые не зависят напрямую от скорости скролла пользователя.
Эффект lerp может ощущаться по-разному на десктопе и мобильных устройствах. Для адаптивного поведения рекомендуется динамически изменять коэффициент:
const isMobile = window.innerWidth < 768;
const lerpValue = isMobile ? 0.05 : 0.1;
const scroll = new LocomotiveScroll({
el: document.querySelector('#scroll-container'),
smooth: true,
lerp: lerpValue
});
smooth: false – эффект
интерполяции не будет работать.const speed = Math.abs(obj.delta.y);
const dynamicLerp = Math.min(0.2, 0.05 + speed / 200);
current = lerp(current, obj.scroll.y, dynamicLerp);
Комбинация с requestAnimationFrame: для сложных
визуальных эффектов можно отделить рендер элементов от события
scroll, используя собственный цикл с lerp.
Интеграция с GSAP: значения, получаемые через lerp, легко передавать в анимации GSAP для создания плавных таймлайнов, синхронизированных с прокруткой.
Эффективное использование lerp в Locomotive Scroll позволяет создавать естественные, органичные скроллы, управлять скоростью и плавностью анимаций, а также интегрировать скролл с параллакс-эффектами и кастомными визуальными элементами.