Для начала необходимо подключить библиотеку Smooth Scroll. В чистом JavaScript это можно сделать двумя способами: через CDN или установкой через npm/yarn для сборщиков проектов.
Через CDN:
<script src="https://cdn.jsdelivr.net/npm/smooth-scroll@16/dist/smooth-scroll.polyfills.min.js"></script>
Через npm:
npm install smooth-scroll
После установки через npm подключение в проекте будет выглядеть так:
import SmoothScroll from 'smooth-scroll';
После подключения библиотеки её необходимо инициализировать. Основной
способ инициализации – создание нового объекта SmoothScroll
и передача селектора ссылок, по которым будет выполняться плавная
прокрутка.
const scroll = new SmoothScroll('a[href*="#"]', {
speed: 500,
speedAsDuration: true,
offset: 0,
easing: 'easeInOutCubic',
});
Пояснение параметров:
speed – время прокрутки в миллисекундах.speedAsDuration – если true, значение
speed используется как фиксированная длительность, иначе
скорость зависит от расстояния.offset – смещение от целевого элемента (например, для
фиксированных шапок).easing – функция плавности прокрутки. Поддерживаются:
linear, easeInQuad, easeOutQuad,
easeInOutQuad, easeInCubic,
easeOutCubic, easeInOutCubic,
easeInQuart, easeOutQuart,
easeInOutQuart, easeInQuint,
easeOutQuint, easeInOutQuint.Библиотека позволяет прокручивать страницу к элементу не только через клики по ссылкам, но и программно:
scroll.animateScroll(document.querySelector('#section2'));
При этом можно передать дополнительные параметры, такие как смещение и скорость:
scroll.animateScroll(document.querySelector('#section3'), null, {
speed: 800,
offset: 50,
});
Smooth Scroll автоматически перехватывает клики по ссылкам с хешами:
<a href="#section1">Перейти к секции 1</a>
Библиотека вычисляет координаты элемента и плавно прокручивает страницу, учитывая заданные параметры.
Smooth Scroll поддерживает множество дополнительных опций:
clip – если true, прокрутка
останавливается точно у верхнего края элемента.updateURL – если true, хеш в URL
обновляется при прокрутке.popstate – если true, прокрутка учитывает
действия браузера «Назад/Вперед».header – селектор фиксированного хедера для
автоматического смещения.offset может быть функцией, что позволяет динамически
вычислять смещение в зависимости от состояния страницы.Пример использования динамического смещения:
const scroll = new SmoothScroll('a[href*="#"]', {
offset: function (anchor, toggle) {
return document.querySelector('header').offsetHeight;
},
});
animateScroll(target, toggle, options) – инициирует
прокрутку к указанному элементу.destroy() – отключает Smooth Scroll, снимая обработчики
событий.cancel() – прекращает текущую анимацию прокрутки.init() – повторная инициализация после динамического
добавления ссылок.Smooth Scroll позволяет работать с событиями, которые срабатывают на разных этапах прокрутки.
document.addEventListener('scrollStart', function(event) {
console.log('Прокрутка началась', event);
});
document.addEventListener('scrollStop', function(event) {
console.log('Прокрутка завершена', event);
});
События:
scrollStart – при начале прокрутки.scrollStop – при завершении прокрутки.scrollCancel – если анимация была отменена
пользователем.header или динамическое offset.init() для повторной регистрации
ссылок.easeInOutCubic или
easeInOutQuart, они создают естественное ощущение
прокрутки.offset.updateURL: true, чтобы хеши
корректно отображались в адресной строке.animateScroll программно для переходов между секциями.Smooth Scroll в Vanilla JavaScript обеспечивает легкую и настраиваемую анимацию прокрутки без необходимости подключать большие фреймворки, позволяя создавать современный UX с минимальными усилиями.