Smooth Scroll — это техника плавной прокрутки страницы к определённому элементу или позиции, которая реализуется с помощью JavaScript и современных возможностей DOM. Несмотря на кажущуюся простоту, её поведение может существенно различаться в зависимости от браузера, версии движка и даже операционной системы.
scroll-behaviorСовременные браузеры предоставляют встроенную поддержку плавной
прокрутки через CSS-свойство scroll-behavior:
html {
scroll-behavior: smooth;
}
Или через Jav * aScript:
element.scrollIntoView({ beh * avior: 'smooth' });
window.scrollTo({ top: 1000, beh * avior: 'smooth' });
Ключевые моменты различий:
beh * avior: 'smooth'. В таких случаях необходимо
использовать полифиллы или ручную реализацию через
requestAnimationFrame.scrollIntoViewМетод scrollIntoView имеет опцию block:
element.scrollIntoView({ beh * avior: 'smooth', block: 'center' });
block могут быть: start,
center, end, nearest.center,
сдвигая элемент к верхней границе.window и elementJavaScript позволяет прокручивать как весь window, так и
отдельные элементы с overflow:
window.scrollTo({ top: 500, beh * avior: 'smooth' });
scrollableElement.scrollTo({ top: 200, beh * avior: 'smooth' });
overflow: scroll не
всегда анимируется, если задан
-webkit-overflow-scrolling: touch.requestAnimationFrameПолифиллы и кастомные реализации Smooth Scroll часто используют
requestAnimationFrame для анимации.
requestAnimationFrame при скролле страницы для экономии
энергии, что приводит к заметным «рывкам» анимации.Пример кастомного Smooth Scroll:
function smoothScroll(target, duration) {
const start = window.scrollY;
const end = target.getBoundingClientRect().top + start;
const change = end - start;
let currentTime = 0;
const increment = 20;
function animate() {
currentTime += increment;
const val = easeInOutQuad(currentTime, start, change, duration);
window.scrollTo(0, val);
if (currentTime < duration) {
requestAnimationFrame(animate);
}
}
animate();
}
function easeInOutQuad(t, b, c, d) {
t /= d / 2;
if (t < 1) return (c / 2) * t * t + b;
t--;
return (-c / 2) * (t * (t - 2) - 1) + b;
}
window есть, но для элементов с
overflow: scroll требуется
-webkit-overflow-scrolling: touch.scroll-behavior для современных
браузеров.requestAnimationFrame.Smooth Scroll в JavaScript выглядит как простая задача, но тонкости реализации проявляются при кросс-браузерной проверке, особенностях мобильных платформ и различиях интерпретации стандартов CSS/DOM. Понимание этих различий критично для создания действительно гладкой прокрутки на всех устройствах.