Блочные элементы
Элементы HTML страницы обычно делятся на блочные и строчные.
Блочные элементы можно представлять как прямоугольные области на странице. Они имеют следующие особенности:
- До и после блочного элемента существует перенос строки.
- Блочным элементам можно задавать ширину, высоту, внутренние и внешние отступы.
- Занимают всё доступное пространство по горизонтали.
К блочным элементам относятся такие теги как:<p>,<h1>,<h2>,<ul>и так далее.
Еще один важный блочный тег — это тег<div>, который обозначает просто «блок» или «прямоугольный контейнер». Этот тег чаще всего используется для создания сеток.
Существуют и более сложные типы элементов, им будет посвящена вторая часть курса.
Стандартная блочная модель
Стандартная блочная модель отвечает на основной вопрос:
Сколько же в итоге места будет занимать элемент?
Ответ следующий:
Область, занимаемая блочным элементом, складывается из его ширины и высоты содержания, внутренних и внешних отступов, ширины рамок .
Для строчных элементов есть свои особенности, которые мы опишем позже.
Схема блочной модели:

- ширина/высота содержания — свойства
widthиheight(синий прямоугольник на схеме); - внутренние отступы — свойство
padding; - рамки — свойство
border; - внешние отступы — свойство
margin.
Строчные элементы
Строчные элементы располагаются друг за другом в одной строке, при необходимости строка переносится. Особенности строчных элементов:
- До и после строчного элемента отсутствуют переносы строки.
- Ширина и высота строчного элемента зависит только от его содержания, задать размеры с помощью CSS нельзя.
- Можно задавать только горизонтальные отступы.
К строчным элементам относятся такие теги как:<a>,<strong>,<em>,<span>и так далее.
Строчные элементы предназначены для оформления текста на уровне небольших фраз и отдельных слов. Блочные же элементы предназначены для разметки крупных блоков текста (заголовки, абзацы, списки) и создания сетки.
display: table
Дальнейшие несколько заданий будут посвящены табличным типам элементов.
Табличные сетки были очень популярны на заре веба. Действительно, у табличных сеток есть преимущества, которые очень сложно получить с помощью блоков. Например, столбцы одинаковой высоты.
Однако, семантически таблицы не предназначены для разметки сеток и постепенно от них отказались. Но память об их удобстве жила.
Позднее было разработано семейство значений свойстваdisplay, которое позволяет задать табличное поведение любым элементам.
Первое значение —display:tableзадает элементу типтаблица. Особенности табличных элементов:
- можно задавать ширину, высоту, рамки, отступы;
- по умолчанию ширина зависит от содержания;
- переносы строки до и после элемента.
Табличные элементы похожи на блочные за исключением ширины по умолчанию.
display: table-row
Как вы догадались, мы строим таблицу на дивах с помощью новых значений свойстваdisplay. Знания про таблицы вы можете освежить в курсеЗнакомство с таблицами.
Любая таблица содержит элементыстрока таблицы, внутри которых должны содержаться элементыячейка таблицы. Соответствие тегов таблицы значениямdisplay:
<table> —display:table;
<tr> —display:table-row;
<td> —display:table-cell;
В этом задании вы создадите строки таблицы с помощьюdisplay:table-row;. Строка — необычный элемент. Она является контейнером для ячеек и практически не имеет собственного отображения. Для нее можно только задавать цвет фона.
display: table-cell[21/23]
С помощью значенияtable-cellсвойстваdisplayможно задать элементу типячейка таблицы. Конечно, лучше чтобы элементы-ячейки находились внутри элементов-строк, которые находятся внутри элементов-таблиц.
Вы можете просто задать элементу типячейка таблицы, не добавляя вокруг него дополнительных элементов-строк и таблиц. В этом случае браузер создаст дополнительные анонимные элементы строки и таблицы. Неудобство заключается в том, что вы не сможете ими управлять.
К таблицам, созданным с помощью CSS, можно применять те же свойства, что и к обычным таблицам. Например, задавать отступы между ячейками или режим схлопывания границ.
- width
- height
- margin
- padding
- border
Width - это ширина содержимого!
Height - это высота содержимого! (Не стоит использовать % - не всегда работает так как задумывалось.)
Советы:
- Старайтесь не использовать одновременно width и height, если это не декоративный элемент с фиксированным размерами
- Старайтесь не задавать фиксированную высоту (опасность что внутренний контент выйдет за рамки)
- Если всё-таки нужна высота, то лучше использовать min-height
Padding - внутренний отступ. Если задавать в % - рассчитывается от размеров родительского элемента.
Margin - это внешний отступ.
Border - может показаться что это декоративное свойство, но оно влияет на размер элемента!
Расчёт полного размера элемента
- Общая ширина и высота элемента, это не то же самое, что и свойства width и height, а обычно больше.
- Но! это поведение можно изменить (box-sizing)
Тонкости блочной модели
- Схлопывание внешних отступов (margin)
- Выпадание внешних отступов (margin)
- Как расположить элемент по центру
- Ширина по умолчанию и 100%
- box-sizing
Схлопывание внешних отступов - только в вертикальном направлении - берется max-margin, а не сумма
Выпадание внешних отступов - в вертикальном направлении внешний отступ (margin) вложенного блока может выпадать из родительского и отталкивать оба блока.

Как бороться с выпаданием?
overflow: hidden- использовать с осторожностьюpadding-top: 1px- margin дочернего элемента не пробьется через родительский paddingborder-top: 1px solid transparent- аналогично верхнему примеру
Как расположить элемент по центру
- margin: auto - работает только в горизонтальном направлении (но для inline-block не работает), в вертикальном только при использовании flexbox
Ширина/высота по умолчанию или 100%
100% - это ширина/высота родительского блока, а не ширина/высота свободного пространства в родительском блоке!
Чтобы бороться с этим -box-sizing
По default используется content-box - когда width только размер контента, а border-box width это весь размер.
