Что именно нужно для «margin: 0 auto;» работать?

206

Я знаю, что настройка margin: 0 auto;элемента используется для его центрирования (слева направо). Тем не менее, я знаю, что элемент и его родительский элемент должны соответствовать определенным критериям для работы автоматического запаса, и я никогда не смогу понять магию правильно.

Поэтому мой вопрос прост: какие свойства CSS должны быть установлены для элемента и его родителя, margin: 0 auto;чтобы левее-правее центрировать дочерний элемент ?

Chowlett
источник
мне кажется, в IE это не работает должным образом ... поэтому мне тоже интересно.
mpen
5
@Mark: IE будет margin: 0 auto;корректно работать только в стандартном режиме, поэтому вам нужен тип документа (как если бы он не был нужен раньше).
BoltClock

Ответы:

292

С верхней части моей головы:

  1. Элемент должен быть на уровне блока, например, display: blockилиdisplay: table
  2. Элемент не должен плавать
  3. Элемент не должен иметь фиксированной или абсолютной позиции 1

Вне головы других людей:

  1. Элемент должен иметь значение widthне auto2

Обратите внимание, что все эти условия должны выполняться для элемента, центрированного для его работы.


1 Есть одно исключение: если ваш фиксированный или абсолютно позиционированный элемент имеет left: 0; right: 0, он будет центрироваться с автоматическими полями .

2 Технически, margin: 0 autoработает с автоматической шириной, но автоматическая ширина имеет приоритет над автоматическими полями, и в результате автоматические поля обнуляются, в результате чего создается впечатление, что они «не работают».

BoltClock
источник
7
Два ответа «От вершины моей головы»: o
Рассел Диас
4
добавить фиксированную ширину , и вы получили идеальный ответ
MeO
1
Черт! Все остальные ответили, пока я кодировал! С вершины моей головы также ...: O
Кайл
Я скучаю по ol startатрибуту (и это невозможно осуществить в Markdown) :(
BoltClock
1
@Triynko: Ни вопрос, ни мой ответ никогда не говорили о атрибутах представления HTML (вопрос даже не помечен [html]!), Поэтому я не уверен, что именно вы называете буллом. В любом случае, хотя каждый элемент, на который можно настроить таргетинг с помощью CSS, может иметь свойства CSS width и height, не все элементы HTML могут иметь соответствующие атрибуты представления, и причина этого заключается в том, что просто не имеет смысла иметь их в определенных HTML элементы.
BoltClock
19

С макушки головы, это нужно width. Вам необходимо указать ширину контейнера, который вы центрируете (не родительскую ширину).

Рассел Диас
источник
16
Все идет от наших голов!
BoltClock
8

Полное правило для CSS:

  1. ( display: blockИ widthне авто) ИЛИdisplay: table
  2. float: none
  3. position: relative
Лука С.
источник
3

Вне головы, если элемент не является блочным элементом - сделайте это так.

а затем дать ему ширину.

Barrie Reader
источник
2

Он также будет работать с display: table - полезное свойство display в этом случае, потому что не требует установки ширины. (Я знаю, что этому посту 5 лет, но он все еще актуален для прохожих;)

j1mm1nycr1cket
источник
2

От головы моей кошки, убедитесь, что divвы пытаетесь отцентрировать не установлен width: 100%.

Если это так, то правила, установленные для дочерних элементов div, будут иметь значение.

Сэм Малаек
источник
1

Пожалуйста, перейдите к этому быстрому примеру, я создал jsFiddle . Надеюсь, это легко понять. Вы можете использовать wrapperdiv с шириной сайта для выравнивания по центру. Причина, по которой вы должны указать, widthзаключается в том, что браузер знает, что вы не собираетесь использовать жидкую компоновку.

Подбородок
источник
1

Вот мое предложение:

First: 
      1. Add display: block or table
      2. Add position: relative
      3. Add width:(percentage also works fine)
Second: 
      if above trick not works then you have to add float:none;
Анирбан Бхуи
источник
0

Возможно, интересно, что вам не нужно указывать ширину для <button>элемента, чтобы он работал - просто убедитесь, что он имеет display:block: http://jsfiddle.net/muhuyttr/

qbolec
источник
-1

Для тех, кто только что задал этот вопрос и не может его исправить margin: 0 auto, вот что я обнаружил, вы можете найти полезным: tableэлемент без заданной ширины должен иметь display: tableи не display: block для того, margin: autoчтобы выполнять работу. Это может быть очевидным для некоторых, так как комбинация display: blockи widthзначение по умолчанию даст таблицу, которая будет расширена для заполнения ее контейнера, но если вы хотите, чтобы таблица приняла ее «естественную» ширину и была отцентрирована, вам нужноdisplay: table

Самсон
источник
Это не правда (Хотя, если вы просто дадите его, display: blockон не будет соответствовать условию 4 принятого ответа)
Квентин
@Quentin спасибо за советы. В моем случае я не хотел, чтобы таблица занимала горизонтальное пространство (что, казалось бы, устраняет всю дискуссию margin: 0 auto), и я также не мог указать ширину таблицы, поскольку ее содержимое может иметь разную ширину. В этом случае единственное решение, которое работает (то есть визуализирует таблицу обычным способом, но центрирует ее), это не правило ширины, display: tableиmargin: 0 auto
samson