
Блокировка прокрутки используется, когда необходимо зафиксировать положение страницы – например, при открытии модального окна, всплывающего меню или боковой панели. Без этой меры пользователь может случайно прокрутить контент под оверлеем, что ухудшает восприятие интерфейса.
Самый простой способ запретить прокрутку – применить к тегу <body> свойство overflow: hidden;. Этот приём мгновенно отключает вертикальную и горизонтальную прокрутку. Однако такой метод может вызывать скачок контента, если страница имеет скроллбар: ширина области просмотра изменяется, и макет «прыгает». Для устранения этого эффекта добавляют компенсационный отступ, равный ширине полосы прокрутки.
Если нужно блокировать прокрутку только внутри конкретного контейнера, используется комбинация свойств overflow: hidden; и position: fixed;. Это позволяет заморозить нужную область, сохранив возможность прокрутки других частей страницы. Такой подход применяют в сложных интерфейсах с вложенными элементами или динамическими панелями.
Для адаптивных проектов полезно учитывать особенности мобильных браузеров: на iOS, например, свойство overflow: hidden; не всегда блокирует прокрутку ожидаемо. В таких случаях применяют дополнительные приёмы – например, фиксацию позиции при помощи position: fixed с сохранением координат прокрутки перед блокировкой.
Отключение прокрутки всего документа с помощью overflow: hidden
Чтобы заблокировать прокрутку всей страницы, достаточно задать свойство overflow: hidden для тега html или body. Этот приём предотвращает перемещение содержимого колёсиком мыши, свайпами и клавишами прокрутки.
html, body {
overflow: hidden;
}
Такой способ применяют, когда нужно зафиксировать фон при открытии модального окна или во время анимаций. Важно задать свойство сразу обоим тегам, чтобы избежать ситуаций, когда прокрутка сохраняется на одном из них.
- Перед включением
overflow: hiddenстоит сохранить текущее значениеscrollTop, чтобы после разблокировки вернуть пользователя на то же место. - При необходимости можно использовать JavaScript для временной блокировки:
document.body.style.overflow = 'hidden';и последующего восстановления:
document.body.style.overflow = ''; - Если на странице есть фиксированные элементы, проверьте, не меняется ли их позиционирование при блокировке – иногда возникает смещение из-за исчезновения полосы прокрутки.
Для проектов с адаптивной вёрсткой стоит учитывать, что на мобильных устройствах overflow: hidden может не всегда блокировать свайпы, особенно в iOS. В таких случаях используют дополнительное свойство position: fixed для фиксации контейнера и предотвращения прокрутки содержимого.
Блокировка прокрутки только по вертикали или горизонтали

Отключить прокрутку в одном направлении проще всего с помощью свойств overflow-x и overflow-y. Для блокировки вертикали: overflow-y: hidden;, для блокировки горизонтали: overflow-x: hidden;. Применяйте к ближайшему прокручиваемому контейнеру, а не всегда к body, чтобы избежать побочных эффектов на другие области страницы.
Если блокируете прокрутку всей страницы, задайте 100% высоту/ширину: html, body { height: 100%; } и применяйте свойство к body или html. Иначе контейнеры с относительным размером могут остаться прокручиваемыми.
На мобильных устройствах используйте touch-action для управления жестами: чтобы разрешить только горизонтальную прокрутку – touch-action: pan-x;, только вертикальную – touch-action: pan-y;. Для подавления эффекта «прыжка» или «отскока» добавьте overscroll-behavior: contain;.
Скрытие вертикального скроллбара меняет ширину контента – возможна сдвижка макета. Компенсируйте её padding/margin справа: для десктопа обычно достаточно 15–17px; для точного значения измерьте ширину скроллбара через JS и примените CSS-переменную: --sb: 16px; body { padding-right: var(--sb); overflow-y: hidden; }.
Если нужно временно блокировать один тип прокрутки (модальные окна, панели), добавляйте/убирайте класс на контейнере вместо постоянного правки body. Это упрощает возврат состояния и уменьшает вероятность побочных эффектов у библиотек и фреймворков.
Примеры практических сочетаний: полный запрет вертикали с сохранением горизонтали – body { overflow-y: hidden; overflow-x: auto; }. Запрет горизонтали при сохранении вертикали – body { overflow-x: hidden; overflow-y: auto; }. Для внутренних областей используйте те же правила на конкретном .panel или .scroll-area.
Учтите доступность: скрытие скролла не должно лишать пользователей клавиатурной навигации. При блокировке страницы убедитесь, что фокус перемещён в модальное окно или интерактивный элемент, и добавьте видимую индикаторную границу при фокусе.
Резюме рекомендаций: применять overflow-x/overflow-y на минимально необходимом контейнере, использовать touch-action и overscroll-behavior для мобильных, компенсировать ширину исчезающего скроллбара и управлять фокусом для сохранения доступности.
Заморозка прокрутки при открытии модального окна
При открытии модального окна часто требуется зафиксировать содержимое страницы, чтобы пользователь не мог прокручивать фон. Это можно сделать, добавив класс, который запрещает прокрутку.
Самый простой способ – применить к тегу <body> стиль overflow: hidden;. Например:
body.modal-open {
overflow: hidden;
}
При открытии окна добавляется класс modal-open, а при закрытии – удаляется. На JavaScript это выглядит так:
const modal = document.querySelector('.modal');
function openModal() {
modal.classList.add('active');
document.body.classList.add('modal-open');
}
function closeModal() {
modal.classList.remove('active');
document.body.classList.remove('modal-open');
}
Такой подход предотвращает смещение содержимого страницы и оставляет позицию прокрутки неизменной. Если требуется избежать «прыжка» из-за исчезновения полосы прокрутки, можно компенсировать её ширину:
const scrollBarWidth = window.innerWidth - document.documentElement.clientWidth;
document.body.style.paddingRight = scrollBarWidth + 'px';
После закрытия модального окна необходимо удалить добавленные стили, чтобы восстановить исходный вид страницы.
Использование position: fixed для фиксации содержимого
Свойство position: fixed закрепляет элемент относительно окна браузера, а не страницы. Такой элемент остаётся на месте при прокрутке, что удобно для создания фиксированных шапок, панелей навигации и всплывающих блоков.
Чтобы заблокировать прокрутку и удерживать контент в фиксированном положении, можно применить следующий подход:
body { overflow: hidden; } – предотвращает прокрутку страницы, а div или другой контейнер с position: fixed; и координатами top, left, right, bottom фиксирует нужный участок.
Пример:
body {
overflow: hidden;
}
.modal {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0,0,0,0.6);
}
Такое решение полезно при отображении модальных окон: страница не прокручивается, а пользователь взаимодействует только с зафиксированным элементом. Для восстановления прокрутки можно убрать overflow: hidden у body.
При использовании position: fixed важно учитывать, что элемент выходит из потока документа, и соседние блоки не учитывают его позицию. Это следует учитывать при верстке, чтобы не нарушать структуру макета.
Скрытие полосы прокрутки без потери доступа к контенту
Используйте скрытие только визуального элемента полосы прокрутки – поведение прокрутки должно оставаться доступным для мыши, колесика, сенсора и клавиатуры. Кросс-браузерный набор правил: включите прокрутку через overflow, добавьте оптимизации для iOS и отключите отображение полосы для WebKit/Firefox/IE.
Пример разметки – контейнер, который по-прежнему принимает фокус и клавиатурные события:
<div class="scrollbox" tabindex="0" role="region" aria-label="Список элементов">
<!-- длинный контент -->
</div>
CSS (вертикальная прокрутка):
.scrollbox {
overflow: auto; /* оставляем прокрутку */
-webkit-overflow-scrolling: touch; /* плавная прокрутка на iOS */
scrollbar-width: none; /* Firefox */
-ms-overflow-style: none; /* IE 10+ */
position: relative; /* для декоративных индикаторов */
max-height: 320px; /* пример ограничения по высоте */
outline: none; /* скрытие стандартного фокуса – замените кастомным */
}
.scrollbox::-webkit-scrollbar { display: none; } /* Chrome, Safari, Edge (WebKit) */
.scrollbox:focus { box-shadow: 0 0 0 3px rgba(21,156,228,0.35); } /* видимый фокус для клавиатуры */
Рекомендации по доступности:
1) Обязательно добавьте tabindex="0" или элементы внутри сделайте фокусируемыми, чтобы пользователи клавиатуры могли попасть в область и прокручивать стрелками и PageUp/PageDown.
2) Повысьте контраст видимого фокуса (пример выше) – иначе клавиатурные пользователи потеряют место в документе.
3) Для скрин-ридеров укажите role="region" и короткий aria-label с описанием содержимого.
4) Не используйте overflow: hidden, если хотите сохранить прокрутку; оно блокирует доступ.
Опционально: визуальный индикатор наличия прокрутки без физической полосы. Лёгкий градиент по краю подскажет, что есть дополнительный контент:
.scrollbox::after {
content: "";
position: absolute;
right: 0;
top: 0;
height: 100%;
width: 12px;
pointer-events: none;
background: linear-gradient(to left, rgba(0,0,0,0.08), transparent 40%);
}
Тестирование: проверяйте поведение на Windows+Chrome/Firefox, macOS+Safari, iOS Safari и Android Chrome; убедитесь, что прокрутка работает колесиком, перетаскиванием, жестами и клавиатурой. Контрольные сценарии: фокусирование контейнера, прокрутка на тач-устройстве, навигация с помощью клавиш.
Запрет прокрутки при помощи JavaScript и CSS одновременно

Для полной блокировки прокрутки страницы используют комбинацию CSS и JavaScript. В CSS задают свойство overflow: hidden для элемента body и html:
html, body { overflow: hidden; height: 100%; }
Это предотвращает прокрутку как вертикально, так и горизонтально. Однако одних стилей может быть недостаточно при динамических изменениях контента или вызове скриптов, которые изменяют положение прокрутки.
JavaScript позволяет закрепить текущую позицию страницы и блокировать скролл событий мыши и клавиатуры. Например:
const scrollPosition = window.pageYOffset;
document.body.style.position = 'fixed';
document.body.style.top = `-${scrollPosition}px`;
Этот метод сохраняет видимую область страницы и исключает смещение при попытке прокрутки. Для возврата прокрутки достаточно удалить фиксированное позиционирование и восстановить скролл:
document.body.style.position = '';
window.scrollTo(0, scrollPosition);
Важно учитывать взаимодействие с мобильными устройствами. На iOS иногда требуется дополнительно отключать события touchmove:
document.addEventListener('touchmove', e => e.preventDefault(), { passive: false });
Сочетание CSS overflow: hidden и фиксации позиции через JavaScript обеспечивает надежную блокировку прокрутки на всех популярных браузерах и устройствах.
Возможные побочные эффекты и способы их устранения

Блокировка прокрутки с помощью CSS, чаще всего через overflow: hidden; на body или html, может вызвать несколько нежелательных эффектов, влияющих на удобство использования и отображение контента.
Одним из распространённых эффектов является сдвиг страницы при блокировке скролла, вызванный исчезновением полосы прокрутки. Это приводит к изменению ширины контента и смещению элементов.
| Проблема | Причина | Решение |
|---|---|---|
| Сдвиг контента при блокировке прокрутки | Убирается полоса прокрутки, меняется ширина видимой области | Добавить компенсацию с помощью padding-right равного ширине полосы прокрутки, например: body { overflow: hidden; padding-right: 17px; } |
| Невозможность скролла модальных окон | Скролл отключен глобально, блокирует вложенные контейнеры | Использовать локальный скролл на элементе: .modal { overflow-y: auto; max-height: 80vh; } |
| Проблемы с адаптивностью на мобильных устройствах | Мобильные браузеры обрабатывают overflow: hidden иначе, иногда блокируется прокрутка всей страницы |
Применять position: fixed; к body и корректировать top, left для сохранения текущей позиции скролла |
| Проблемы с клавиатурной навигацией | Блокировка скролла мешает перемещению фокуса к скрытому контенту | При необходимости обеспечить скролл на определённых элементах через tabindex и overflow: auto; |
Для минимизации всех побочных эффектов рекомендуется комбинировать методы: сохранять текущую позицию скролла перед блокировкой, использовать локальный скролл для всплывающих элементов и добавлять компенсацию для полосы прокрутки. Это обеспечивает стабильное отображение контента и корректную работу интерфейса на всех устройствах.
Вопрос-ответ:
Можно ли полностью отключить прокрутку страницы через CSS?
Да, это возможно. Чтобы заблокировать прокрутку страницы, чаще всего используют свойство overflow для элемента body или html. Например, установка overflow: hidden; на body предотвращает вертикальную и горизонтальную прокрутку.
Как заблокировать прокрутку только вертикально, оставив горизонтальную?
Для этого нужно использовать свойство overflow-y. Установив overflow-y: hidden; на body или html, вы отключаете вертикальную прокрутку, но горизонтальная останется доступной. Соответственно, overflow-x управляет горизонтальной прокруткой.
Почему после применения overflow: hidden страница сдвигается?
Когда скрывается прокрутка, исчезает полоса прокрутки, и ширина контента увеличивается на несколько пикселей, что приводит к смещению элементов. Чтобы этого избежать, можно добавить отступ справа с помощью padding-right, равный ширине полосы прокрутки, или использовать JS для динамической подгонки.
Можно ли заблокировать прокрутку только на определенном элементе, а не на всей странице?
Да, это делается через CSS-свойство overflow для конкретного элемента. Например, если у вас есть блок <div class="modal">, вы можете написать .modal { overflow: hidden; }. В этом случае прокрутка будет отключена внутри блока, но остальная страница останется прокручиваемой.
Есть ли различия между overflow: hidden и position: fixed для блокировки прокрутки?
Да, различия есть. overflow: hidden просто скрывает полосы прокрутки, при этом контент остается на месте. position: fixed позволяет закрепить элемент на экране независимо от прокрутки. Часто их используют вместе: body { overflow: hidden; } чтобы заблокировать прокрутку, а модальные окна делают position: fixed для правильного отображения на экране.
Как полностью запретить прокрутку страницы с помощью CSS?
Чтобы остановить прокрутку страницы, можно использовать свойство overflow на элементе body или html. Например, установка body { overflow: hidden; } отключает как вертикальную, так и горизонтальную прокрутку. Этот способ полезен, если необходимо зафиксировать содержимое при показе модального окна или при создании интерфейсов с фиксированными элементами. Следует учитывать, что при этом пользователи не смогут прокручивать страницу вовсе, поэтому важно обеспечить возможность закрытия модальных окон или других элементов, блокирующих доступ к основному контенту.
