Locomotive Scroll предоставляет мощный инструмент для плавного скроллинга с поддержкой инерции, но его потенциал полностью раскрывается при использовании кастомных easing-функций. Easing определяет скорость анимации во времени, что позволяет создавать уникальные визуальные эффекты, от линейного движения до сложных кривых с ускорением и замедлением.
Easing-функции в Locomotive Scroll настраиваются через объект конфигурации при инициализации скроллера:
const scroll = new LocomotiveScroll({
el: document.querySelector('[data-scroll-container]'),
smooth: true,
lerp: 0.1, // базовое сглаживание
easing: (t) => t < 0.5 ? 2*t*t : -1+(4-2*t)*t // кастомная функция
});
Ключевые моменты:
t — это значение прогресса анимации от 0 до 1.Линейные Простейший тип, при котором скорость постоянна:
easing: t => tКвадратичные и кубические Позволяют создавать ускорение или замедление:
easing: t => t*t // ускорение
easing: t => 1 - (--t)*t*t // замедлениеСинусоидальные Обеспечивают мягкое начало и окончание движения:
easing: t => 0.5 * (1 - Math.cos(Math.PI * t))Экспоненциальные Создают эффект резкого старта или финиша:
easing: t => t === 0 ? 0 : Math.pow(1024, t-1)Для сложных эффектов можно комбинировать несколько функций:
const customEasing = t => {
if (t < 0.3) return 3*t*t;
if (t < 0.7) return 0.5 + 2*(t-0.5)*(t-0.5);
return 1 - Math.pow(1-t, 3);
}
const scroll = new LocomotiveScroll({
el: document.querySelector('[data-scroll-container]'),
smooth: true,
easing: customEasing
});
Такой подход позволяет создавать сегментированные кривые, где разные участки скролла имеют собственное ускорение или замедление.
lerp (linear interpolation) определяет сглаживание
движения скролла. При использовании кастомных easing-функций нужно
учитывать, что большие значения lerp смягчают эффект
кривой, а малые — делают движение более резким. Оптимальные
значения обычно находятся в диапазоне 0.05–0.15.
const scroll = new LocomotiveScroll({
el: document.querySelector('[data-scroll-container]'),
smooth: true,
lerp: 0.08,
easing: t => t < 0.5 ? 2*t*t : -1+(4-2*t)*t
});
Создание графика easing-функции помогает визуально оценить движение.
Для этого можно использовать requestAnimationFrame:
function drawEasing(easing) {
const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.beginPath();
for (let i = 0; i <= 1; i += 0.01) {
const x = i * canvas.width;
const y = canvas.height - easing(i) * canvas.height;
ctx.lineTo(x, y);
}
ctx.stroke();
}
drawEasing(t => 0.5 * (1 - Math.cos(Math.PI * t)));
Это позволяет тонко настраивать кривую и сразу видеть результат, что особенно важно для интерактивных сайтов с плавным скроллом.
В реальных проектах кастомные easing-функции применяются:
Эффективное использование кастомных кривых повышает воспринимаемую живость интерфейса и позволяет создавать уникальные скролл-эффекты, недостижимые стандартными библиотеками.