Smooth Scroll — это техника плавного скроллинга страницы, которая заменяет резкое перемещение браузера к якорным ссылкам или определённым элементам DOM на постепенное анимированное перемещение. Она улучшает пользовательский опыт, делая навигацию более комфортной, особенно на длинных страницах с большим количеством контента.
В основе работы Smooth Scroll лежит изменение позиции окна
просмотра с течением времени, а не мгновенное перескакивание.
Это достигается через программное управление свойством
scrollTop или методами window.scrollTo с
использованием анимации через
requestAnimationFrame.
Существует несколько подходов к реализации плавного скролла:
scrollIntoViewconst element = document.querySelector('#target');
element.scrollIntoView({ beh * avior: 'smooth', block: 'start' });
Пояснения:
beh * avior: 'smooth' — активирует плавный скролл.block: 'start' — позиционирует элемент в начале окна
просмотра.Недостатком является ограниченная гибкость: невозможно управлять скоростью или кривой анимации.
window.scrollTo с плавной прокруткойwindow.scrollTo({
top: 500,
left: 0,
beh * avior: 'smooth'
});
top — конечная вертикальная координата.left — конечная горизонтальная координата.beh * avior: 'smooth' задаёт плавность.Эта конструкция полезна для скролла к конкретной позиции страницы, а не к элементу напрямую.
requestAnimationFrameДля более тонкой настройки анимации можно написать кастомный скролл:
function smoothScroll(target, duration = 600) {
const start = window.scrollY;
const end = target.getBoundingClientRect().top + start;
const distance = end - start;
let startTime = null;
function animation(currentTime) {
if (!startTime) startTime = currentTime;
const timeElapsed = currentTime - startTime;
const progress = Math.min(timeElapsed / duration, 1);
const ease = progress < 0.5
? 2 * progress * progress
: -1 + (4 - 2 * progress) * progress;
window.scrollTo(0, start + distance * ease);
if (timeElapsed < duration) requestAnimationFrame(animation);
}
requestAnimationFrame(animation);
}
const targetElement = document.querySelector('#target');
smoothScroll(targetElement, 800);
Пояснения к коду:
requestAnimationFrame гарантирует плавность на любых
частотах обновления экрана.Плавность скролла напрямую зависит от кривой анимации. Наиболее распространённые варианты:
Пример функции easeInOutQuad:
function easeInOutQuad(t) {
return t < 0.5 ? 2*t*t : -1 + (4 - 2*t)*t;
}
Использование таких функций позволяет сделать скролл максимально естественным для глаз.
Часто Smooth Scroll применяется для навигации по странице через
ссылки с href="#section":
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function(e) {
e.preventDefault();
const target = document.querySelector(this.getAttribute('href'));
smoothScroll(target, 700);
});
});
getBoundingClientRect
внутри анимации; лучше кэшировать координаты.passive: true при добавлении обработчиков событий скролла,
если это не мешает кастомной анимации.requestAnimationFrame вместо
setInterval или setTimeout для синхронизации с
частотой обновления экрана.beh * avior: 'smooth' поддерживается
большинством современных браузеров.requestAnimationFrame.requestAnimationFrame.Эта техника является основой современной веб-навигации и позволяет создавать страницы с плавным, отзывчивым и естественным скроллингом, значительно улучшая пользовательский опыт и визуальное восприятие контента.