Прокрутка

Оригинальное название: scroll

Коротко

Перемещение видимой области по содержимому, которое не помещается в окно или блок целиком: колесом мыши, свайпом, клавишами или перетаскиванием полосы прокрутки.

Что такое «Прокрутка»

Прокручиваться может вся страница или отдельный блок с overflow: auto — таблица характеристик, окно чата поддержки, лента отзывов. Современные браузеры обычно обрабатывают прокрутку отдельно от основного потока, поэтому она остаётся плавной, даже когда страница занята скриптами, — если сайт ей не мешает.

Чем управлять из CSS

html {
  scroll-behavior: smooth;        /* плавный переход по якорям */
}
h2[id] {
  scroll-margin-top: 80px;        /* не прятать заголовок под шапкой */
}
.gallery {
  overflow-x: auto;
  scroll-snap-type: x mandatory;  /* карусель с остановкой на слайде */
}
.gallery > img { scroll-snap-align: start; }

Свойство scroll-margin-top решает частую проблему сайтов с закреплённой шапкой: при переходе по якорю заголовок раздела уезжал под неё. Ещё одно полезное свойство — overscroll-behavior: contain: оно не даёт прокрутке «перетечь» из модального окна или бокового меню на страницу под ним.

Прокрутка и JavaScript

Событие scroll срабатывает очень часто, и тяжёлый код в обработчике заставляет страницу дёргаться. Обработчики touchstart и wheel лучше объявлять с параметром { passive: true }: так браузер знает, что прокрутку не отменят, и не ждёт скрипт. Для типовых задач — подгрузить следующую страницу каталога, запустить анимацию при появлении блока — вместо слушания прокрутки используют IntersectionObserver: браузер сам сообщит, когда элемент вошёл в область просмотра.

Когда вмешательство вредит

Перехват прокрутки (scroll hijacking) — когда сайт сам решает, на сколько сдвинуть экран по одному движению колеса, или превращает прокрутку в перелистывание слайдов, — раздражает и ломает привычные жесты. На тачпадах и с клавиатуры такие страницы часто ведут себя непредсказуемо. Плавную прокрутку тоже стоит отключать для тех, кто попросил систему уменьшить движение: для этого есть медиазапрос prefers-reduced-motion: reduce.

Обновлено:

Все термины раздела «Frontend»

Что будем искать? Например,Продвижение