box-sizing: content-box и border-box

Разбираемся, почему блок шириной 300px иногда занимает 340px, и как это починить одной строкой.

box-sizing определяет, входят ли padding и border в заданную width, или прибавляются к ней снаружи.

Проблема: куда «уехала» ширина

Вы задали блоку width: 300px и padding: 20px. Логично ожидать, что блок займёт 300px. Но по умолчанию он займёт 340px. Почему?

.box {
  width: 300px;
  padding: 20px;
  border: 5px solid black;
}

По умолчанию width задаёт ширину только содержимого, а padding и border прибавляются сверху. Считаем реальную ширину: 300 (content) + 20 + 20 (padding слева и справа) + 5 + 5 (border) = 350px. Это сбивает с толку и ломает сетки.

content-box — поведение по умолчанию

Режим box-sizing: content-box — стандартный. В нём width = ширина содержимого, а padding и border добавляются снаружи.

.box {
  box-sizing: content-box; /* так по умолчанию */
  width: 300px;            /* итоговая ширина: 300 + отступы + рамка */
}

Минус очевиден: трудно держать в голове реальный размер, особенно когда блоков много.

border-box — удобный режим

Режим border-box меняет правила: теперь width — это полная ширина блока, включая padding и border. Содержимое автоматически ужимается, чтобы всё уместилось.

.box {
  box-sizing: border-box;
  width: 300px;     /* блок ровно 300px, что бы вы ни добавили */
  padding: 20px;
  border: 5px solid black;
}

Теперь блок занимает ровно 300px. Padding и border «съели» часть внутреннего пространства, но внешний размер остался таким, как вы задали. Это гораздо предсказуемее.

Сравнение

РежимЧто значит width: 300pxРеальная ширина
content-boxширина содержимого300 + padding + border
border-boxполная ширина блокаровно 300

Глобальный сброс — стандартная практика

Почти все проекты в самом начале CSS-файла включают border-box для всех элементов сразу. Это золотое правило современной вёрстки.

* {
  box-sizing: border-box;
}

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

Итог

  • По умолчанию (content-box) padding и border прибавляются к width снаружи.
  • В border-box width — это полная ширина блока вместе с padding и border.
  • Стандартная практика — включить * { box-sizing: border-box; } в начале файла.
Проверьте себя
1. Сколько пикселей займёт блок с width: 200px, padding: 10px при box-sizing по умолчанию (content-box)?
A200px
B210px
C220px
D180px
2. Что означает width: 300px при box-sizing: border-box?
AШирина содержимого без отступов
BПолная ширина блока, включая padding и border
CМинимальная ширина блока
DШирина только рамки
3. Почему в начало CSS-файла часто ставят * { box-sizing: border-box; }?
AЧтобы ускорить загрузку страницы
BЧтобы размеры блоков были предсказуемыми и padding не ломал ширину
CЧтобы убрать все отступы
DЭто требование браузеров
Поддержать проект