Smooth Scroll реализует анимацию прокрутки страницы с плавным
переходом между элементами. В современных браузерах стандартная функция
scrollIntoView({ beh * avior: "smooth" }) обеспечивает
нативное плавное перемещение, однако далеко не все браузеры поддерживают
этот API. В частности, старые версии Internet Explorer, Safari до 15
версии и некоторые мобильные браузеры не предоставляют нативного
плавного скролла.
Для обеспечения кроссбраузерной совместимости используются полифиллы — JavaScript-скрипты, которые реализуют недостающий функционал, и фоллбэки, которые задают безопасное поведение в случае отсутствия поддержки.
Нативная прокрутка реализуется через:
document.querySelector('#section2').scrollIntoView({
beh * avior: 'smooth',
block: 'start'
});
beh * avior: "smooth" — указывает на плавную
анимацию.block: "start" — определяет положение элемента
относительно видимой области.Если браузер не поддерживает beh * avior: "smooth", вызов
будет работать как обычная мгновенная прокрутка. Чтобы избежать резкого
скачка, требуется фоллбэк.
Наиболее распространённый полифилл для Smooth Scroll — библиотека smoothscroll-polyfill.
Он позволяет эмулировать поведение нативного API в старых браузерах.
import smoothscroll from 'smoothscroll-polyfill';
// Инициализация полифилла
smoothscroll.polyfill();
После вызова polyfill() все вызовы
scrollIntoView({ beh * avior: "smooth" }),
window.scroll() и window.scrollTo() будут
корректно работать в браузерах без нативной поддержки.
Если библиотека не используется, можно реализовать плавную прокрутку
через JavaScript с использованием
requestAnimationFrame:
function smoothScroll(target, duration = 500) {
const start = window.pageYOffset;
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 section = document.querySelector('#section2');
smoothScroll(section, 800);
Особенности собственного фоллбэка:
duration.Чтобы использовать полифилл или фоллбэк только при необходимости, проверяется наличие поддержки через:
const supportsSmoothScroll = 'scrollBehavior' in document.documentElement.style;
if (!supportsSmoothScroll) {
// подключение полифилла или вызов кастомной функции
}
Этот подход предотвращает излишние нагрузки на современные браузеры.
position: fixed.При работе с крупными библиотеками, такими как Smooth Scroll Library от cferdinandi, полифиллы часто уже встроены или подключаются через модульную систему. Основная задача разработчика — убедиться, что полифилл загружается до инициализации библиотеки.
scrollBehavior перед инициализацией
кастомного скролла.Эта комбинация нативного API, полифиллов и фоллбэков обеспечивает стабильное и кроссбраузерное поведение плавного скролла, сохраняя производительность и UX.