Перейти к содержанию
Educora
Средний18 мин7 / 10

Блочная модель

Узнай, что каждый элемент — это блок из содержимого, внутреннего отступа, рамки и внешнего отступа, научись правильно считать размеры и упрощать себе жизнь с помощью `box-sizing`.

Проверь себя
В этом уроке ты узнаешь
  • Называть четыре слоя блока: content, padding, border, margin
  • Различать блочные и строчные элементы (display)
  • Использовать сокращённую запись margin и padding и центрировать блок
  • Вычислять полный размер элемента для content-box и border-box

Лейла задала карточке width: 300px, потом добавила внутренний отступ и рамку — и карточка вдруг перестала помещаться в колонку шириной 300 пикселей. Почему? Потому что для браузера каждый элемент на странице — это блок (прямоугольная коробка), и его размер не сводится к одному width. Кто понял блочную модель, тот избавился от половины сюрпризов в CSS.

Каждый элемент — это блок

Блок состоит из четырёх слоёв — изнутри наружу. Его можно сравнить с посылкой: вещь внутри — это содержимое, защитный поролон вокруг неё — внутренний отступ, картонная коробка — рамка, а расстояние до соседних посылок — внешний отступ.

  1. content (содержимое) — текст, изображение или дочерние элементы. Размер задают width и height.
  2. padding (внутренний отступ) — пространство между содержимым и рамкой. Фон элемента распространяется и на него.
  3. border (рамка) — граница блока: border: 2px solid teal задаёт толщину, тип линии и цвет.
  4. margin (внешний отступ) — прозрачное расстояние между блоком и соседними элементами.
HTML
<style>
  body { font-family: system-ui, sans-serif; padding: 12px; }
  .margin-zone { display: inline-block; background: #fde68a; }
  .box {
    width: 200px;
    padding: 20px;
    border: 6px solid #6366f1;
    margin: 24px;
    background: #e0e7ff;
  }
</style>

<div class="margin-zone">
  <div class="box">Content: 200px wide</div>
</div>
<p>Yellow = margin, blue frame = border,<br>light blue around the text = padding.</p>
Предпросмотр
Меняй по очереди padding, border и margin и смотри, какая зона растёт. Видимая ширина блока: 200 + 2 × 20 + 2 × 6 = 252px.

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

Свойство display определяет, как ведёт себя блок. Блочные элементы (<div>, <p>, <h1>, <ul>) начинаются с новой строки и занимают всю доступную ширину. Строчные (<span>, <a>, <strong>) остаются внутри текста: width и height на них не действуют, а вертикальный margin не раздвигает соседние строки. inline-block сочетает достоинства обоих: остаётся в строке, но принимает размеры.

HTML
<style>
  body { font-family: system-ui, sans-serif; padding: 12px; line-height: 1.8; }
  .demo { background: #fde68a; border: 1px solid #f59e0b; }
  span.demo { width: 300px; }
  .ib { display: inline-block; width: 110px; text-align: center; background: #bbf7d0; }
</style>

<div class="demo">A div is a block: it takes the whole line.</div>
<p>A <span class="demo">span is inline</span>: width 300px is ignored.
  An <span class="ib">inline-block</span> accepts a width.</p>
Предпросмотр
Добавь в правило span.demo строку display: block; — <span> сразу перейдёт на отдельную строку и получит ширину 300px.

Сокращённая запись отступов

Каждую сторону можно задать отдельно: 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сверху, справа, снизу, слева

Чтобы отцентрировать блочный элемент с заданной шириной, сделай его левый и правый внешние отступы равными auto: margin: 0 auto. Браузер поровну разделит свободное место между двумя сторонами.

HTML
<style>
  body { font-family: system-ui, sans-serif; background: #f1f5f9; padding: 12px; }
  .card {
    max-width: 260px;
    margin: 0 auto;
    padding: 12px 20px 20px;
    background: white;
    border: 1px solid #cbd5e1;
    border-radius: 12px;
  }
  .btn { display: inline-block; padding: 8px 16px; border-radius: 999px;
         background: #14b8a6; color: white; }
</style>

<div class="card">
  <h3>Centered card</h3>
  <p>margin: 0 auto puts me in the middle.</p>
  <span class="btn">Read more</span>
</div>
Предпросмотр
border-radius: 999px полностью скругляет углы — получается кнопка-«таблетка». Удали margin: 0 auto и посмотри, как карточка сместится влево.

`box-sizing`: как считается размер

По умолчанию действует box-sizing: content-box: width — это только ширина содержимого, а внутренний отступ и рамка добавляются сверху. Именно в этом была проблема Лейлы. С box-sizing: border-box значение width — это ширина всего видимого блока вместе с рамкой, а отступ и рамка занимают место внутри. Считать становится гораздо проще.

HTML
<style>
  body { font-family: system-ui, sans-serif; padding: 12px; }
  .ruler { width: 200px; height: 6px; background: #1e293b; margin-bottom: 8px; }
  .demo { width: 200px; padding: 20px; border: 5px solid #0ea5e9;
          margin-bottom: 12px; background: #e0f2fe; }
  .bb { box-sizing: border-box; border-color: #f97316; background: #ffedd5; }
</style>

<div class="ruler"></div>
<div class="demo">content-box: 200 + 40 + 10 = 250px</div>
<div class="demo bb">border-box: exactly 200px</div>
Предпросмотр
Чёрная линия — ровно 200px. Синий блок длиннее её, а оранжевый совпадает с ней точно.
Посчитаем размер

У элемента заданы width: 300px; padding: 15px; border: 2px solid; margin: 10px;. Сколько места по ширине занимает блок в режиме content-box по умолчанию? А какой будет ширина содержимого в режиме border-box?

Показать решение
content-box: видимый блок = 300 + 2 · 15 + 2 · 2 = 334px.
С учётом внешнего отступа он занимает 334 + 2 · 10 = 354px.
border-box: видимый блок — ровно 300px, а содержимое — 300 − 2 · 15 − 2 · 2 = 266px.

Главное

  • Каждый элемент — блок: изнутри наружу content → padding → border → margin.
  • Блочные элементы занимают всю ширину; строчные игнорируют width/height; inline-block — нечто среднее.
  • В сокращённой записи значения идут по часовой стрелке: верх, право, низ, лево; margin: 0 auto центрирует блок.
  • Вертикальные внешние отступы схлопываются: расстояние равно большему из них.
  • В content-box отступ и рамка прибавляются к width; в border-box width — это весь видимый блок.

Проверь себя

Вопросов: 10. Каждый правильный ответ приносит XP.

1 / 10
В каком порядке идут слои блочной модели изнутри наружу?