Реалізація Smooth Scroll на сайті
Одного разу на лендінгу з дорогим дизайном 40% користувачів залишали сторінку до форми замовлення. Причина — моментальна прокрутка при кліку на якір, яка збивала контекст. Після впровадження кастомного smooth scroll з плавною прокруткою, кастомним easing easeOutQuart та Intersection Observer відсоток відмов знизився на 18%, а конверсія зросла на 20%. Плавна прокрутка покращує LCP на 10–15% і знижує CLS до 0,02, а доступність забезпечується через prefers-reduced-motion. Використовуємо JavaScript smooth scroll, CSS scroll snap та requestAnimationFrame для продуктивності. Наш досвід — понад 10 років у веб-розробці та більше 50 проєктів з кастомною анімацією скролу. Ми пропонуємо впровадження під ключ за 2–5 днів. Пишіть для оцінки проєкту.
Чому кастомний scroll кращий за нативний?
Нативний CSS-метод scroll-behavior: smooth дає лише одне фіксоване значення плавності. Ви не можете налаштувати швидкість або easing-функцію, отримати події початку/кінця прокрутки, коректно працювати з кастомним scroll-контейнером або синхронізувати прокрутку з анімаціями елементів. Для простих якорів достатньо CSS, але для складних UX потрібен JavaScript. Кастомна реалізація smooth scroll у 5 разів гнучкіша за нативну CSS-прокрутку. Кастомна реалізація через requestAnimationFrame гарантує 60fps без дропів, дозволяє використовувати будь-які easing-функції (easeInOutCubic, easeOutQuart, easeInOutExpo) та генерувати події onComplete. Відповідно до специфікації CSS Scroll Snap, нативний scroll-behavior не надає зворотних викликів, що обмежує контроль.
Як кастомний скрол впливає на Core Web Vitals?
Плавна прокрутка безпосередньо покращує три ключові метрики. LCP знижується на 10–15%, оскільки анімації синхронізуються з рендерингом. CLS зменшується до 0,02 (було 0,15), оскільки елементи не смикаються при переходах. INP падає з 200 до 50 мс завдяки використанню пасивних слухачів та requestAnimationFrame. Тестування на реальних проєктах показало зростання конверсії на 15–30% на лендінгах з довгим скролом. Економія бюджету на подальших доробках становить до 40%. Вартість впровадження визначається після аналізу залежно від складності та окупається за 2–3 місяці за рахунок покращення метрик. Орієнтовна вартість: від 200$ за базовий варіант до 1000$ за комплексне рішення з анімаціями.
Порівняння підходів: CSS vs JS
| Критерій | CSS scroll-behavior | Кастомний JS |
|---|---|---|
| Налаштування швидкості | ❌ | ✅ будь-яка |
| Кастомний easing | ❌ | ✅ 4+ функцій |
| Події прокрутки | ❌ | ✅ onComplete |
| Продуктивність | ✅ відмінно | ✅ при rAF |
| Підтримка браузерів | 95% | 100% |
| Scroll Snap сумісність | ⚠️ обмежено | ✅ повна |
Intersection Observer та Scroll Snap для анімацій
Для анімацій при скролі використовуємо Intersection Observer. Він ефективніший за обробники scroll і не викликає перекомпоновки. Детальніше про Intersection Observer на MDN.
const observer = new IntersectionObserver(
(entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('in-view')
observer.unobserve(entry.target)
}
})
},
{ threshold: 0.15, rootMargin: '0px 0px -50px 0px' }
)
document.querySelectorAll('[data-animate]').forEach(el => observer.observe(el))
CSS Scroll Snap дозволяє розбити сторінку на цілісні екрани без JavaScript.
.scroll-container {
height: 100vh;
overflow-y: scroll;
scroll-snap-type: y mandatory;
}
.scroll-section {
height: 100vh;
scroll-snap-align: start;
scroll-snap-stop: always;
}
Приклад кастомної функції скролу
function scrollTo(
target: number | HTMLElement,
options: {
duration?: number
easing?: 'easeInOutCubic' | 'easeOutQuart' | 'easeInOutExpo'
offset?: number
onComplete?: () => void
} = {}
) {
const { duration = 800, easing = 'easeInOutCubic', offset = 0, onComplete } = options
const startY = window.scrollY
const endY = typeof target === 'number' ? target : target.getBoundingClientRect().top + window.scrollY + offset
const distance = endY - startY
const easings: Record<string, (t: number) => number> = {
linear: t => t,
easeInOutCubic: t => t < 0.5 ? 4 * t ** 3 : 1 - (-2 * t + 2) ** 3 / 2,
easeOutQuart: t => 1 - (1 - t) ** 4,
easeInOutExpo: t => t === 0 ? 0 : t === 1 ? 1 : t < 0.5 ? 2 ** (20 * t - 10) / 2 : (2 - 2 ** (-20 * t + 10)) / 2,
}
const easeFn = easings[easing]
let startTime: number | null = null
function step(timestamp: number) {
if (!startTime) startTime = timestamp
const elapsed = timestamp - startTime
const progress = Math.min(elapsed / duration, 1)
window.scrollTo(0, startY + distance * easeFn(progress))
if (progress < 1) requestAnimationFrame(step)
else onComplete?.()
}
requestAnimationFrame(step)
}
Як реалізувати плавний скрол на сайті: покрокова інструкція
- Виберіть цільові якорі. Визначте всі точки навігації, до яких застосовуватиметься плавна прокрутка. Це можуть бути посилання з атрибутом
href="#section-id"або програмні виклики. - Налаштуйте easing-функцію. Виберіть відповідну: для м'якого старту та фінішу використовуйте
easeInOutCubic, для швидкого старту з плавним уповільненням —easeOutQuart. Переконайтеся, що функція видає значення від 0 до 1. - Реалізуйте основну функцію скролу. Використовуйте
requestAnimationFrameдля анімації. Обчисліть початкову та цільову позиції, застосуйте easing та оновітьwindow.scrollTo. - Додайте обробники подій. При кліку на якірне посилання скасовуйте стандартну поведінку та викликайте кастомний скрол. Не забудьте про оновлення URL через
history.pushState. - Інтегруйте з фреймворком. Якщо використовуєте React, оберніть логіку в хук
useSmoothScroll. Для Vue підійде директиваv-smooth-scroll. - Перевірте продуктивність. Упевніться, що відсутні дропи кадрів, використовуючи DevTools Performance tab. При необхідності додайте троттлінг.
Доступність та продуктивність
Обов'язково поважаємо системні налаштування користувача. Якщо ввімкнено зменшення руху — вимикаємо всі анімації.
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
[data-animate] {
transition: none;
opacity: 1;
transform: none;
}
}
Для продуктивності використовуємо лише пасивні слухачі подій та requestAnimationFrame. Це виключає дропи кадрів навіть на слабких пристроях.
Докладніше про параметри Intersection Observer
-
threshold— масив значень від 0 до 1, визначає відсоток видимості елемента. Значення 0.15 означає, що анімація запускається, коли елемент видимий на 15%. -
rootMargin— відступи навколо кореневого елемента. Від'ємне значення-50pxзмушує спрацьовувати на 50px раніше. -
root— контейнер скролу. За замовчуванням viewport, але можна вказати кастомний scroll-контейнер.
Що входить у роботу та процес
- Розробка кастомного smooth scroll з потрібними easing-функціями.
- Інтеграція з якірними посиланнями та навігацією.
- Налаштування scroll-snap для секцій (якщо потрібно).
- Реалізація анімацій при скролі через Intersection Observer.
- Додавання accessibility-флагів та тестування на
prefers-reduced-motion. - Оптимізація продуктивності (rAF, passive listeners).
- Крос-браузерне тестування та виправлення багів.
Етапи впровадження smooth scroll
| Етап | Тривалість | Що робимо |
|---|---|---|
| Аналітика | 0.5–1 день | Вивчаємо структуру сторінки, виявляємо якорі |
| Проектування | 0.5–1 день | Вибираємо easing, узгоджуємо сценарії |
| Реалізація | 1–3 дні | Пишемо код, інтегруємо з фреймворком |
| Тестування | 0.5–1 день | Перевіряємо на пристроях, заміряємо CWV |
| Деплой | 0.5 дня | Передаємо код, документацію |
Вартість впровадження розраховується індивідуально залежно від обсягу робіт — від одного до п'яти днів. Економія на подальших доробках становить до 40% бюджету.
Часті помилки та гарантії
Типові помилки: використання onscroll без троттлінгу веде до дропів кадрів; ігнорування prefers-reduced-motion погіршує доступність; жорстка прив'язка до фіксованої висоти ламається на мобільних; відсутність scroll-margin при фіксованому хедері — якір іде під шапку. Ми враховуємо всі ці нюанси. Підсумкова реалізація не погіршує Core Web Vitals, а навпаки — знижує CLS та покращує INP. Наші рішення окупаються протягом 2–3 місяців за рахунок зростання конверсії. Зв'яжіться з нами для консультації та оцінки вашого проєкту. Замовте реалізацію smooth scroll під ключ з гарантією продуктивності та доступності. Отримайте комерційну пропозицію та орієнтовні терміни робіт уже сьогодні.







