В CSS3 появилось свойство
, смысл которого в способе вычисления ширины HTML-блока браузером. Но, прежде чем переходить к его рассмотрению, сначала давайте вспомним, как обычно браузер производит расчет ширины блока элемента в HTML-разметке?
1 box-sizing
Вычисление всегда выполняется по формуле:
. То есть, если ширина контента задана в 200px, 1
Width = Margin + Border + Padding + Content
равен 25px, 1
padding
равен 10px, а 1
border
равен 15px; то результирующая ширина блока будет равна 300px.1
margin
Такой способ вычисления ширины блока делают все современные браузеры:
Однако, были времена, когда не все браузеры вычисляли размеры блока элемента подобным образом. Существовал Internet Explorer версии 5/6, который ширину блока считал несколько иначе: из заданной ширины блока вычитались padding и border, получалась результирующая ширина области content. В те времена веб-разработчики “показывали пальцем” на этот браузер и говорили, что это ошибка и недочет разработчиков IE5/6.
Но теперь времена изменились благодаря появлению адаптивного (
) дизайна. Причины возникновения адаптивного дизайна - в огромном количестве устройств с разными размерами экранов, по большей части мобильных. Задача адаптивного дизайна в “подстраивании” одного и того же дизайна сайта под различные размеры мониторов. При таком “подстраивании” важной становиться задача вычисления ширины блоков элементов, чтобы верстка не “разваливалась”.1
responsive
Чтобы такого не произошло, как раз и становиться удобным “возврат” к той модели расчета ширины блока, какая присутствовала в IE5/6. Для этого было разработано свойство
, с помощью которого можно управлять подобной моделью расчета.1
box-sizing
Свойство принимает три значения (три модели вычисления ширины блока): **content-box |
padding-box | border-box**. |
Свойство box-sizing: content-box
Первая модель
является способом вычисления ширины блока по умолчанию, принятым в современных браузерах:1
content-box
Ширина блока равна сумме: 1
Width = Width (Content) + Padding + Border + Margin
Свойство box-sizing: padding-box
Вторая модель
заключается в том, что ширина блока включает в себя ширину контента (1
padding-box
) и ширину 1
content
. Остальные - 1
padding
и 1
border-box
- приплюсовываются к заданной ширине, как обычно. Данная модель, хоть и заявлена в спецификации CSS3, не поддерживается на сегодняшний день почти никакими браузерами; так что о ней можно забыть (пока забыть):1
margin-box
Ширина блока равна сумме: 1
Width = Width (Content + Padding) + Border + Margin
Свойство box-sizing: border-box
Третья модель
очень похожа на предыдущую модель 1
border-box
. Но, в данном случае, ширина блока включает в себя еще и 1
padding-box
; то есть ширина блока включает в себя область 1
border-box
, 1
content-box
и 1
padding-box
. Область 1
border-box
прибавляется к ширине блока элемента, как обычно.1
margin-box
Ширина блока равна сумме: 1
Width = Width (Content + Padding + Border) + Margin
Практический пример свойства box-sizing
Теперь не мешало бы продемонстрировать на практике, каким образом браузеры выполняют вычисления ширины блоков элементов под управлением свойства
. Допустим, у нас имеется блок-обертка 1
box-sizing
, внутри которого расположены два плавающих блока-потомка 1
div class="wrap"
и 1
div class="left"
.1
div class="right"
HTML-разметка представлена ниже:
… и CSS-таблица, обычная для такого случая. Единственное “новое” правило в этом коде - это свойство
, указанное с вендорными префиксами. Обычно его можно не указывать, так как у браузеров по умолчанию свойство 1
box-sizing
установлено в значении 1
box-sizing
(как уже упоминалось ранее). Но в нашем случае понадобится явно указать это свойство. Для блоков-потомков здесь намерено мы не указываем (пока не указываем) 1
content-box
, 1
padding
и 1
border
:1
margin
Блоки-потомки четко вписываются в блок-родитель, так как у них нет
, 1
border
и 1
padding
; ширина блоков-потомков точно равна половине ширине блока-родителя.1
margin
Теперь добавим для блоков-потомков
:1
padding: 5px
Картина будет заранее предсказуемая - один из блоков-потомков опуститься вниз из-за добавления
к обоим блокам:1
padding: 5px
Настало время применить свойство
со значением 1
box-sizing
. Браузер сразу же пересчитает ширину обоих блоков и картина, как по волшебству, изменится:1
border-box
Даже если добавить к блокам-потомкам границу
, то картинка останется прежней:1
border
Но если прибавить к блокам
и 1
div class="left"
правило 1
div class="right"
, то наша разметка снова “сломается”:1
margin
Это происходит потому, что в модель вычисления
поля 1
border-box
не входят. Поле 1
margin
размером 5px прибавляется к ширине блока-потомка. Суммарная ширина обоих блоков-потомков превышает ширину блока-родителя и один из них выходит из его, опускаясь (снова) вниз:1
margin-left
В этом примере мы не применили к свойству
значения 1
box-sizing
, потому что [браузеры не понимают этого значения][1] и свойство 1
padding-box
работать не будет в этом случае.1
box-sizing
Заключение
Вот и все, что можно сказать о свойстве
. Понимание этого свойства понадобиться еще, когда придет время изучать адаптивный (responsive) дизайн.1
box-sizing
Основой для данной статьи послужила замечательная “Большая книга CSS3 Д. Макфарланд (3-е издание).
[1]: https://developer.mozilla.org/en-US/docs/Web/CSS/box-sizing “MDN | CSS - box-sizing” |