Блочная модель
Блочная модель — алгоритм, по которому браузер рассчитывает размеры области (бокса), в которой находится элемент. Обычно ее изображают так:
Таким образом, чтобы узнать ширину и высоту бокса браузеру надо сложить следующие свойства:
Ш.Б = width + padding-right + padding-left + border-right + border-left + margin-right + margin-left
В.Б = height + padding-top + padding-bottom + border-top + border-bottom + margin-top + margin-bottom
где Ш.Б — ширина бокса, В.Б — высота бокса, width — ширина контента элемента, height — высота контента элемента, padding — внутренний отступ элемента, border — рамка элемента, margin — внешний отступ элемента.
Здесь есть один нюанс. Обычно всем кажется, что свойства width и height задаются ширину и высоту элемента. Но это не так! Данные свойства отвечают за размеры контентной части элемента, а размеры бокса рассчитываются только по блочных модели.
Хорошо, мы рассмотрели как рассчитывается область бокса. Но как рассчитать сами размеры элемента? На самом деле размеры бокса можно упростить следующим образом:
Ш.Б = Ш.Э + margin-right + margin-left
В.Б = В.Э + margin-top + margin-bottom
где, Ш.Э — ширина высота элемента, В.Э — высота элемента.
Таким образом, чтобы рассчитать размеры элемента браузер суммирует свойства width / height, padding, border и margin:
Ш.Э = width + padding-right + padding-left + border-right + border-left
В.Э = height + padding-top + padding-bottom + border-top + border-bottom
Теперь закрепим теорию на практике. Рассмотрим пример, в котором рассчитаем ширину элемента .header:
.header{
width: 960px;
padding-left: 20px;
padding-right: 20px;
border: 1px solid #000;
}
Получилось, что ширина элемента 1002px. Давай теперь побудем на месте браузера и сами подставим значения в формулу:
ширина header = 960px + 20px + 20px + 1px + 1px + 0 + 0 = 1002px
Сделаем еще один эксперимент. В предыдущий пример добавим еще margin:
.header{
width: 960px;
padding-left: 20px;
padding-right: 20px;
border: 1px solid #000;
margin: 20px;
}
Как видишь размер элемента не изменился, это доказывает, что margin не влияет на его размеры.
Хорошо, мы рассмотрели как браузер рассчитывает размеры элемента и бокса. Но в современных стандартах есть возможность менять стандартную блочную модель.
Свойство box-sizing
Box-sizing — свойство, которое позволяет переключить алгоритм расчета размеров элементов. Оно имеет несколько значений.
content-box
При этом значении браузер рассчитывает размеры элемента по стандартному алгоритму.
border-box
А вот значение border-box меняет стандартную блочную модель. При использование box-sizing: border-box свойства width и height начинают включать в себя значения padding и border. Проще говоря, width и height будут задавать ширину и высоту элемента, а не контентной области.
Рассмотрим пример:
.header{
box-sizing: border-box;
width: 960px;
padding-left: 20px;
padding-right: 20px;
border: 1px solid #000;
}
Когда мы проинспектируем элемент, то увидим, что ширина элемента уже равняется 960px. Также мы можем увидеть, что ширина контентной области стала 918px.