Блочная модель и 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, возвращающий нас в те времена, когда приходилось вычислять ширину элемента по его полям.