Евгений 22 июля в 05:49
22
CSS. Box-sizing: border-box и content-box
Спасение для верстальщика

Подробный разбор одного из самых важных свойств в CSS, которое экономит нервы и время.

По стандарту CSS, когда вы задаете элементу ширину (width: 300px), эта ширина применяется только к контенту. Padding и Border добавляются сверху к этой ширине.

Это называется content-box (значение по умолчанию). Из-за этого верстальщики постоянно сталкивались с тем, что блоки «расползались» и выпадали из сетки.

1. box-sizing: content-box

content-box — это стандартное поведение браузера.

Формула расчета финальной ширины:

Финальная ширина = width + padding-left + padding-right + border-left + border-right

Наглядный пример:

Мы хотим блок шириной в 300px.

.content-box-demo {
  box-sizing: content-box; /* Можно не писать, это по умолчанию */
  width: 300px;
  padding: 20px;
  border: 5px solid black;
}
  • Ширина контента: 300px.
  • Padding: 20px слева + 20px справа = 40px.
  • Border: 5px слева + 5px справа = 10px.
  • Итоговая ширина элемента на странице: 350px.

2. box-sizing: border-box

Это значение меняет алгоритм расчета — теперь width и height включают в себя и контент, и padding, и border.

Формула расчета:

Ширина контента = width - padding-left - padding-right - border-left - border-right

Контент сожмется, чтобы освободить место для padding и border.

Тот же пример, но с border-box:

.border-box-demo {
  box-sizing: border-box;
  width: 300px;
  padding: 20px;
  border: 5px solid black;
}
  • Итоговая ширина элемента на странице: ровно 300px (как и задано).
  • Ширина контента (пространство под текст): 300px - 40px - 10px = 250px.

3. Глобальный сброс (Золотой стандарт верстки)

Почти никто не использует content-box для всей страницы. Это пережиток прошлого. 99% современных проектов начинаются с этого правила, которое переопределяет поведение для всех элементов:

*,
*::before,
*::after {
  box-sizing: border-box;
}

Теперь div с width: 33.333%, у которого есть padding: 15px, не упадет на новую строку в сетке из трех колонок.


Важный нюанс

box-sizing не влияет на margin, т.к. всегда находится снаружи элемента и не учитывается в width.

#html #css #верстка сайта #веб-разработка #frontend
Спасибо автору
0 комментариев
Введите текст комментария