Урок 5 из 8 · 20 мин · обновлено
Блочная модель: размеры, отступы и рамки
Из чего состоит каждый элемент на странице: содержимое, внутренний отступ, рамка и внешний отступ. Как работает box-sizing и чем блочные элементы отличаются от строчных.
Всё на странице — прямоугольники
Откройте инструменты разработчика (F12) и наведите курсор на любой элемент: браузер подсветит прямоугольник. Каждый элемент состоит из четырёх слоёв — это и есть блочная модель:
- content — содержимое: текст, картинка;
- padding — внутренний отступ, между содержимым и рамкой;
- border — рамка;
- margin — внешний отступ, расстояние до соседей.
В инструментах разработчика на вкладке Computed эта схема нарисована для каждого элемента — удобно, когда непонятно, откуда взялся лишний отступ.
Размеры и отступы
.card {
width: 300px;
padding: 20px;
border: 1px solid #d5dbd0;
margin-bottom: 16px;
background-color: white;
}
Фон заливает содержимое и padding, но не margin: внешний отступ всегда прозрачный.
Отступы можно задавать для каждой стороны отдельно или короткой записью:
.box {
padding: 10px; /* со всех сторон */
padding: 10px 20px; /* сверху и снизу 10, слева и справа 20 */
padding: 10px 20px 30px 40px; /* сверху, справа, снизу, слева — по часовой стрелке */
margin-top: 24px; /* только сверху */
}
Запомнить порядок помогает часовая стрелка: верх, право, низ, лево.
box-sizing: border-box
По умолчанию width задаёт ширину только содержимого, а padding и рамка прибавляются сверху. Блок с width: 300px и padding: 20px на самом деле займёт 342 пикселя. Считать так неудобно, поэтому почти в каждом проекте первым делом пишут:
* {
box-sizing: border-box;
}
Звёздочка выбирает все элементы. Теперь width: 300px — это вся ширина вместе с отступами и рамкой, а для содержимого остаётся сколько получится.
Блочные и строчные элементы
Элементы ведут себя по-разному:
| Блочные | Строчные | |
|---|---|---|
| Примеры | div, p, h1–h6, section, ul |
a, span, strong, em |
| Ширина | вся доступная | по содержимому |
| Новая строка | да | нет, встают в строку текста |
| width и height | работают | не работают |
Поведение меняет свойство display:
.menu a {
display: inline-block; /* в строку, но с размерами и отступами, как у блока */
padding: 8px 16px;
}
Значение inline-block часто используют для кнопок-ссылок: они стоят в строку, но принимают отступы. А display: none полностью скрывает элемент.
Выравнивание блока по центру
Частая задача — колонка текста по центру страницы:
.container {
max-width: 700px;
margin: 0 auto;
padding: 0 16px;
}
margin: 0 auto делит свободное место поровну слева и справа. max-width вместо width позволяет блоку сужаться на маленьких экранах. Именно так устроена колонка текста на этом сайте.
Попробуйте сами. Сверстайте карточку товара: белый фон, рамка 1px, скругление углов 12px (свойство border-radius), внутренний отступ 20px, ширина не больше 320px. Под карточкой — внешний отступ 24px.
Решение
<article class="product">
<h2>Наушники</h2>
<p>Беспроводные, до 30 часов работы.</p>
<p class="price">4 990 ₽</p>
</article>
* {
box-sizing: border-box;
}
.product {
max-width: 320px;
padding: 20px;
margin-bottom: 24px;
border: 1px solid #d5dbd0;
border-radius: 12px;
background-color: white;
}
Благодаря border-box карточка займёт ровно 320 пикселей, как задумано, несмотря на отступы и рамку.
Мини-тест: проверьте себя
Закрепите урок: несколько вопросов, разбор ответов — в конце.
-
Чем padding отличается от margin?
padding отодвигает содержимое от рамки, а margin отодвигает весь элемент от соседей. Фон элемента заливает padding, но не margin.
-
У блока width: 300px, padding: 20px, border: 1px, box-sizing: border-box. Какой будет его полная ширина?
С border-box ширина включает padding и рамку: блок займёт ровно 300px, а место для содержимого станет меньше — 258px.
-
Какой элемент по умолчанию строчный?
Ссылки, strong, em и span встают в строку текста. div, p, заголовки и section — блочные: занимают всю ширину и начинаются с новой строки.
-
Как выровнять блок шириной 600px по центру страницы?
margin: 0 auto делит свободное место поровну слева и справа. text-align выравнивает текст и строчные элементы внутри блока, а не сам блок.