A propriedade CSS margin

Introdução

As propriedades para as margens, definem a dimensão de cada uma das quatro margens de um elemento HTML e são as listadas a seguir:

 margin-top.......define a margem superior;
 margin-right.....define a margem direita;
 margin-bottom....define a margem inferior;
 margin-left......define a margem esquerda;
 margin...........maneira abreviada para definir todas as 4 margens.

Valores válidos para as propriedades da margem

É válido declarar valores negativos para margem, com o objetivo de sobrepor elementos.

margin-top

HTML
<p>
  Uma margem superior de 2cm
</p>
CSS
p { margin-top: 2cm; }

A renderização do código acima é conforme mostrado a seguir:

Uma margem superior de 2cm

margin-right

HTML
<p>
  Uma margem direita igual a 80% nesta frase do parágrafo.
</p>
CSS
p { margin-right: 80%; }

A renderização do código acima é conforme mostrado a seguir:

Uma margem direita igual a 80% nesta frase do parágrafo.

margin-bottom

HTML
<p>
  Uma margem inferior de 30mm
</p>
CSS
.p { margin-bottom: 30mm; }

A renderização do código acima é conforme mostrado a seguir:

Uma margem inferior de 30mm

margin-left

HTML
<p>
  Uma margem esquerda de 5em
</p>
CSS
.p {margin-left: 5em;}

A renderização do código acima é conforme mostrado a seguir:

Uma margem esquerda de 5em

margin

A propriedade da margin é a maneira abreviada de se declarar as 4 margens. A ordem de declaração das margens é: superior, direita, inferior e esquerda.

Há quatro maneiras de se declarar abreviadamente as margens:

HTML
<p>
  Uma margem superior de 20px, uma margem direita de 40px,
  uma margem inferior de 80px e uma margem esquerda de 15px
</p>
CSS
.p {margin: 20px 40px 80px 15px;}

A renderização do código acima é conforme mostrado a seguir:

Uma margem superior de 20px, uma margem direita de 40px, uma margem inferior de 80px e uma margem esquerda de 15px

Sobreposição de margens verticais

É preciso que o autor entenda o algoritmo de cálculo das CSS para determinar a margem vertical resultante entre dois boxes. A margem resultante é obtida por sobreposição também conhecida como "collapsing margins" (sobreposição de margens)

Nota: Margens horizontais nunca se sobrepõem.

Observe a marcação HTML e as regras CSS para dois boxes

HTML
<div class="um">1</div>
<div class="um">2</div> 
CSS
div.um {
 width: 100%;
 background: lightblue;
 margin-bottom:40px;
 }
div.dois {
 width: 100%;
 background: lightcoral;
 margin-top:50px;
 } 
 

A soma da margem inferior do primeiro DIV com a margem superior do segundo DIV é: 40px + 50px = 90px. Contudo a margem vertical resultante entre os DIV não será 90px, pois as CSS, segundo a sobreposição de margens, consideram a margem resultante como sendo a maior entre as duas, ou seja, 50px.

Observe a seguir a renderização deste exemplo.

1
2

Margens negativas

A sobreposição de margens verticais, ou margem vertical resultante, quando uma delas ou ambas são negativas se dá conforme descrito a seguir:

Sobreposição de margens verticais com elemento-filho

Vamos examinar esta sobreposição com uso de um exemplo: Considere um container header para marcar o topo do site e dentro deste container um elemento h1 (seu primeiro filho) para marcar o logo ou o nome do site e a seguir outros elementos-filhos e a folha de estilos conforme mostrado a seguir:

HTML
<header>
  <h1>Nome do site</h1>
  <p>Descrição do site</p>
</header>
CSS
body { margin:0; }
header {
  /* padding-top:1px; */
  /* border-top: 1px solid; */
  /* float:left; */
  /* display:inline-block; */
  width:100%;
  height:150px;
  margin:0;
  background: beige;
}
h1 {
  margin:0;
  margin-top:30px;
  border:2px solid black;
}
p {
  margin:0;
  margin-top:10px;
  border:2px solid brown;
}

Notar que as margens dos elementos body e header foram zeradas pois a intenção do autor é que o topo do site (header) "cole" no topo da janela do navegador (body).

Mas isso não acontece, pois na renderização aparece um espaço (margem) entre o topo do site e o topo da janela do navegador conforme mostrado na Pen adiante.

Observe que foi definida uma margem superior de 30px para o elemento h1 (primeiro filho de header) e o espaço que aparece na renderização é de 30px. É como se a margem superior de h1 "transbordasse" para fora do container header.

Isso acontece porque a sobreposição de margens ocorre também com as margens verticais dos containeres e as margens superior do seu primeiro filho e inferior do seu último filho, ou seja, a margem superior resultante considera a margem superior do container e a margem superior do seu primeiro filho e isso ocorre de modo semelhante com a margem inferior do container para o qual é considerada a sobreposição com a margem inferior do seu último filho.

O critério para determinar a margem resultante nestes casos é o mesmo explicado anteriormente. Note que, no nosso exemplo, sendo 0 (zero) a margem superior do container, a margem superior resultante será a margem superior do elemento h1.

Confuso? Não se preocupe criei uma Pen para você editar, fazer experiências e constatar na prática como funciona esta sobreposiçao de margens, mas antes disso uma observação:

Para "corrigir" a sobreposição das margens no caso de container com elemento-filho existem alguns "hacks". Quatro deles foram comentados na folha de estilos. Descomente uma de cada vez, observe o resultado e use aquele que melhor se adapta ao seu caso. Como indicação geral o "hack" do padding-top: 1px ou padding-bottom: 1px resolve a contento a maioria dos casos.

Consulte e edite a Pen a seguir para consolidar seu aprendizado.

See the Pen Collapsing margins by Maujor (@Maujor) on CodePen.

Compartilhe essa matéria com seus amigos

logo twitter logo facebook logo linkedin logo reddit

Conheça os livros do Maujor®

Ir para a página de entrada nos sites dos livros.