CSS overflow: hidden, auto, scroll, clip — понятное руководство с примерами
Если ваш блок имеет фиксированную ширину или высоту, возникает вопрос: что делать с лишним содержимым? Ответом управляет CSS overflow. Правильно подобранное значение решает десятки задач — от аккуратной обрезки карточек до отключения скролла страницы под модальным окном.
Что такое CSS overflow и когда он срабатывает
Свойство overflow определяет поведение содержимого, выходящего за пределы области прокрутки элемента (scrollport). Обычно оно актуально, когда у блока есть ограничение по размерам (width/height, max-height и т.п.) и содержимое не влезает.
Значения overflow: краткий обзор
- visible (по умолчанию): содержимое выходит за рамки и остаётся видимым. Скролла нет.
- hidden: лишнее содержимое обрезается, без полос прокрутки.
- scroll: всегда показываются полосы прокрутки (даже если всё влезает).
- auto: полосы прокрутки появляются только при необходимости.
- clip: обрезка как у hidden, но принципиально без прокрутки и без возможности прокрутить содержимое скриптами по оси (кроме специальных случаев).
Также есть осевые варианты: overflow-x и overflow-y, которые задают поведение отдельно по горизонтали и вертикали.
Базовый пример: сравниваем hidden, auto, scroll и clip
<style>
.box { width: 280px; height: 120px; border: 2px solid #333; margin: 12px 0; }
.box p { margin: 0; padding: 8px; line-height: 1.4; }
#v { overflow: visible; }
#h { overflow: hidden; }
#s { overflow: scroll; }
#a { overflow: auto; }
#c { overflow: clip; }
</style>
<div id="v" class="box"><p>visible: содержимое выходит за рамки блока и продолжает отображаться снаружи, без скролла.</p></div>
<div id="h" class="box"><p>hidden: лишний текст будет обрезан. Полос прокрутки нет.</p></div>
<div id="s" class="box"><p>scroll: полосы прокрутки видны всегда, даже если весь текст помещается в блок.</p></div>
<div id="a" class="box"><p>auto: полосы появятся только при переполнении. Это обычно оптимальный выбор.</p></div>
<div id="c" class="box"><p>clip: поведение похоже на hidden, но стандартно не предусматривает прокрутку содержимого.</p></div>
overflow-x и overflow-y: точечный контроль осей
Частая задача — разрешить вертикальную прокрутку, но обрезать горизонтальный скролл (чтобы не появлялась нижняя полоса прокрутки из-за длинных слов или картинок).
<style>
.scroll-y { max-height: 180px; overflow-y: auto; overflow-x: hidden; }
.item { padding: 8px 12px; border-bottom: 1px solid #eee; white-space: nowrap; }
</style>
<div class="scroll-y">
<div class="item">Строка 1 — длинное-длиннющее слово: СверхкалибровочныйПараллелепипед</div>
<div class="item">Строка 2</div>
<div class="item">Строка 3</div>
<div class="item">Строка 4</div>
<div class="item">Строка 5</div>
</div>
Здесь вертикальный список прокручивается, а горизонтальное переполнение скрыто.
Многоточие для длинных строк: text-overflow: ellipsis
Чтобы заменить «лишний» конец строки на многоточие, одних text-overflow: ellipsis недостаточно. Нужны три условия: фиксированная или ограниченная ширина, white-space: nowrap и overflow: hidden (или clip).
<style>
.title {
width: 260px;
white-space: nowrap;
overflow: hidden; /* или clip */
text-overflow: ellipsis; /* многоточие */
border: 1px solid #ddd; padding: 6px 8px;
}
</style>
<div class="title">Очень длинный заголовок карточки товара, который не помещается</div>
Для многоточия в несколько строк используйте сочетание display: -webkit-box и -webkit-line-clamp (поддержка хорошая в современных браузерах):
<style>
.multi-ellipsis {
width: 260px;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3; /* количество строк */
overflow: hidden;
}
</style>
<div class="multi-ellipsis">
Текст анонса, который займёт много места, но мы хотим показать только первые три строки,
а остальное скрыть с аккуратным окончанием.
</div>
Отключение скролла страницы для модалки без «дёрганья» контента
Классическая проблема: при открытии модального окна мы ставим у body { overflow: hidden; }, полоса прокрутки исчезает, и из‑за этого контент «прыгает» вправо. Решение — свойство scrollbar-gutter: stable (можно добавить both-edges для надёжности).
<style>
/***** базовая страница *****/
html { scrollbar-gutter: stable both-edges; }
body.modal-open { overflow: hidden; }
/***** упрощённая модалка *****/
.modal {
position: fixed; inset: 0; display: grid; place-items: center;
background: rgba(0,0,0,0.5);
}
.modal__window {
max-width: 560px; width: 90%; background: #fff; padding: 24px; border-radius: 10px;
max-height: 80vh; overflow: auto; /* модальное окно может скроллиться внутри */
}
</style>
<!-- при открытии модалки добавляйте на body класс modal-open -->
<div class="modal" hidden>
<div class="modal__window">Содержимое модального окна</div>
</div>
Так мы избегаем смещения из‑за исчезающего скроллбара и не блокируем прокрутку внутри самой модалки.
overflow как способ изоляции потока и фикса мелких багов в вёрстке
Любое значение overflow, кроме visible, создаёт новый контекст форматирования. Это удобно, когда нужно:
- Пресечь «выпадение» float-элементов из контейнера без clearfix: достаточно поставить overflow: auto/hidden у родителя.
- Остановить схлопывание внешних отступов (margin collapsing) между родителем и первым дочерним блоком.
<style>
.parent { border: 2px solid #5a67d8; margin: 16px 0; }
.child { margin-top: 20px; background: #edf2f7; }
.fix { overflow: hidden; } /* создаёт новый контекст, margin не «схлопнется» вверх */
</style>
<div class="parent">
<div class="child">Без фикса: верхний margin «уходит» за пределы родителя</div>
</div>
<div class="parent fix">
<div class="child">С overflow: margin работает ожидаемо</div>
</div>
Когда выбирать clip вместо hidden
overflow: clip похож на hidden, но спецификация чётко запрещает появление полос прокрутки и прокрутки содержимого. Это полезно для строгой обрезки декоративных эффектов (например, теней), когда нам принципиально не нужна прокрутка и мы хотим избежать неожиданных сценариев со скроллом, в том числе скриптовым.
Частые ошибки и как их избежать
- Обрезали важный контент hidden/clip. Всегда проверяйте доступность: критичный текст должен быть доступен пользователю и ассистивным технологиям. Для интерактивных областей предпочитайте auto/scroll внутри ограниченного окна.
- «Лечим» горизонтальную прокрутку у body через overflow-x: hidden. Это скрывает проблему, а не решает. Лучше найти «виновника» (слишком широкий элемент) и исправить его стиль или расчёт ширины.
- position: sticky не работает. Родитель с overflow, отличным от visible, может помешать sticky. Старайтесь, чтобы липкий элемент находился внутри контейнера без overflow или выносите sticky выше по дереву.
- Скролллок без компенсации. При модалках используйте scrollbar-gutter: stable, чтобы не было скачка макета при появлении/исчезновении полосы прокрутки.
Мини‑чеклист выбора значения
- Нужно обрезать без прокрутки — hidden или clip (строгая обрезка)/ellipsis для текста.
- Нужна прокрутка по требованию — auto (чаще всего лучший выбор).
- Полосы скролла всегда видимы — scroll (полезно при стабильной вёрстке таблиц/виджетов).
- Контроль по осям — комбинируйте overflow-x и overflow-y.
Итого
CSS overflow — базовый, но мощный инструмент управления переполнением, прокруткой и изоляцией контента. Освоив hidden, auto, scroll и clip, вы избежите «ползущих» макетов, сделаете модалки без дёрганья и аккуратно обработаете длинные строки. Хотите системно прокачать вёрстку на реальных макетах и закрепить такие приёмы на практике? Загляните в курс: Прокачать вёрстку на реальных проектах — «Вёрстка сайта с нуля 2.0».
-
Создано 10.04.2026 17:03:11
-
Михаил Русаков

Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.