Smooth Scroll в JavaScript предоставляет возможность не только плавно перемещаться по странице, но и управлять историей браузера при навигации. Это особенно важно для SPA (Single Page Application), когда ссылки на секции страницы должны корректно отражаться в адресной строке и поддерживать навигацию кнопками «Назад» и «Вперед».
Smooth Scroll использует стандартный API History браузера:
history.pushState и history.replaceState. С их
помощью можно:
Пример инициализации Smooth Scroll с включением истории:
const scroll = new SmoothScroll('a[href*="#"]', {
speed: 800,
offset: 50,
updateURL: true,
popstate: true
});
Пояснения к опциям:
updateURL: true — при прокрутке к элементу адресная
строка обновляется, добавляя или изменяя хэш
(#section-id).popstate: true — позволяет Smooth Scroll реагировать на
события popstate, вызываемые кнопками браузера «Назад» и
«Вперед».pushState создаёт новую запись в
истории. Применяется, когда необходимо, чтобы каждый переход к секции
был сохранён в истории браузера.replaceState заменяет текущее
состояние истории, не создавая новую запись. Используется для изменения
хэша без добавления лишней записи.Smooth Scroll автоматически использует pushState при
updateURL: true и перемещении к элементу, если новый хэш
отличается от текущего. Если же требуется более гибкое управление, можно
использовать собственные обработчики событий:
document.addEventListener('scrollStart', function(event) {
const target = event.detail.anchor;
history.pushState({section: target.id}, '', `#${target.id}`);
});
Когда пользователь кликает «Назад» или «Вперед», браузер вызывает
событие popstate. Smooth Scroll умеет корректно
прокручивать страницу к соответствующему элементу:
window.addEventListener('popstate', function(event) {
if (event.state && event.state.section) {
const target = document.getElementById(event.state.section);
if (target) {
scroll.animateScroll(target);
}
}
});
Ключевые моменты:
event.state содержит объект состояния, переданный в
pushState или replaceState.Smooth Scroll предоставляет возможность контролировать, что делать при загрузке страницы с уже существующим хэшем:
const scroll = new SmoothScroll('a[href*="#"]', {
speed: 600,
offset: 100,
updateURL: true,
popstate: true,
clip: true
});
clip: true предотвращает прокрутку за пределы
документа.В SPA и страницах с динамическим контентом важно обновлять историю
только после того, как элемент, к которому нужно прокручивать, появился
в DOM. Для этого используется комбинация методов
animateScroll и pushState после полной
загрузки контента:
function scrollToDynamicSection(id) {
const target = document.getElementById(id);
if (target) {
scroll.animateScroll(target);
history.pushState({section: id}, '', `#${id}`);
} else {
setTimeout(() => scrollToDynamicSection(id), 50);
}
}
updateURL при частых внутренних прокрутках,
чтобы не засорять историю лишними записями.replaceState для временных изменений,
например, при анимациях или автоматической прокрутке на первый
экран.popstate с
маршрутизатором приложения, чтобы сохранить совместимость с
навигацией.Эта интеграция Smooth Scroll с History API делает поведение страницы более предсказуемым и естественным, сохраняя пользовательский контекст при прокрутке и навигации.