Что такое margin
Margin это пространство снаружи от рамки элемента. Он всегда прозрачный, и его задача отталкивать другие элементы. В примере серый контейнер просвечивает сквозь margin вокруг синего блока:
Серая полоса не часть блока: собственный фон блока заканчивается на его рамке. Для пространства с фоном элемента используйте padding.
Сокращенная запись margin
margin принимает от одного до четырех значений, в том же порядке по часовой стрелке, что и padding:
| Объявление | Верх | Право | Низ | Лево |
|---|---|---|---|---|
margin: 10px; | 10 | 10 | 10 | 10 |
margin: 10px 20px; | 10 | 20 | 10 | 20 |
margin: 10px 20px 30px; | 10 | 20 | 30 | 20 |
margin: 10px 20px 30px 40px; | 10 | 20 | 30 | 40 |
У каждой стороны есть и свое свойство (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% | От ширины содержащего блока, для всех четырех сторон |
auto | margin: 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 своего контейнера.