DevSkillRoad

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

📦 width, height, padding, margin, border, outline, box-sizing

Каждый элемент на странице — это прямоугольник. Блочная модель описывает, из каких частей он состоит и как эти части влияют на размер и расположение.

Схема блочной модели:

margin (внешний отступ)
border (граница)
padding (внутренний отступ)
content
(содержимое)

Схематичное представление блочной модели

1. Ширина и высота — width, height

Задают ширину и высоту элемента. Как именно они работают, зависит от свойства box-sizing (см. раздел 6).

По умолчанию (content-box) width задаёт только ширину содержимого. padding и border добавляются сверху.

При border-box width включает в себя padding и border.

Возможные значения:

.box {
    width: 200px;
    height: 100px;
}
200×100

2. Внутренние отступы — padding

Расстояние от границы содержимого до границы элемента. Увеличивает видимый размер элемента. Фон и граница распространяются на область padding.

Возможные значения: пиксели, em, rem, проценты.

.no-padding {
    background: #f0f0f0;
}
.with-padding {
    background: #f0f0f0;
    padding: 20px;
}
Без padding (текст прилип к краю)
С padding: 20px (текст отодвинут от края)
📌 Можно задавать отступы для каждой стороны отдельно:
  • padding-top — сверху
  • padding-right — справа
  • padding-bottom — снизу
  • padding-left — слева
Сокращённая запись: padding: 10px 20px 30px 40px; (верх, право, низ, лево)

3. Внешние отступы — margin

Расстояние от границы элемента до соседних элементов. Не увеличивает видимый размер элемента, но влияет на расположение. Фон и граница не распространяются на margin.

Возможные значения: пиксели, em, rem, auto (центрирование), проценты.

Пример: разница между padding и margin наглядно

.parent {
    background: #f0f0f0;
}
.child-padding {
    background: #530899;
    padding: 20px;
}
.child-margin {
    background: #14b8a6;
    margin: 20px;
}
padding: 20px
(фон и граница внутри, элемент увеличился)
margin: 20px
(отступ снаружи, между элементами появилось расстояние)
Этот блок показывает, где заканчивается внешний отступ
📌 Margin collapse (схлопывание): если у двух соседних элементов задан нижний и верхний отступы, браузер выберет больший из них, а не сложит. Это особенность блочной модели.

4. Границы — border

Линия вокруг элемента. Требует три параметра: толщину, стиль и цвет.

Возможные значения стилей границ:

.solid {
    border: 2px solid #530899;
}
.dashed {
    border: 2px dashed #14b8a6;
}
.dotted {
    border: 2px dotted #ffc107;
}
solid — сплошная линия
dashed — штриховая линия
dotted — точечная линия

5. outline — обводка (не влияет на размер)

Похожа на border, но не увеличивает размер элемента и не влияет на расположение соседей. Часто используется для подсветки активных элементов (например, при фокусе на поле ввода).

.outline-example:focus {
    outline: 3px solid #14b8a6;
}

✅ Обводка не сдвигает соседние элементы

📌 Отличие от border: border увеличивает размер элемента. outline рисуется поверх и не меняет раскладку.

6. Разница между padding и margin

padding margin
Внутренний отступ (внутри элемента) Внешний отступ (снаружи элемента)
Увеличивает видимый размер элемента Не увеличивает видимый размер
Фон и граница распространяются на padding Фон и граница не затрагивают margin

7. box-sizing — как считаются размеры

Свойство box-sizing определяет, включаются ли padding и border в ширину и высоту.

Возможные значения:

.content-box {
    box-sizing: content-box;
    width: 200px;
    padding: 20px;
    border: 2px solid #530899;
    /* реальная ширина: 200 + 40 + 4 = 244px */
}
.border-box {
    box-sizing: border-box;
    width: 200px;
    padding: 20px;
    border: 2px solid #530899;
    /* реальная ширина: 200px */
}
content-box
width: 200px
реальная ширина: ~244px
border-box
width: 200px
реальная ширина: 200px
📌 Совет: Многие разработчики используют глобальное правило * { box-sizing: border-box; }, чтобы все элементы считали размеры предсказуемо.

8. display — как элемент ведёт себя на странице

В HTML у каждого элемента есть тип по умолчанию: блочный (<div>, <p>) или строчный (<span>, <a>). Свойство display позволяет изменить это поведение.

Возможные значения:

inline-block — когда нужен

Представьте меню из кнопок, которые должны стоять в строку, но иметь фиксированную ширину и отступы. Без display: inline-block пришлось бы использовать Flexbox или обходить костылями.

.menu-item {
    display: inline-block;
    width: 120px;
    padding: 10px;
    text-align: center;
}
Главная
О нас
Контакты

✅ Элементы в строке, но имеют фиксированную ширину

none — полное удаление элемента

В отличие от visibility: hidden, который скрывает элемент, но оставляет место, display: none полностью убирает элемент из потока.

.hidden {
    display: none;
}
Текст перед
display: none (не виден и места нет)
Текст после

Текст перед
visibility: hidden (не виден, но место есть)
Текст после

display: none — элемент и его место исчезают. visibility: hidden — элемент не виден, но место остаётся.

📌 Когда менять display:
  • Сделать меню из блоков в строку — display: inline-block
  • Временно скрыть элемент, чтобы он не занимал место — display: none
  • Скрыть элемент, но сохранить место — visibility: hidden
  • Создать гибкую раскладку — display: flex или display: grid
📓 Из тетради: «Блочная модель — это фундамент вёрстки. Поймите разницу между padding и margin, научитесь считать реальные размеры. Всегда используйте box-sizing: border-box — он избавит от неожиданных расползаний верстки. А свойство display позволяет менять правила игры: превращать строчный элемент в блочный, скрывать блоки или создавать гибкие сетки».