Margin и Padding
margin— внешний отступ (расстояние между элементом и соседями),padding— внутренний отступ (расстояние между границей элемента и его контентом). Вместе сborderиbox-sizingони формируют блочную модель CSS.
Зачем нужно
Отступы создают пространство и «воздух» в макете. Правильная работа с margin и padding — основа компоновки: от простых межабзацных расстояний до центрирования блоков и управления ритмом страницы.
Где используется
- Расстояния между элементами
- Внутренние отступы карточек, кнопок, секций
- Центрирование блоков (
margin: 0 auto) - Вертикальный ритм (spacing system)
- Логические отступы для RTL-языков
Предпосылки
- Display — блочная vs строчная модель
- Что такое CSS — базовый синтаксис
Margin — внешний отступ
Синтаксис
/* Все стороны */
.box { margin: 20px; }
/* Вертикальные | Горизонтальные */
.box { margin: 20px 40px; }
/* Top | Горизонтальные | Bottom */
.box { margin: 10px 20px 30px; }
/* Top | Right | Bottom | Left */
.box { margin: 10px 20px 30px 40px; }
/* Отдельные стороны */
.box {
margin-top: 10px;
margin-right: 20px;
margin-bottom: 30px;
margin-left: 40px;
}
margin: auto — центрирование
/* Горизонтальное центрирование блочного элемента */
.centered {
width: 600px;
margin: 0 auto; /* Верх/низ = 0, лево/право = auto */
}
/* В Flexbox — auto margin выталкивает элемент */
.flex-container { display: flex; }
.push-right { margin-left: auto; } /* Прижать к правому краю */
/* Полное центрирование в Flexbox */
.flex-container { display: flex; }
.center { margin: auto; } /* Центр по обеим осям */
Схлопывание margin (Margin Collapsing)
Вертикальные margin соседних блочных элементов объединяются (берётся наибольший):
.para1 { margin-bottom: 30px; }
.para2 { margin-top: 20px; }
/* Расстояние между ними = 30px (НЕ 50px!) */
Когда margin схлопывается:
- Соседние блочные элементы (вертикально)
- Родитель и первый/последний потомок (если нет border, padding, overflow)
- Пустой элемент (margin-top + margin-bottom)
Когда НЕ схлопывается:
- Flex/Grid-потомки
- Float и absolute-элементы
- Элементы с
overflow!=visible display: inline-block- Горизонтальные margin
/* Предотвратить схлопывание с потомком */
.parent {
/* Любое из: */
overflow: hidden; /* или auto */
display: flow-root;
border-top: 1px solid transparent;
padding-top: 1px;
}
Отрицательный margin
/* Вытянуть элемент за пределы контейнера */
.full-width {
margin-left: -20px;
margin-right: -20px;
padding-left: 20px;
padding-right: 20px;
}
/* Наложение элементов */
.overlap {
margin-top: -30px; /* Наехать на предыдущий элемент */
}
Padding — внутренний отступ
Синтаксис
/* Все стороны */
.box { padding: 20px; }
/* Вертикальные | Горизонтальные */
.box { padding: 12px 24px; }
/* Top | Right | Bottom | Left */
.box { padding: 10px 20px 30px 40px; }
/* Отдельные стороны */
.box {
padding-top: 10px;
padding-right: 20px;
padding-bottom: 30px;
padding-left: 40px;
}
Padding не может быть отрицательным (в отличие от margin).
Взаимодействие с box-sizing
/* content-box (по умолчанию): padding добавляется к width */
.content-box {
box-sizing: content-box;
width: 200px;
padding: 20px;
/* Итоговая ширина = 200 + 20 + 20 = 240px */
}
/* border-box: padding включён в width */
.border-box {
box-sizing: border-box;
width: 200px;
padding: 20px;
/* Итоговая ширина = 200px (контент = 160px) */
}
/* Best practice: глобально border-box */
*, *::before, *::after {
box-sizing: border-box;
}
Логические свойства (Logical Properties)
Для поддержки разных направлений письма (LTR/RTL):
/* Физические → Логические */
.box {
/* margin */
margin-block-start: 10px; /* = margin-top (в LTR) */
margin-block-end: 20px; /* = margin-bottom */
margin-inline-start: 15px; /* = margin-left (в LTR) */
margin-inline-end: 25px; /* = margin-right */
/* Shorthand */
margin-block: 10px 20px; /* block-start block-end */
margin-inline: 15px 25px; /* inline-start inline-end */
/* padding */
padding-block: 12px 16px;
padding-inline: 20px;
}
| Физическое | Логическое | В LTR | В RTL |
|---|---|---|---|
margin-top |
margin-block-start |
Верх | Верх |
margin-bottom |
margin-block-end |
Низ | Низ |
margin-left |
margin-inline-start |
Лево | Право |
margin-right |
margin-inline-end |
Право | Лево |
Spacing System (система отступов)
:root {
--space-1: 0.25rem; /* 4px */
--space-2: 0.5rem; /* 8px */
--space-3: 0.75rem; /* 12px */
--space-4: 1rem; /* 16px */
--space-5: 1.5rem; /* 24px */
--space-6: 2rem; /* 32px */
--space-8: 3rem; /* 48px */
--space-10: 4rem; /* 64px */
}
.card {
padding: var(--space-5);
margin-bottom: var(--space-4);
}
section {
padding-block: var(--space-10);
}
Lobotomized Owl Selector (совиный селектор)
/* Автоматический отступ между потомками */
.stack > * + * {
margin-top: 1em;
}
/* Или через gap в Flex */
.stack {
display: flex;
flex-direction: column;
gap: 1rem; /* Лучшая альтернатива */
}
Частые ошибки
-
Не учитывают margin collapsing — расстояние не 50px, а 30px:
.a { margin-bottom: 30px; } .b { margin-top: 20px; } -
Padding увеличивает размер без
box-sizing: border-box:.box { width: 100%; padding: 20px; } /* Элемент шире 100%! */ -
Margin на inline-элементе — вертикальный margin игнорируется:
span { margin-top: 20px; } /* Не работает! */ -
margin: 0 autoбезwidth— центрирование не сработает на блочном элементе (занимает 100% ширины) -
Margin-top «протекает» из потомка в родителя — если у родителя нет padding/border/overflow
Практика
- Центрировать блок через
margin: 0 auto - Воспроизвести margin collapsing и устранить через
display: flow-root - Создать spacing system из CSS-переменных
- Использовать логические свойства
margin-block,padding-inline - Прижать элемент через
margin-left: autoв Flexbox - Применить отрицательный margin для full-bleed секции
Связанные темы
- Display — блочная модель
- Основы Flexbox — gap вместо margin
- Float и clear — margin и float-элементы