Smooth Scroll — это библиотека для плавного скроллинга, которая позволяет заменять стандартное поведение браузера на более эстетичное и контролируемое. Для её использования необходимо подключить скрипт через CDN или установить пакет через npm:
<script src="https://cdn.jsdelivr.net/npm/smooth-scroll@16/dist/smooth-scroll.polyfills.min.js"></script>
Инициализация происходит следующим образом:
const scroll = new SmoothScroll('a[href*="#"]', {
speed: 500,
speedAsDuration: true,
easing: 'easeInOutCubic'
});
true, скорость
задаётся фиксированной продолжительностью, а не зависит от
расстояния.Smooth Scroll поддерживает гибкие параметры, влияющие на поведение анимации:
offset — смещение в пикселях от верхней границы окна при скролле к элементу:
const scroll = new SmoothScroll('a[href*="#"]', { offset: 100 });
Полезно для учёта фиксированных шапок.
clip — обрезка скролла, предотвращающая уход за пределы документа.
updateURL — при true обновляет
адрес в браузере без перезагрузки страницы.
popstate — управление реакцией на кнопки «назад» и «вперед» браузера, синхронизируя скролл с историей.
customEasing — возможность задать собственную функцию сглаживания для создания уникальных эффектов:
const scroll = new SmoothScroll('a[href*="#"]', {
easing: function (t, b, c, d) {
return c*(t/=d)*t + b; // квадратичная функция easeIn
}
});Плавный скролл может стать причиной падения FPS на слабых устройствах, если анимации запускаются слишком часто. Основные подходы к оптимизации:
Throttle и debounce при обработке событий скролла: Снижение частоты вызовов функций предотвращает перегрузку рендеринга.
Использование requestAnimationFrame: Smooth Scroll автоматически применяет этот метод, обеспечивая синхронизацию анимаций с обновлением кадров браузера.
Минимизация DOM-операций: изменение стилей и классов внутри анимации должно быть сведено к минимуму, иначе скролл будет «дергаться».
Оптимизация easing-функций: сложные математические вычисления в функциях сглаживания увеличивают нагрузку на CPU. Предпочтительно использовать заранее вычисленные или простые кривые.
Программное управление скроллом позволяет запускать анимацию к элементу без кликов по ссылкам:
scroll.animateScroll(document.querySelector('#section2'), null, {
speed: 700,
offset: 50
});
События и колбеки дают возможность запускать дополнительные действия в процессе или после скролла:
const scroll = new SmoothScroll('a[href*="#"]', {
after: function (anchor, toggle) {
console.log(`Скролл завершён к ${anchor.id}`);
},
before: function (anchor, toggle) {
console.log(`Начало скролла к ${anchor.id}`);
}
});
before вызывается перед началом анимации.after вызывается после завершения скролла.Smooth Scroll хорошо сочетается с библиотеками анимации элементов при скролле, например, GSAP или Anime.js. Для повышения производительности рекомендуется:
before и after.Пример интеграции с GSAP:
scroll.animateScroll(document.querySelector('#section3'), null, {
speed: 600,
after: function () {
gsap.to('#section3 .box', { opacity: 1, y: 0, duration: 1 });
}
});
На мобильных устройствах плавный скролл может быть менее отзывчивым из-за ограниченных ресурсов:
Иногда фиксированная высота offset не подходит для всех экранов. Решается динамическим вычислением:
const headerHeight = document.querySelector('header').offsetHeight;
const scroll = new SmoothScroll('a[href*="#"]', {
offset: function (anchor, toggle) {
return headerHeight;
}
});
Smooth Scroll позволяет работать с URL и хэшами:
Для SEO и сохранения истории скролл-контекста это критически важно, особенно на одностраничных приложениях.
Эти практики позволяют Smooth Scroll оставаться плавным, отзывчивым и не нагружать CPU, даже при сложных интерфейсах и больших страницах.