Menu

Margin в CSS: сокращенная запись, margin auto и схлопывание

Margin это прозрачное пространство за рамкой элемента, которое отталкивает другие элементы. Разберем сокращенную запись margin, центрирование через margin: 0 auto, отрицательные отступы, margin auto во flexbox и почему вертикальные отступы схлопываются.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Что такое margin

Margin это пространство снаружи от рамки элемента. Он всегда прозрачный, и его задача отталкивать другие элементы. В примере серый контейнер просвечивает сквозь margin вокруг синего блока:

Серая полоса не часть блока: собственный фон блока заканчивается на его рамке. Для пространства с фоном элемента используйте padding.

Сокращенная запись margin

margin принимает от одного до четырех значений, в том же порядке по часовой стрелке, что и padding:

ОбъявлениеВерхПравоНизЛево
margin: 10px;10101010
margin: 10px 20px;10201020
margin: 10px 20px 30px;10203020
margin: 10px 20px 30px 40px;10203040

У каждой стороны есть и свое свойство (margin-top, margin-right, margin-bottom, margin-left), и логические версии, которые следуют направлению текста (margin-inline-start, margin-inline-end, margin-block, margin-inline).

В отличие от padding, margin принимает auto и отрицательные значения:

ЗначениеПримерПримечание
Длина16px, 1.5remСамый частый вариант
Проценты5%От ширины содержащего блока, для всех четырех сторон
automargin: 0 autoБраузер заполняет оставшееся пространство
Отрицательноеmargin-top: -10pxПриближает элемент или соседа, возможно перекрытие

Центрирование через margin: 0 auto

margin: 0 auto это классический способ центрировать блок по горизонтали. auto с обеих сторон говорит браузеру поделить оставшееся пространство поровну. Нужна ширина меньше контейнера, иначе делить нечего:

Auto-отступы не центрируют по вертикали в обычном потоке (вертикальные auto становятся 0) и не действуют на строчные элементы. Полный обзор центрирования есть на странице как выровнять div по центру.

Схлопывание margin

Когда два вертикальных отступа соприкасаются, они не складываются. Браузер оставляет только больший. Здесь у первого блока margin-bottom: 30px, у второго margin-top: 20px, и промежуток между ними 30px, а не 50px:

Схлопывание сделано намеренно: абзацы и заголовки могут нести свои отступы, не удваивая их на стыке. Но оно подводит во втором случае, когда верхний отступ дочернего элемента выходит за пределы родителя:

В первом родителе отступ дочернего элемента 30px схлопнулся через верхний край родителя, поэтому он сдвигает вниз весь родитель, а не создает серое пространство внутри. Остановить это можно любым из способов:

  • display: flow-root у родителя (в отличие от overflow: hidden, он ничего не обрезает).
  • Padding или border у верхнего края родителя.
  • Родитель flex или grid: отступы flex- и grid-элементов никогда не схлопываются.

Горизонтальные отступы никогда не схлопываются, как и отступы плавающих и абсолютно позиционированных элементов.

Отрицательный margin

Отрицательный margin тянет в обратную сторону. Сверху или в начале он сдвигает сам элемент; снизу или в конце подтягивает следующий элемент. Блоки могут перекрываться:

margin auto во flexbox

Внутри flex-контейнера auto-отступ забирает все свободное пространство со своей стороны. Это самый простой способ отодвинуть один элемент в дальний конец строки, и во flexbox auto работает и по вертикали:

margin-inline-start: auto ставит свободное пространство перед «Log in», в конце строки и на страницах слева направо, и справа налево.

Частые ошибки

  • margin: 0 auto у элемента без ширины. Блок и так заполняет контейнер; задайте width или max-width.
  • margin: auto у строчного элемента. Auto-отступы у span, a или строчного img равны 0. Сделайте его display: block.
  • Два вертикальных отступа и ожидание их суммы. Они схлопываются до большего; используйте gap во flex или grid или последовательно один направленный отступ.
  • Отступ дочернего элемента сдвигает родителя. Это схлопывание родителя и потомка; добавьте родителю display: flow-root.
  • Margin там, где нужен фон. Margin прозрачен; используйте padding.

Часто задаваемые вопросы

Что такое margin в CSS?

Margin это пространство снаружи от рамки элемента. Оно прозрачное и отталкивает соседние элементы. Задается свойством margin или свойствами отдельных сторон margin-top, margin-right, margin-bottom и margin-left.

Что делает margin: 0 auto?

Задает верхний и нижний отступы равными 0 и делит оставшееся горизонтальное пространство поровну между левым и правым отступом, что центрирует блочный элемент по горизонтали. Элементу нужна ширина меньше контейнера, например max-width: 600px.

Почему margin auto не центрирует элемент?

Обычно потому, что у элемента нет ширины (блок заполняет контейнер, и делить нечего), или потому, что он строчный (span, a, img по умолчанию), а у строчных auto-отступы равны 0. Задайте ширину и display: block или центрируйте из родителя через flexbox или grid.

Что такое схлопывание margin?

Когда два вертикальных отступа встречаются, например нижний отступ одного абзаца и верхний следующего, браузер берет только больший из них, а не складывает их. Это происходит только с вертикальными отступами блочных элементов в обычном потоке, но не во flex и grid.

Может ли margin быть отрицательным?

Да. Отрицательный margin тянет элемент в сторону этой стороны или подтягивает на него следующий элемент, поэтому блоки могут перекрываться. Это полезно для небольших поправок выравнивания и чтобы элемент мог выйти за padding своего контейнера.

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ