Menu

Margin CSS: shorthand, margin auto e colapso de margens

Margin é o espaço transparente fora da borda de um elemento que afasta os outros elementos. Veja o shorthand margin, como centralizar com margin: 0 auto, margens negativas, margin auto no flexbox e por que as margens verticais colapsam.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

O que é margin

Margin é o espaço fora da borda de um elemento. Ela é sempre transparente, e o trabalho dela é afastar os outros elementos. No exemplo, o contêiner cinza aparece através da margin em volta da caixa azul:

A faixa cinza não faz parte da caixa: o fundo da própria caixa termina na borda dela. Para um espaço que leve o fundo do elemento, use padding.

O shorthand margin

margin recebe de um a quatro valores, na mesma ordem horária do padding:

DeclaraçãoTopoDireitaBaseEsquerda
margin: 10px;10101010
margin: 10px 20px;10201020
margin: 10px 20px 30px;10203020
margin: 10px 20px 30px 40px;10203040

Cada lado também tem a própria propriedade (margin-top, margin-right, margin-bottom, margin-left) e versões lógicas que seguem a direção do texto (margin-inline-start, margin-inline-end, margin-block, margin-inline).

Ao contrário do padding, a margin aceita auto e valores negativos:

ValorExemploObservações
Comprimento16px, 1.5remO mais comum
Porcentagem5%Da largura do bloco que o contém, nos quatro lados
automargin: 0 autoO navegador preenche o espaço que sobra
Negativomargin-top: -10pxAproxima o elemento ou o vizinho, pode sobrepor

Centralizar com margin: 0 auto

margin: 0 auto é o jeito clássico de centralizar um bloco na horizontal. auto nos dois lados diz ao navegador para dividir igualmente o espaço que sobra. É preciso uma largura menor que a do contêiner, senão não sobra nada para dividir:

Margens auto não centralizam na vertical no fluxo normal (margens auto verticais viram 0) e não fazem nada em elementos inline. Para uma visão completa de centralização, veja como centralizar uma div.

Colapso de margens

Quando duas margens verticais se tocam, elas não se somam. O navegador fica só com a maior. Aqui a primeira caixa tem margin-bottom: 30px e a segunda margin-top: 20px, e o espaço entre elas é 30px, não 50px:

O colapso é proposital: permite que parágrafos e títulos tenham cada um seu espaçamento sem dobrá-lo onde se encontram. Ele pega as pessoas de surpresa em um segundo caso, em que a margem de cima de um filho escapa do pai:

No primeiro pai, a margem de 30px do filho colapsou através da borda de cima do pai, então ela empurra o pai inteiro para baixo em vez de criar um espaço cinza dentro dele. Qualquer uma destas opções impede isso:

  • display: flow-root no pai (ao contrário de overflow: hidden, ele não corta nada).
  • Padding ou borda no lado de cima do pai.
  • Um pai flex ou grid: margens de itens flex e grid nunca colapsam.

Margens horizontais nunca colapsam, e as de elementos flutuantes ou com posição absoluta também não.

Margens negativas

Uma margin negativa puxa na direção oposta. No lado de cima ou no início, ela move o próprio elemento; no lado de baixo ou no fim, puxa o elemento seguinte para mais perto. As caixas podem se sobrepor:

margin auto no flexbox

Dentro de um contêiner flex, uma margin auto ocupa todo o espaço livre do lado dela. É o jeito mais simples de empurrar um item para a outra ponta de uma linha, e no flexbox o auto também funciona na vertical:

margin-inline-start: auto põe o espaço livre antes de "Log in", no fim da linha tanto em páginas da esquerda para a direita quanto da direita para a esquerda.

Erros comuns

  • margin: 0 auto em um elemento sem largura. Um bloco já ocupa o contêiner inteiro; defina width ou max-width.
  • margin: auto em um elemento inline. Margens auto em span, a ou em um img deixado inline valem 0. Use display: block.
  • Somar duas margens verticais e esperar o total. Elas colapsam para a maior; use gap em flex ou grid, ou uma única direção de margem de forma consistente.
  • A margem de um filho empurrando o pai. Isso é o colapso entre pai e filho; acrescente display: flow-root ao pai.
  • Usar margin para um espaço que deveria ter fundo. A margin é transparente; use padding.

Perguntas frequentes

O que é margin no CSS?

Margin é o espaço fora da borda de um elemento. Ela é transparente e afasta os elementos vizinhos. É definida com margin ou com as propriedades de cada lado, margin-top, margin-right, margin-bottom e margin-left.

O que margin: 0 auto faz?

Define as margens de topo e base como 0 e divide igualmente o espaço horizontal que sobra entre as margens esquerda e direita, o que centraliza um elemento de bloco na horizontal. O elemento precisa de uma largura menor que o contêiner, por exemplo max-width: 600px.

Por que margin auto não centraliza meu elemento?

Normalmente porque o elemento não tem largura (um bloco ocupa o contêiner inteiro, então não sobra nada para dividir) ou porque ele é inline (span, a, img por padrão), e aí as margens auto valem 0. Dê a ele uma largura e display: block, ou centralize pelo pai com flexbox ou grid.

O que é colapso de margens?

Quando duas margens verticais se encontram, por exemplo a margem de baixo de um parágrafo e a de cima do seguinte, o navegador usa só a maior em vez de somá-las. Isso acontece apenas com margens verticais de caixas de bloco no fluxo normal, não em layouts flex ou grid.

A margin pode ser negativa?

Sim. Uma margin negativa puxa o elemento para aquele lado, ou puxa o elemento seguinte por cima dele, então as caixas podem se sobrepor. É útil para pequenos ajustes de alinhamento e para deixar um elemento sair do padding do contêiner.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR