Menu

Overflow в CSS: hidden, scroll, auto, clip и многоточие

overflow решает, что происходит с содержимым, которое не помещается в блок: показать его, обрезать или добавить полосы прокрутки. Разберем visible, hidden, scroll, auto и clip, overflow-x и overflow-y, многоточие в тексте и побочные эффекты overflow для раскладки.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Что делает overflow

Когда содержимое больше своего блока (фиксированная высота, длинное слово, широкая таблица), оно переполняет его. Свойство overflow решает, что будет с лишним:

ЗначениеЧто видноКонтейнер прокрутки
visible (по умолчанию)Содержимое вылезает из блока и перекрывает то, что идет следомНет
hiddenОбрезается по краю padding, без полос прокрутки (скрипт все равно может прокрутить)Да
clipОбрезается, и прокрутки нет вообще, даже скриптомНет
scrollПолосы прокрутки видны всегда, даже если содержимое помещаетсяДа
autoПолосы прокрутки только когда содержимое не помещаетсяДа

В macOS и на телефонах полосы прокрутки накладываются на содержимое и исчезают, поэтому scroll и auto могут выглядеть одинаково, пока не начнете прокручивать.

Блок с прокруткой

Блок переполняется, только если что-то ограничивает его размер. height или max-height плюс overflow-y: auto превращают длинный список в прокручиваемую панель:

max-height здесь лучше, чем height: короткий список остается коротким, и прокручивается только длинный. Прокручиваемой области без фокусируемого содержимого внутри стоит задать tabindex="0", чтобы пользователи клавиатуры тоже могли ее прокручивать.

overflow-x и overflow-y

Оси можно задавать по отдельности. Обычное применение: широкая таблица прокручивается вбок внутри своего контейнера, а не расширяет всю страницу:

Одно правило стоит запомнить: если одна ось hidden, scroll или auto, значение visible на другой оси превращается в auto. Поэтому один лишь overflow-x: hidden может дать неожиданную вертикальную полосу прокрутки. У overflow-x: clip такого эффекта нет:

.a { overflow-x: hidden; }  /* overflow-y computes to auto */
.b { overflow-x: clip; }    /* overflow-y stays visible */

Обрезка текста с многоточием

text-overflow: ellipsis заменяет обрезанный конец строки на «…». Для этого нужны три вещи вместе: ограниченная ширина, текст, который не может переноситься, и скрытое переполнение:

Ограничение строк с префиксом -webkit- работает в Chrome, Firefox и Safari. Программы чтения с экрана все равно читают полный текст, поэтому обрезанные слова для них не теряются.

Побочные эффекты overflow

Значение overflow, отличное от visible и clip, меняет больше, чем обрезку:

  • Оно вмещает float и отступы дочерних элементов. Элемент образует новый блочный контекст форматирования и растет, обхватывая плавающие дочерние элементы. display: flow-root делает то же без всякой обрезки.
  • Оно ломает position: sticky у потомков. Липкий дочерний элемент прилипает к ближайшему контейнеру прокрутки; если этот контейнер не прокручивается, ничего не прилипает.
  • Оно обрезает абсолютно позиционированные дочерние элементы (когда переполняющийся элемент еще и их содержащий блок), включая выпадающие меню и подсказки, а также обрезает тени дочерних элементов.

Как скрыть полосу прокрутки

Можно оставить блок прокручиваемым, но скрыть полосу прокрутки через scrollbar-width: none. Используйте это осторожно: без полосы прокрутки многие читатели не понимают, что содержимого больше. scrollbar-gutter: stable делает обратное: резервирует место под полосу прокрутки, чтобы содержимое не сдвигалось, когда она появляется.

Частые ошибки

  • Ожидание переполнения без ограничения размера. Блок без height или max-height растет, а не переполняется.
  • overflow: hidden на body, чтобы «починить» горизонтальную прокрутку. Лучше найдите слишком широкий элемент (часто это фиксированная width, длинный URL или 100vw при наличии полосы прокрутки).
  • Многоточие без white-space: nowrap. Текст переносится, по горизонтали ничего не переполняется, и многоточие не появляется.
  • overflow-x: hidden создает вертикальную полосу прокрутки. Используйте clip.
  • Выпадающее меню обрезано карточкой. Его обрезает overflow: hidden карточки; перенесите правило overflow или отрисуйте меню снаружи.

Часто задаваемые вопросы

Что делает overflow: hidden?

Обрезает содержимое, которое не помещается в область padding элемента, без полос прокрутки. До скрытой части все равно можно прокрутить скриптом или фокусом на элементе внутри.

Чем overflow auto отличается от scroll?

scroll всегда резервирует полосы прокрутки, даже если содержимое помещается. auto показывает полосу прокрутки, только когда содержимое больше блока, и обычно нужно именно это.

Как сделать прокрутку внутри div?

Ограничьте его размер и разрешите прокрутку: max-height: 300px; overflow-y: auto;. Без ограничения высоты или max-height div растет вместе с содержимым и никогда не переполняется.

Почему overflow-x: hidden добавляет еще и вертикальную прокрутку?

Если одна ось hidden, scroll или auto, значение visible на другой оси вычисляется как auto. Используйте overflow-x: clip: он не создает контейнер прокрутки и оставляет другую ось видимой.

Как добавить многоточие (...) к тексту, который не помещается?

Для одной строки: white-space: nowrap; overflow: hidden; text-overflow: ellipsis; у элемента с ограниченной шириной. Для нескольких строк используйте display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; overflow: hidden;.

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ