Реалізація Lenis / Locomotive Scroll для плавного скролу
LCP на мобільних просідає через дискретний скрол — користувачі бачать смиканий parallax і низький FPS. Рішення — Lenis або Locomotive Scroll. Наш досвід: у 50+ проєктах ми досягли стабільних 60 FPS навіть на iPhone SE. Без цих бібліотек реалізація smooth scrolling виглядає переривчасто, а інерція відсутня. Для кінематографічного ефекту потрібна правильна інтеграція — ми покажемо, як уникнути типових помилок.
Замовники все частіше запитують кінематографічний скрол — це тренд у вебі. Наша команда, з досвідом full-stack розробки понад 5 років, інтегрувала обидві бібліотеки в десятках проєктів: від лендінгів до складних SPA. Ось як робити це правильно.
Яку бібліотеку обрати: Lenis чи Locomotive Scroll?
Перша дилема — вибір бібліотеки. Lenis легший за Locomotive Scroll у 3 рази (5 KB проти 15 KB у gzip), активно підтримується в репозиторії Lenis і не прив'язує до певної HTML-структури. Згідно з документацією, бібліотека оптимізована для сучасних бандлерів. Locomotive Scroll v2 доречний, якщо потрібен вбудований parallax без додаткових бібліотек, але для кастомних анімацій Lenis дає більше контролю. FPS на мобільних у Lenis вищий у 1.5-2 рази (60 FPS проти 30-40 FPS). Економія бюджету на ліцензіях у порівнянні з комерційними аналогами суттєва.
| Характеристика | Lenis | Locomotive Scroll v2 |
|---|---|---|
| Вага (min+gzip) | ~5 KB | ~15 KB |
| Вбудований parallax | Ні (через ScrollTrigger) | Є (data-speed) |
| React-інтеграція | Проста (контекст) | Потребує обгортки |
| Підтримка | Активна (Darkroom) | Сповільнена |
| iOS smooth touch | Вимикається опцією | Вбудований fallback |
| FPS на мобільних | 60 FPS | 30-40 FPS |
Як встановити Lenis і запустити плавний скрол
Установка через пакетний менеджер:
npm install lenis Створення екземпляра з налаштуваннями:
import Lenis from 'lenis'; const lenis = new Lenis({ duration: 1.2, easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)), orientation: 'vertical', smoothWheel: true, touchMultiplier: 2, }); function raf(time: number) { lenis.raf(time); requestAnimationFrame(raf); } requestAnimationFrame(raf); Як інтегрувати Lenis з GSAP ScrollTrigger
Це основний кейс: Lenis керує скролом, ScrollTrigger — анімаціями. Після створення Lenis підпишіться на подію scroll і оновлюйте ScrollTrigger. Замініть стандартний ticker GSAP на виклик lenis.raf.
import gsap from 'gsap'; import ScrollTrigger from 'gsap/ScrollTrigger'; gsap.registerPlugin(ScrollTrigger); lenis.on('scroll', ScrollTrigger.update); gsap.ticker.add((time) => { lenis.raf(time * 1000); }); gsap.ticker.lagSmoothing(0); Завдяки цьому анімації ScrollTrigger синхронізуються з віртуальним скролом. Економія часу на налагодження — до 2 годин типових багів з розсинхроном.
Як інтегрувати Lenis з React?
React-інтеграція потребує контексту та хука. Створіть LenisProvider і використовуйте useLenis для програмного скролу. Це спрощує реалізацію React smooth scroll.
import { createContext, useContext, useEffect, useRef } from 'react'; import Lenis from 'lenis'; const LenisContext = createContext<Lenis | null>(null); export const LenisProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { const lenisRef = useRef<Lenis | null>(null); useEffect(() => { const lenis = new Lenis(); lenisRef.current = lenis; const raf = (time: number) => lenis.raf(time); requestAnimationFrame(raf); return () => { lenis.destroy(); }; }, []); return <LenisContext.Provider value={lenisRef.current}>{children}</LenisContext.Provider>; }; export const useLenis = () => useContext(LenisContext); Важно створювати екземпляр у useEffect і викликати destroy при демонтуванні.
Що робити з типовими помилками
Ось покрокова інструкція для вирішення частих проблем:
- Динамічний контент: після додавання елементів через fetch або React-стани викличте
lenis.resize()абоScrollTrigger.refresh(). - Вкладені скроляні контейнери: виключіть модальні вікна з віртуального скролу, додавши їм атрибут
data-lenis-prevent. - Мобільні пристрої: вимкніть
smoothTouchна iOS (опціяsmoothTouch: false) і використовуйтеwill-change: transformна parallax-елементах для примусового GPU-прискорення. - Продуктивність: відстежуйте FPS за допомогою
lenis.on('scroll', ...). Якщо на слабких пристроях просідання нижче 50 FPS, зменшіть параметрdurationдо 0.8 або вимкніть плавність для старих Android-версій.
Часта помилка: N+1 query при parallax
При динамічному оновленні контенту з parallax-ефектами без виклику `lenis.resize()` виникає N+1 запит — кожен новий елемент ініціює окремий перерахунок скролу. Це просідає FPS до 20. Рішення: використовувати ResizeObserver або Batch updates.Порівняння часу інтеграції: самописне рішення vs Lenis
| Підхід | Час на налаштування | Типові баги | Підтримка мобільних |
|---|---|---|---|
| Самописний плавний скрол | 3-5 днів | N+1, розсинхрон | Потребує доопрацювань |
| Lenis | 1-3 дні | Мінімум | З коробки |
Що входить в роботу з інтеграції
- Підбір та налаштування бібліотеки (Lenis / Locomotive) під архітектуру проєкту.
- Інтеграція з GSAP ScrollTrigger та кастомними анімаціями (включно з timeline).
- Parallax-ефекти через data-атрибути або кастомні розрахунки.
- Адаптація під мобільні пристрої (iOS/Android) з урахуванням роздільної здатності екрану.
- Вирішення проблем продуктивності (ResizeObserver, will-change, оптимізація композитингу).
- Документація коду та навчання команди.
- Технічна підтримка протягом 30 днів після здачі.
Чому варто обрати Lenis для нового проєкту?
Наш досвід показує: Lenis вирішує 90% завдань плавного скролу без зайвої магії. Він легко комбінується з будь-якою анімаційною бібліотекою (GSAP, Framer Motion, Three.js). Гарантуємо, що інтеграція під ключ займе не більше 3 днів, включаючи адаптацію під мобільні та кастомні parallax-ефекти. Економія бюджету на розробці в порівнянні з самописним рішенням становить до 40%. Якщо у вас складний проєкт з вкладеними скроляними контейнерами або динамічним завантаженням — зв'яжіться з нами, оцінимо завдання безкоштовно.
Терміни та вартість
Базова установка Lenis з плавним скролом — від 1 дня. Повна інтеграція з parallax, ScrollTrigger і React — 2–3 дні. Вартість розраховується індивідуально залежно від складності та обсягу робіт. Замовте інтеграцію сьогодні — отримайте консультацію інженера з досвідом понад 5 років.







