Как задать ширину и высоту
width и height задают размер области содержимого элемента. По умолчанию padding и рамка добавляются снаружи этого размера.
Блок размером 260 на 100 пикселей: 240 на 80 содержимого плюс 10px padding с каждой стороны. С box-sizing: border-box он был бы ровно 240 на 80; оба варианта объяснены на странице про блочную модель.
Значения
| Значение | Пример | Смысл |
|---|---|---|
auto | width: auto | По умолчанию. Блоки заполняют ширину контейнера; высота подстраивается под содержимое |
| Длина | 300px, 20rem | Фиксированный размер |
| Проценты | 50% | От ширины (для width) или высоты (для height) содержащего блока |
| Единицы viewport | 100vh, 50vw, 100dvh | От окна браузера |
min-content | width: min-content | Как можно уже, решает самое длинное слово |
max-content | width: max-content | Ширина содержимого в одну строку |
fit-content | width: 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 позволяет секции вырасти, если содержимое выше экрана.