margin
Свойство определяет самую наружную часть модели коробки, создавая пространство вокруг элемента, вне каких - либо определенных границ.
Поля задаются с использованием длины, процентов или ключевого слова auto
и могут иметь отрицательные значения. Вот пример:
.box ( margin: 0 3em 0 3em; )
margin
является сокращенным свойством и принимает до четырех значений, показанных здесь:
.box ( margin: || || || )
Если установлено менее четырех значений, предполагается, что отсутствующие значения основаны на тех, которые определены. Например, следующие два набора правил дадут одинаковые результаты:
.box ( margin: 0 1.5em; ) .box ( margin: 0 1.5em 0 1.5em; )
Таким образом, если определено только одно значение, для всех четырех полей будет установлено одно и то же значение. Если заявлено три значения, то это так margin: (top) (left-and-right) (bottom);
.
Любое из отдельных полей может быть объявлено от руки, и в этом случае вы должны определить только одно значение для каждого свойства:
.box ( margin-top: 20px; margin-right: 10px; margin-bottom: 20px; margin-left: 10px; )
auto
и центрирование
Каждое из свойств поля также может принимать значение auto
. Значение auto
обычно указывает браузеру определить маржу за вас. В большинстве случаев значение auto
будет эквивалентно значению 0
(которое является начальным значением для каждого свойства поля) или любому пространству, доступному на этой стороне элемента. Однако auto
это удобно для горизонтального центрирования:
.container ( width: 980px; margin: 0 auto; )
В этом примере для центрирования этого элемента по горизонтали в пределах доступного пространства выполняются две вещи:
- Элементу придается заданная ширина
- Левое и правое поля установлены на
auto
Без указанной ширины auto
значения практически не имели бы никакого эффекта, устанавливая для левого и правого полей значение 0
или другое доступное пространство внутри родительского элемента.
Следует также отметить, что auto
это полезно только для горизонтального центрирования, поэтому использование auto
верхнего и нижнего полей не будет центрировать элемент по вертикали, что может сбить с толку новичков.
Свертывающиеся поля
Вертикальные поля на различных элементах, которые соприкасаются друг с другом (таким образом, не имеют содержимого, отступов или границ, разделяющих их), сжимаются, образуя одно поле, равное большему из смежных полей. Этого не происходит с горизонтальными полями (слева и справа), только с вертикальными (сверху и снизу).
Для иллюстрации возьмите следующий HTML:
Collapsing Margins
Example text.
И следующий CSS:
h2 ( margin: 0 0 20px 0; ) p ( margin: 10px 0 0 0; )
В этом примере h2
элемент имеет нижнее поле 20 пикселей. Элемент абзаца, который следует сразу за ним в источнике, имеет верхнее поле, равное 10 пикселям.
Здравый смысл подсказывает, что толщина вертикального поля между h2
абзацем и абзацем будет в общей сложности 30 пикселей (20 пикселей + 10 пикселей). Но из-за схлопывания полей фактическая толщина составляет 20 пикселей. Это показано на встроенной ручке ниже:
Посмотрите на эту ручку!
Хотя сворачивание полей может показаться на первый взгляд не интуитивным, на самом деле они полезны по нескольким причинам. Во-первых, они предотвращают добавление пустыми элементами дополнительных, обычно нежелательных вертикальных полей.
Во-вторых, они позволяют применять более последовательный подход к объявлению универсальных полей для элементов страницы. Например, заголовки обычно имеют вертикальные поля, как и абзацы. Если поля не сжимались, заголовки, следующие за абзацами (или наоборот), часто требовали сброса полей на одном из элементов, чтобы добиться постоянного расстояния по вертикали.
В-третьих, сворачивание полей также применяется к вложенным элементам. Посмотрите на следующую ручку:
Посмотрите на эту ручку!
Здесь элемент абзаца имеет верхнее поле, установленное на div
30 пикселей, и вложено внутри элемента с верхним полем в 40 пикселей. Кроме того, у h2
элемента есть нижнее поле 20 пикселей.
Опять же, здравый смысл подсказывает, что общее пространство вертикальных полей здесь будет составлять 90 пикселей (20 пикселей + 40 пикселей + 30 пикселей), но вместо этого все поля сворачиваются в одно поле в 40 пикселей (самое высокое из трех). Это полезно в большинстве случаев, поскольку нет необходимости переопределять какое-либо из верхних полей, чтобы удалить лишнее вертикальное пространство.
Отрицательная маржа
Как вы могли догадаться, в то время как положительное значение поля отталкивает другие элементы, отрицательное поле будет либо тянуть сам элемент в этом направлении, либо притягивать к нему другие элементы.
Вот пример контейнера с заполнением, а заголовок h2 имеет отрицательные поля, тянущиеся через это заполнение обратно к краям:
См. «
Наиболее распространенный пример использования отрицательных полей» Криса Койера (@chriscoyier)
на CodePen.
Вот пример, когда первый абзац имеет отрицательное нижнее поле, которое подтягивает следующий абзац.
См.
Нижний абзац Pen Negative Margin от Криса Койера (@chriscoyier)
на CodePen.
Поддержка браузера
Хром | Сафари | Fire Fox | Опера | IE | Android | iOS |
---|---|---|---|---|---|---|
Работает | Работает | Работает | Работает | Работает | Работает | Работает |
IE6 подвержен ошибке с удвоенным значением поля с плавающей запятой, которую в большинстве случаев можно решить путем добавления display: inline
к плавающему элементу.