Box model и box-sizing

↑ 1.3 CSS и SASS · → Следующая

Желательно~3 мин чтенияУровень: junior

Зачем это на собесе

Самый базовый вопрос по CSS: из чего состоит блок и почему ширина «не совпадает».

Объяснение

Каждый элемент — прямоугольник: content → padding → border → margin.

СвойствоЧто задаёт
width/heightразмер content-области (при content-box)
paddingотступ внутри, фон распространяется
borderрамка
marginотступ снаружи, прозрачный

box-sizing:

ЗначениеШирина элемента
content-box (по умолчанию)width + padding + border
border-boxwidth включает padding и border
*, *::before, *::after { box-sizing: border-box; }   /* привычный сброс */
.card { width: 300px; padding: 16px; border: 1px solid #ddd; }   /* итого 300px при border-box */

Типы блоков: display: block (на всю строку, принимает размеры), inline (в строке, игнорирует width/height и вертикальные margin), inline-block, none, flex, grid.

Схлопывание margin: вертикальные margin соседних блоков (и родителя с первым/последним потомком) объединяются в больший. Не схлопываются в flex/grid и при overflow не visible, padding/border у родителя.

Нюансы и подводные камни

  • margin: auto центрирует блок с заданной шириной по горизонтали.
  • padding в процентах считается от ширины родителя (даже сверху и снизу).
  • Отрицательные margin допустимы, но усложняют вёрстку.
  • inline-элементы имеют «пробел» между собой из-за пробельных символов.
  • outline не влияет на размеры, в отличие от border.

Практика

  1. Сравните размеры блока с content-box и border-box в DevTools.
  2. Воспроизведите схлопывание margin и устраните его.
  3. Сверстайте карточку с фиксированной шириной и отступами без переполнения.

Вопросы с ответами

Связанные темы