Блочная модель и box-sizing
Элементы в CSS представляют собой набор слоёв: ширина и высота самого элемента (width и height), поля элемента (padding), граница элемента (border) и отступы (margin). Подробнее о блочной модели стоит почитать здесь.
<div class="box-model"> <div class="margin">margin <div class="border">border <div class="padding">padding <div class="size">width</div> </div> </div> </div> </div>
.box-model { display: flex; justify-content: center; } .box-model * { text-align: center; border: 1px dashed black; padding: 10px; margin: 10px 24px 24px; font-size: 14px; font-family: monospace; } .box-model .margin { background: lightsalmon; } .box-model .border { background: navajowhite; } .box-model .padding { background: lightgreen; } .box-model .size { background: lightblue; width: 90px; height: 80px; position: relative; padding: 0 10px; text-align: left; } .box-model .size::after { content: 'height'; position: absolute; writing-mode: vertical-lr; top: 10px; right: 0; }
Долгое время в CSS изменение padding приводило к изменению width у элементов, из-за чего два одинаковых по ширине элементас разными по ширине полями, в реальности имели разную ширину. Пример ниже демонстрирует этот недуг:
<div class="one">padding: 0</div> <div class="two">padding: 40px</div>
.one { width: 200px; height: 100px; padding: 0; } .two { width: 200px; height: 100px; padding: 40px; }
.one,.two{ background: teal; color: white; margin: 20px auto; } .two{ box-shadow: inset 0 0 0 40px darkcyan; }
Для визуализации, padding был окрашен с помощью свойства box-shadow. В действительности же, задать цвет для padding невозможно!
На помощь в борьбе с этим нелогичным, казалось бы, поведением пришел box-sizing. Добавим в наши блоки всего по одной строчке кода:
.one { width: 200px; height: 100px; padding: 0; box-sizing: border-box; } .two { width: 200px; height: 100px; padding: 40px; box-sizing: border-box; }
Так стало гораздо проще работать с CSS, поэтому многие добавляютbox-sizing: border-box всем элементам на сайте при помощи этого кода:
* { box-sizing: border-box; }
Это стало хорошей и распространённой практикой, однако по умолчанию значением свойстваbox-sizing является стандартная модель content-box, возвращающий нас в те времена, когда приходилось вычислять ширину элемента по его полям.