Глиф Учебники

Урок 7. Блочная модель — margin, padding, border

Курс «HTML и CSS» · урок 7 из 10 · 5 минут чтения

Для CSS каждый элемент страницы — прямоугольник, «коробка». От того, как устроена эта коробка, зависят все размеры и отступы на странице. Когда блок вдруг оказывается шире, чем задано, или отступ не тот, — дело почти всегда в блочной модели.

Из чего состоит блок

Изнутри наружу:

  1. Содержимое (content) — текст, картинка, вложенные элементы. Его размер задают width и height.
  2. Внутренний отступ (padding) — поле между содержимым и рамкой. Фон блока заходит и под него.
  3. Рамка (border).
  4. Внешний отступ (margin) — расстояние до соседних элементов. Он всегда прозрачный.
CSS
.card {
  width: 300px;
  padding: 20px;
  border: 2px solid #ccc;
  margin: 16px;
  background-color: #fafafa;
}
margin 16px прозрачный border 2px padding 20px содержимое width: 300px фон заходит и под padding
Блок .card изнутри наружу: содержимое шириной 300px, внутренний отступ padding 20px, рамка border 2px и прозрачный внешний отступ margin 16px.

Увидеть всё это на живой странице проще всего в инструментах разработчика: нажмите F12, выберите элемент — рядом со стилями будет схема блока с размерами содержимого, padding, border и margin.

Короткая запись отступов

margin и padding можно задать для каждой стороны отдельно (margin-top, margin-right, margin-bottom, margin-left) или одной строкой:

ЗаписьЧто значит
padding: 10px;со всех сторон 10px
padding: 10px 20px;сверху и снизу 10px, слева и справа 20px
padding: 10px 20px 30px;сверху 10px, слева и справа 20px, снизу 30px
padding: 10px 20px 30px 40px;сверху, справа, снизу, слева — по часовой стрелке

Рамка тоже пишется одной строкой: толщина, вид линии, цвет — border: 1px solid black;. Вид линии бывает solid (сплошная), dashed (штрихи), dotted (точки). Рамка только с одной стороны — border-bottom: 1px solid black;. Скругление углов — border-radius: 8px;, круг из квадрата — border-radius: 50%;.

Сколько места занимает блок

По умолчанию width — это ширина только содержимого. Отступы и рамка прибавляются к ней. Блок .card выше займёт по ширине:

300 (содержимое) + 20 + 20 (padding) + 2 + 2 (border) = 344 пикселя — и ещё по 16 пикселей margin с каждой стороны.

Считать так неудобно: задали 300, получили 344. Свойство box-sizing: border-box меняет правило: width включает padding и рамку, и блок занимает ровно 300 пикселей, а под содержимое остаётся 300 − 40 − 4 = 256.

border 2px padding 20px содержимое По умолчанию 20 20 300 width: 300px занимает 344px box-sizing: border-box 20 20 256 width: 300px — занимает 300px
По умолчанию width: 300px — ширина одного содержимого, и с padding и рамкой блок занимает 344px, а при box-sizing: border-box те же 300px включают padding и рамку, и содержимому остаётся 256px.

Почти все сайты включают такой расчёт для всех элементов сразу — поставьте эти строки в начало своего CSS:

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

Блочные и строчные элементы

Свойство display определяет, как элемент ведёт себя среди соседей.

display можно поменять у любого элемента: ссылке — display: block, пункту списка — display: inline. display: none убирает элемент со страницы совсем. Ещё два значения — flex и grid — тема следующих уроков.

Ширина: width и max-width

CSS
.page {
  max-width: 960px;
  margin: 0 auto;
  padding: 0 16px;
}

Высоту обычно не задают: блок сам растёт по содержимому. Жёсткая height приводит к тому, что длинный текст вылезает за край. Если нужна наименьшая высота — min-height.

Отступы по умолчанию

Браузер сам даёт отступы некоторым элементам: у body — 8 пикселей со всех сторон, у <p> и заголовков — сверху и снизу, у списков — слева. Из-за этого страница никогда не прилегает к краю окна. Если это мешает, обнулите:

CSS
body {
  margin: 0;
}

Схлопывание внешних отступов

Вертикальные margin соседних блоков не складываются, а схлопываются: между абзацем с margin-bottom: 20px и абзацем с margin-top: 30px будет 30 пикселей, а не 50 — побеждает больший. Горизонтальные отступы и padding так себя не ведут.

Ожидание: 50px margin-bottom: 20px margin-top: 30px 50px На деле: 30px margin-bottom: 20px margin-top: 30px 30px
Вертикальные отступы margin-bottom: 20px и margin-top: 30px соседних абзацев не складываются в 50px, а накладываются друг на друга, и между абзацами остаётся больший — 30px.

Ещё один случай: margin-top первого вложенного элемента может «вылезти» наружу и сдвинуть вниз весь родительский блок. Помогает padding-top у родителя вместо margin-top у ребёнка. Внутри Flexbox и Grid отступы не схлопываются.

Частые ошибки

Коротко

Проверьте себя

1. Чему равна полная ширина блока с width: 200px; padding: 10px; border: 1px solid; без box-sizing: border-box?
2. Что делает запись margin: 10px 20px;?
3. Как поставить блок шириной до 800px по центру страницы?
4. Между блоками с margin-bottom: 40px и margin-top: 20px какое будет расстояние?
5. Почему у ссылки <a> не меняется width?