Плавная прокрутка (Smooth Scroll) используется для создания
аккуратных переходов между различными секциями страницы. В JavaScript
это реализуется через работу с DOM, событиями и методами прокрутки,
такими как scrollTo и scrollIntoView.
document.querySelector('#target').scrollIntoView({
beh * avior: 'smooth',
block: 'start'
});
В этом примере beh * avior: 'smooth' обеспечивает анимацию
прокрутки. Параметр block отвечает за позиционирование
элемента относительно видимой области (start,
center, end, nearest).
Метод window.scrollTo позволяет задавать координаты и
управлять анимацией:
window.scrollTo({
top: 500,
left: 0,
beh * avior: 'smooth'
});
top — вертикальная позиция прокрутки в пикселях.left — горизонтальная позиция.behavior — определяет тип прокрутки (auto
или smooth).Этот подход полезен, когда требуется прокрутка к фиксированной позиции страницы, а не к конкретному элементу.
Для переходов между view часто используют ссылки с атрибутом
href на идентификаторы секций:
<a href="#section2" class="scroll-link">Перейти к секции 2</a>
<div id="section2">Секция 2</div>
Чтобы включить плавную прокрутку без перезагрузки страницы, добавляют
обработчик события click:
document.querySelectorAll('.scroll-link').forEach(link => {
link.addEventListener('click', e => {
e.preventDefault();
const target = document.querySelector(link.getAttribute('href'));
target.scrollIntoView({ beh * avior: 'smooth', block: 'start' });
});
});
Ключевой момент — предотвращение стандартного поведения ссылок
e.preventDefault(), чтобы страница не прыгала к элементу
мгновенно.
Иногда требуется динамически управлять прокруткой, основываясь на логике приложения. Например, при переключении вкладок или view:
function scrollToView(id) {
const view = document.getElementById(id);
if (view) {
view.scrollIntoView({ beh * avior: 'smooth', block: 'start' });
}
}
Использование таких функций упрощает интеграцию с фреймворками, где навигация между компонентами должна быть плавной.
Для более сложных эффектов можно отказаться от стандартного
scrollIntoView и реализовать анимацию вручную:
function smoothScroll(targetY, duration = 600) {
const startY = window.scrollY;
const distance = targetY - startY;
let startTime = null;
function step(timestamp) {
if (!startTime) startTime = timestamp;
const progress = Math.min((timestamp - startTime) / duration, 1);
window.scrollTo(0, startY + distance * easeInOutCubic(progress));
if (progress < 1) requestAnimationFrame(step);
}
requestAnimationFrame(step);
}
function easeInOutCubic(t) {
return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;
}
Этот метод даёт полный контроль над кривой анимации, длительностью и точкой назначения.
При использовании sticky-меню или фиксированных header важно учитывать смещение:
function scrollToWithOffset(elementId, offset = 80) {
const element = document.getElementById(elementId);
const elementPosition = element.getBoundingClientRect().top + window.scrollY;
window.scrollTo({ top: elementPosition - offset, beh * avior: 'smooth' });
}
Без компенсации фиксированного header элемент может скрываться за шапкой.
Для отслеживания завершения прокрутки можно использовать
scroll и таймеры:
function onScrollEnd(callback, delay = 100) {
let timeout;
window.addEventListener('scroll', () => {
clearTimeout(timeout);
timeout = setTimeout(callback, delay);
});
}
Такой подход полезен для подгрузки данных, анимаций при достижении определённой секции или синхронизации интерфейса.
В одностраничных приложениях (SPA) Smooth Scroll помогает переключать view без перезагрузки. Для этого:
requestAnimationFrame.requestAnimationFrame вместо таймеров для
плавной анимации.scroll.Такой подход обеспечивает плавность анимации даже на страницах с большим количеством элементов и сложным интерфейсом.
Плавная прокрутка между view становится инструментом не только для эстетики, но и для улучшения UX, облегчая восприятие переходов, синхронизацию элементов и контроль над поведением страницы.