Что делает 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;.