Ключевое преимущество библиотеки Smooth Scroll заключается в гибком управлении поведением прокрутки. Базовые параметры позволяют изменять восприятие скорости и плавности движения страницы.
Основные параметры:
speed как фиксированную длительность, а не как зависимость
от расстоянияПример настройки:
const scroll = new SmoothScroll('a[href*="#"]', {
speed: 800,
speedAsDuration: true
});
В данном случае прокрутка всегда занимает ровно 800 мс независимо от расстояния до целевого элемента.
Плавность движения определяется функцией easing — математической кривой, задающей ускорение и замедление анимации.
Поддерживаются встроенные варианты:
easeInQuadeaseOutQuadeaseInOutCubiceaseInOutQuarteaseInOutQuintПример:
const scroll = new SmoothScroll('a[href*="#"]', {
easing: 'easeInOutCubic'
});
Допускается передача собственной функции:
const scroll = new SmoothScroll('a[href*="#"]', {
easing: function (time) {
return time < 0.5
? 2 * time * time
: 1 - Math.pow(-2 * time + 2, 2) / 2;
}
});
Аргумент time принимает значение от 0 до 1 и описывает
прогресс анимации.
Частая задача — учитывать фиксированные элементы интерфейса
(например, шапку сайта). Для этого используется параметр
offset.
const scroll = new SmoothScroll('a[href*="#"]', {
offset: 80
});
Возможна функция:
const scroll = new SmoothScroll('a[href*="#"]', {
offset: function (anchor, toggle) {
return document.querySelector('.header').offsetHeight;
}
});
Позволяет вычислять смещение в зависимости от состояния DOM.
По умолчанию прокрутка применяется ко всему документу. При необходимости можно ограничить область:
const scroll = new SmoothScroll('a[href*="#"]', {
header: '.fixed-header'
});
Параметр header автоматически учитывает высоту
указанного элемента.
Smooth Scroll перехватывает клики по якорным ссылкам. Поведение можно детализировать:
Пример:
const scroll = new SmoothScroll('a[href*="#"]', {
ignore: '[data-scroll-ignore]',
updateURL: false
});
Библиотека генерирует события, позволяющие вмешиваться в процесс прокрутки.
scrollStartscrollStopscrollCancelПример подписки:
document.addEventListener('scrollStart', function (event) {
console.log('Начало прокрутки', event.detail);
}, false);
{
anchor: элемент назначения,
toggle: элемент, вызвавший прокрутку
}
Помимо кликов, прокрутку можно запускать вручную.
const scroll = new SmoothScroll();
scroll.animateScroll(
document.querySelector('#section'),
null,
{ speed: 600 }
);
Параметры:
null)По умолчанию прокрутка может прерываться пользовательскими действиями:
Настройка:
const scroll = new SmoothScroll('a[href*="#"]', {
cancelOnUserAction: true
});
Отключение:
cancelOnUserAction: false
Можно задать условия, при которых библиотека активна:
const scroll = new SmoothScroll('a[href*="#"]', {
mediaQuery: '(min-width: 768px)'
});
Прокрутка будет работать только при выполнении медиазапроса.
После прокрутки браузер может устанавливать фокус на целевой элемент. Управление этим поведением:
const scroll = new SmoothScroll('a[href*="#"]', {
emitEvents: true
});
Дополнительно можно вручную управлять фокусом:
document.addEventListener('scrollStop', function (event) {
event.detail.anchor.focus();
});
При изменении DOM (например, AJAX-загрузка) необходимо обновить привязки:
scroll.destroy();
scroll.init();
Или полностью пересоздать экземпляр.
document.querySelectorAll('a[href*="#"]').forEach(link => {
link.addEventListener('click', function (e) {
e.preventDefault();
scroll.animateScroll(
document.querySelector(this.hash),
this,
{
speed: this.dataset.speed || 500
}
);
});
});
Комбинация с обработчиком событий:
document.addEventListener('scroll', function () {
const scrolled = window.pageYOffset;
document.querySelector('.parallax').style.transform =
`translateY(${scrolled * 0.5}px)`;
});
Smooth Scroll часто используется вместе с:
Пример синхронизации с Intersection Observer:
const observer = new IntersectionObserver(entries => {
entries.forEach(entry => {
if (entry.isIntersecting) {
console.log('Элемент в зоне видимости');
}
});
});
document.querySelectorAll('section').forEach(section => {
observer.observe(section);
});
Факторы, влияющие на производительность:
Рекомендации:
Библиотека допускает изменение внутренней логики:
Пример изменения функции расчёта позиции требует редактирования исходного файла:
var getEndLocation = function (anchor, headerHeight, offset) {
return anchor.offsetTop - headerHeight - offset;
};
Такая модификация позволяет полностью контролировать конечную точку прокрутки.
При переходах назад/вперёд можно синхронизировать прокрутку:
const scroll = new SmoothScroll('a[href*="#"]', {
popstate: true
});
Браузер будет восстанавливать позицию с учётом плавной анимации.
Иногда требуется активировать прокрутку только при определённых условиях:
if (window.innerWidth > 1024) {
new SmoothScroll('a[href*="#"]');
}
Или более гибко:
const isTouch = 'ontouchstart' in window;
const scroll = new SmoothScroll('a[href*="#"]', {
speed: isTouch ? 300 : 800
});
В сложных интерфейсах можно использовать несколько независимых экземпляров:
const mainScroll = new SmoothScroll('.main-nav a[href*="#"]');
const modalScroll = new SmoothScroll('.modal a[href*="#"]');
Это позволяет разделить поведение прокрутки в разных частях интерфейса.
Для анализа поведения удобно включать события:
document.addEventListener('scrollStart', console.log);
document.addEventListener('scrollStop', console.log);
Также полезно:
Можно задать базовую конфигурацию и переопределять её локально:
const defaultOptions = {
speed: 500,
easing: 'easeInOutCubic'
};
const scroll = new SmoothScroll('a[href*="#"]', defaultOptions);
Локальное переопределение:
scroll.animateScroll(target, trigger, {
speed: 1000
});
Иногда требуется плавная прокрутка при переходе по URL с якорем:
window.addEventListener('load', function () {
if (window.location.hash) {
scroll.animateScroll(document.querySelector(window.location.hash));
}
});
Это устраняет резкий скачок страницы при загрузке.
Максимальная гибкость достигается при совместном использовании настроек:
const scroll = new SmoothScroll('a[href*="#"]', {
speed: 700,
speedAsDuration: true,
offset: 100,
easing: 'easeInOutQuart',
updateURL: false,
popstate: true
});
Такой подход позволяет точно контролировать поведение прокрутки под конкретные задачи интерфейса.