Menu

Width и height в CSS: min, max, проценты и auto

width и height задают размер блока элемента. Разберем фиксированные и процентные размеры, почему height: 100% часто не работает, min-height и max-width для гибкой раскладки, auto и 100% и ключевые слова fit-content.

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

Как задать ширину и высоту

width и height задают размер области содержимого элемента. По умолчанию padding и рамка добавляются снаружи этого размера.

Блок размером 260 на 100 пикселей: 240 на 80 содержимого плюс 10px padding с каждой стороны. С box-sizing: border-box он был бы ровно 240 на 80; оба варианта объяснены на странице про блочную модель.

Значения

ЗначениеПримерСмысл
autowidth: autoПо умолчанию. Блоки заполняют ширину контейнера; высота подстраивается под содержимое
Длина300px, 20remФиксированный размер
Проценты50%От ширины (для width) или высоты (для height) содержащего блока
Единицы viewport100vh, 50vw, 100dvhОт окна браузера
min-contentwidth: min-contentКак можно уже, решает самое длинное слово
max-contentwidth: max-contentШирина содержимого в одну строку
fit-contentwidth: fit-contentКак max-content, но не шире контейнера

Почему height: 100% ничего не делает

Процентной height нужен родитель с определенной высотой, от которой считается процент. Когда высота родителя auto, а это обычный случай, height: 100% дочернего элемента тоже ведет себя как auto.

Первый дочерний элемент высотой ровно в свой текст. Второй заполняет родителя, потому что у родителя есть высота. Чтобы цепочка процентов работала для всей страницы, высота нужна каждому предку вплоть до html и body, поэтому большинство раскладок используют flexbox или grid: их дочерние элементы растягиваются без всяких процентов.

min-height и max-width: гибкие размеры

Фиксированные размеры легко ломаются: фиксированная высота переполняется, когда текст длиннее ожидаемого, а фиксированная ширина слишком велика для телефона. Свойства min- и max- задают пределы, а не точные размеры.

СвойствоСмысл
min-widthНе уже этого
max-widthНе шире этого
min-heightНе ниже этого, но может расти
max-heightНе выше этого (лишнее содержимое переполняет)

На экране уже 360px, например на телефоне, карточки сжимаются вместе с ним, потому что max-width это только потолок.

Когда действуют и размер, и предел, побеждают пределы: max-width сильнее width, а min-width сильнее max-width.

width: auto и width: 100%

Для блочного элемента оставить width равным auto почти всегда правильно. auto вписывает весь блок, вместе с padding и рамкой, в контейнер. 100% делает содержимое шириной с контейнер и затем добавляет padding и рамку сверху:

width: 100% все равно полезен у элементов, которые по умолчанию не блочные (<input>, <img>, inline-block), желательно вместе с box-sizing: border-box.

Размер по содержимому: fit-content

Чтобы блок был шириной только в свой текст, не превращая его в inline-block, используйте fit-content:

fit-content вместе с margin-inline: auto центрирует подпись или блок в виде кнопки, который остается ровно шириной в свой текст.

Секции на всю высоту и единицы viewport

vh это 1% высоты окна просмотра, а vw 1% его ширины. На телефонах адресная строка браузера растет и сжимается при прокрутке, поэтому 100vh может оказаться выше видимой области. Динамическая единица dvh следует за видимой областью, а svh использует наименьшую видимую высоту:

.hero {
  min-height: 100vh;  /* fallback */
  min-height: 100dvh; /* follows mobile toolbars */
}

Для полноэкранных секций используйте min-height, а не height, чтобы на маленьком экране с большим количеством текста секция росла. При фиксированной высоте содержимое, которое не помещается, вылезает наружу, и этим занимается свойство overflow в CSS.

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

  • height: 100% в родителе без высоты. Работает как auto. Задайте родителю высоту или используйте flex или grid.
  • width: 100% плюс padding. Элемент выходит за контейнер. Оставляйте ширину блоков auto или используйте box-sizing: border-box.
  • Фиксированная высота у текстовых контейнеров. Используйте min-height, чтобы длинный текст или крупный шрифт не вылезали.
  • width у строчного элемента. <span> и <a> игнорируют width и height; сделайте их inline-block или block.
  • width: 1200px у обертки страницы. На каждом телефоне появится горизонтальная прокрутка. Используйте max-width: 1200px.

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

Почему не работает height: 100%?

Высота в процентах считается от высоты родителя и работает, только если эта высота определена. Если высота родителя auto (задается содержимым), процент трактуется как auto. Задайте родителю высоту или используйте flexbox или grid, которые растягивают дочерние элементы без процентов.

Чем отличается width: 100% от width: auto?

Для блочного элемента auto заполняет контейнер вместе с padding и рамкой. width: 100% делает ширину содержимого равной ширине контейнера, поэтому при box-sizing: content-box по умолчанию любой padding или рамка приводят к выходу элемента за контейнер.

Что делает min-height в CSS?

Задает наименьшую высоту элемента и при этом позволяет ему расти вместе с содержимым. min-height: 200px дает пустой карточке 200px, а карточка с большим количеством текста становится выше и не переполняется, чего фиксированная height не позволила бы.

Чем width отличается от max-width?

width задает точный размер. max-width задает верхний предел: элемент может быть уже, например на телефоне, но никогда не шире. width: 100%; max-width: 600px; заполняет маленькие экраны и останавливается на 600px на больших.

Как сделать элемент на всю высоту экрана?

Используйте min-height: 100vh (или 100dvh, чтобы учесть панели мобильного браузера). min-height вместо height позволяет секции вырасти, если содержимое выше экрана.

Coddy programming languages illustration

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

НАЧАТЬ