Margin и Padding — это два типа отступов в CSS, которые управляют пространством вокруг элементов. Margin создаёт внешний отступ (пространство снаружи элемента), а Padding — внутренний отступ (пространство внутри элемента между границей и содержимым).
Ключевые аспекты
Margin — внешний отступ, расстояние между элементом и соседними элементами
Padding — внутренний отступ, расстояние между границей элемента и его содержимым
Box Model — margin и padding являются частью блочной модели CSS
Схлопывание margin — вертикальные margin могут объединяться (margin collapsing)
Padding увеличивает размер — padding добавляется к ширине/высоте элемента (без box-sizing: border-box)
Плюсы и минусы
Свойство
Плюсы
Минусы
Margin
Создаёт пространство между элементами, может быть отрицательным
Схлопывание может запутать
Padding
Увеличивает кликабельную область, не схлопывается
Увеличивает общий размер элемента
Частые ошибки на собеседованиях
Путают, где применяется margin, а где padding
Забывают про схлопывание вертикальных margin
Не учитывают влияние padding на общий размер элемента
Не знают, что margin может быть отрицательным, а padding — нет
Забывают про box-sizing: border-box для предсказуемого поведения
Введение и проблематика
При создании веб-страниц одной из ключевых задач является правильное расположение элементов и управление пространством между ними. CSS предоставляет два основных инструмента для этого: margin (внешний отступ) и padding (внутренний отступ).
Понимание разницы между margin и padding — фундаментальный навык для любого веб-разработчика. Эти свойства являются частью CSS Box Model и влияют на то, как элементы занимают место на странице.
Почему это важно?
Правильное использование отступов делает интерфейс читаемым и эстетичным
Ошибки в отступах приводят к "поехавшей" вёрстке
Понимание Box Model необходимо для предсказуемого поведения элементов
Базовая теория
CSS Box Model
Каждый HTML-элемент представляется как прямоугольный блок, состоящий из нескольких слоёв:
Margin создаёт пустое пространство снаружи элемента, отталкивая соседние элементы.
css
/* Отступ со всех сторон */.element {margin:20px;}/* Отступы по отдельности */.element {margin-top:10px;margin-right:15px;margin-bottom:10px;margin-left:15px;}/* Сокращённая запись: верх, право, низ, лево */.element {margin:10px 15px 10px 15px;}/* Сокращённая запись: верх/низ, лево/право */.element {margin:10px 15px;}
Padding — внутренний отступ
Padding создаёт пространство внутри элемента между границей и содержимым.
css
/* Отступ со всех сторон */.element {padding:20px;}/* Отступы по отдельности */.element {padding-top:10px;padding-right:15px;padding-bottom:10px;padding-left:15px;}/* Сокращённая запись аналогична margin */.element {padding:10px 15px;}
Практические примеры
Визуальная разница
html
<style>.box-margin {background:#3498db;margin:20px;/* Отступ снаружи — фон НЕ распространяется */ }</style><divclass="box-margin">Контент</div>
Центрирование блока
css
/* Горизонтальное центрирование блока с фиксированной шириной */.centered-block {width:300px;margin:0 auto; /* auto слева и справа = центрирование */}
Увеличение кликабельной области
css
/* Padding увеличивает область клика для ссылок */.nav-link {display:inline-block;padding:10px 20px; /* Больше область для клика */text-decoration:none;}
Пограничные кейсы
Схлопывание margin (Margin Collapsing)
⚠️
Вертикальные margin соседних элементов могут "схлопываться" — объединяться в один отступ, равный большему из двух.
css
.block1 {margin-bottom:30px;}.block2 {margin-top:20px;}/* Результат: между блоками будет 30px, а НЕ 50px! */
Когда margin схлопывается:
Вертикальные margin соседних блочных элементов
Margin родителя и первого/последнего ребёнка
Margin пустого блока (top и bottom)
Когда НЕ схлопывается:
Горизонтальные margin
Элементы с float, position: absolute, display: flex/grid
Элементы с overflow отличным от visible
Отрицательный margin
css
/* Margin может быть отрицательным */.overlap {margin-top:-20px; /* Элемент "заедет" на предыдущий */}/* Padding НЕ может быть отрицательным! */.invalid {padding:-10px; /* Не работает! */}
Влияние на размер элемента
🚫
По умолчанию padding добавляется к width и height элемента!