O que exatamente é necessário para "margem: 0 auto;" trabalhar?

206

Eu sei que a configuração margin: 0 auto;de um elemento é usada para centralizá-lo (esquerda-direita). No entanto, eu sei que o elemento e seu pai devem atender a certos critérios para que a margem automática funcione, e eu nunca consigo acertar a mágica.

Portanto, minha pergunta é simples: quais propriedades CSS devem ser definidas em um elemento e em seu pai para margin: 0 auto;que o filho fique no centro esquerdo-direito?

Chowlett
fonte
isso nunca parece funcionar corretamente para mim no IE ... então estou curioso sobre isso também.
MPEN
5
@ Mark: O IE manipulará margin: 0 auto;corretamente apenas no modo de padrões, assim você precisa de um doctype (como se não fosse necessário antes).
BoltClock

Respostas:

292

Em cima da minha cabeça:

  1. O elemento deve ser no nível do bloco, por exemplo, display: blockoudisplay: table
  2. O elemento não deve flutuar
  3. O elemento não deve ter uma posição fixa ou absoluta 1

Em cima da cabeça de outras pessoas:

  1. O elemento deve ter um widthque não seja auto2

Observe que todas essas condições devem ser verdadeiras se o elemento estiver centralizado para que ele funcione.


1 Há uma exceção a isso: se seu elemento fixo ou absolutamente posicionado tiver left: 0; right: 0, ele será centralizado com margens automáticas .

2 Tecnicamente, margin: 0 autofunciona com uma largura automática, mas a largura automática tem precedência sobre as margens automáticas, e as margens automáticas são zeradas como resultado, fazendo parecer que elas "não funcionam".

BoltClock
fonte
7
Duas respostas 'Fora do topo da minha cabeça': o
Russell Dias
4
adicione a largura fixa e você tem a resposta perfeita
meo
1
Droga! Todo mundo respondeu enquanto eu estava codificando! Em cima da minha cabeça também ...: O
Kyle
Sinto falta do ol startatributo (e não é possível obter no Markdown) :(
BoltClock
1
@Triynko: Nem a pergunta nem a minha resposta disseram nada sobre os atributos de apresentação em HTML (a pergunta nem é marcada com [html]!), Então não tenho certeza do que exatamente você está chamando. De qualquer forma, embora todo elemento que possa ser direcionado com CSS possa ter as propriedades de largura e altura do CSS, nem todos os elementos HTML podem ter os atributos de apresentação correspondentes, e a razão para isso é simplesmente porque não faz sentido tê-los em determinadas Elementos HTML.
BoltClock
19

Do alto da minha cabeça, ele precisa de um width. Você precisa especificar a largura do contêiner que você está centralizando (não a largura pai).

Russell Dias
fonte
16
Tudo está saindo do topo de nossas cabeças!
BoltClock
8

Regra completa para CSS:

  1. ( display: blockE widthnão automático) OUdisplay: table
  2. float: none
  3. position: relative
Luca C.
fonte
3

Em cima da minha cabeça, se o elemento não é um elemento de bloco - faça isso.

e depois dê uma largura.

Barrie Reader
fonte
2

Também funcionará com display: table - uma propriedade útil de exibição nesse caso, porque não requer que uma largura seja definida. (Eu sei que este post tem 5 anos, mas ainda é relevante para os transeuntes;)

j1mm1nycr1cket
fonte
2

Em cima da cabeça do meu gato, verifique se o que divvocê está tentando centralizar não está definido width: 100%.

Se for, as regras definidas nos divs filhos são o que importará.

Sam Malayek
fonte
1

Por favor, vá para este exemplo rápido que eu criei o jsFiddle . Espero que seja fácil de entender. Você pode usar uma wrapperdiv com a largura do site para alinhar ao centro. O motivo que você deve colocar widthé que, para que o navegador saiba que você não está optando por um layout líquido.

Queixo
fonte
1

Aqui está a minha sugestão:

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;
Anirban Bhui
fonte
0

Talvez seja interessante que você não precise especificar a largura de um <button>elemento para fazê-lo funcionar - apenas verifique se ele possui display:block: http://jsfiddle.net/muhuyttr/

qbolec
fonte
-1

Para alguém que acabou de responder a essa pergunta e não conseguiu consertar margin: 0 auto, eis uma coisa que descobri que pode ser útil: um tableelemento sem largura especificada deve ter display: tablee não display: block para margin: autopoder funcionar. Isso pode ser óbvio para alguns, pois a combinação de display: blocke o widthvalor padrão fornecerá uma tabela que se expande para preencher seu contêiner, mas se você deseja que a tabela pegue a largura "natural" e seja centralizada, será necessáriodisplay: table

Sansão
fonte
Isso não é verdade. (Embora se você apenas der, display: blockele não atenderá à condição 4 da resposta aceita)
Quentin
@ Quentin obrigado pela atenção. No meu caso, não queria que a tabela preenchesse o espaço horizontal (o que parece impedir toda a discussão margin: 0 auto) e também não pude especificar a largura da tabela, pois seu conteúdo poderia ter larguras diferentes. Nesse caso, a única solução que funciona (ou seja, processa a tabela da maneira normal, mas centraliza) não é regra de largura, display: tableemargin: 0 auto
samson