Menu

Box model CSS: conteúdo, padding, borda e margin

Todo elemento é uma caixa com quatro camadas: conteúdo, padding, borda e margin. Veja como cada camada soma no tamanho, como box-sizing: border-box muda a conta e cada camada medida ao vivo.

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

As quatro camadas de toda caixa

Todo elemento da página é desenhado como um retângulo com quatro camadas, de dentro para fora:

  1. Conteúdo: o texto, a imagem ou os elementos filhos, dimensionados por width e height.
  2. Padding: espaço dentro da caixa, entre o conteúdo e a borda. Ele mostra o fundo do elemento.
  3. Borda: a linha em volta do padding.
  4. Margin: espaço fora da borda que afasta as outras caixas. Sempre transparente.

No exemplo, cada camada tem sua cor: conteúdo azul, padding verde, uma borda escura e, em volta da caixa, uma área âmbar que é a margin (desenhada por um invólucro, já que a margin em si é transparente).

A linha embaixo da caixa é medida pelo navegador: 160 + 20 + 20 + 10 + 10 = 220px. A margin acrescenta mais 24px de cada lado, mas fica fora da caixa, então não entra nos 220.

A conta da largura: content-box vs border-box

Por padrão (box-sizing: content-box), width define só o conteúdo. Padding e borda são somados por cima, e a caixa acaba mais larga que o número que você escreveu. Com box-sizing: border-box, width é a caixa inteira, e o conteúdo encolhe para dar lugar ao padding e à borda.

content-box (padrão)border-box
width significaO conteúdoConteúdo + padding + borda
width: 200px; padding: 20px; border: 5px250px de largura200px de largura
Área de conteúdo nesse caso200px150px
MarginFora, não contaFora, não conta

O reset com border-box

Como o border-box faz os tamanhos somarem certo, quase toda folha de estilo moderna começa com esta regra:

*,
*::before,
*::after {
  box-sizing: border-box;
}

Ela faz mais diferença com porcentagens. Duas colunas width: 50% com padding não cabem em uma linha com content-box, porque cada uma tem 50% mais o padding:

(Os comentários HTML removem o espaço entre as colunas inline-block, que senão acrescentaria alguns pixels.)

Ver o box model no DevTools

Todo navegador desenha o box model para você. Clique com o botão direito em um elemento, escolha Inspecionar e abra a aba Computed (Layout no Firefox): um diagrama mostra o tamanho do conteúdo no meio, cercado pelos valores de padding, borda e margin. Passar o mouse sobre um elemento no painel Elements também colore a página: conteúdo em azul, padding em verde, margin em laranja.

Caixas inline seguem outras regras

O box model acima descreve caixas de bloco como <div> e <p>. Elementos inline como <span>, <a> e <strong> ficam dentro de uma linha de texto e tratam o espaço vertical de outro jeito:

PropriedadeEm um elemento inline
width, heightIgnoradas
Padding, borda e margin horizontaisAplicados, e empurram os vizinhos para os lados
Padding e borda verticaisDesenhados, mas não empurram as linhas de cima e de baixo
Margin verticalIgnorada

display: inline-block dá a um elemento dentro da linha o box model completo: largura, altura, padding e margin ocupam espaço. Veja padding CSS e margin CSS para cada camada em detalhe.

Erros comuns

  • Pôr padding em uma caixa de largura fixa e estranhar que ela cresceu. Com content-box, padding e borda são somados ao width. Use border-box.
  • Esperar que a margin pegue a cor de fundo. A margin é sempre transparente; use padding para um espaço colorido.
  • Definir height ou margin vertical em um elemento inline. Nada acontece; use display: inline-block ou block.
  • Esquecer as bordas na conta. Uma borda de 1px em um elemento width: 100% o deixa 2px mais largo com content-box, o que pode criar uma barra de rolagem horizontal.
  • Confundir margin e padding. Resumindo: o padding fica dentro da borda, a margin fora. A página margin vs padding coloca os dois lado a lado.

Perguntas frequentes

O que é o box model do CSS?

É a regra de que todo elemento é desenhado como uma caixa retangular com quatro camadas: o conteúdo, o padding em volta dele, a borda em volta do padding e a margin por fora da borda. Largura, altura e espaçamento no CSS são todos definidos nessas camadas.

O que box-sizing: border-box faz?

Faz width e height incluírem o padding e a borda. Uma caixa com width: 200px, padding: 20px e borda de 5px passa a ter exatamente 200px de largura, e a área de conteúdo encolhe para 150px para caber. O padrão, content-box, soma o padding e a borda por cima, dando 250px.

Como calcular a largura total de um elemento?

Com o content-box padrão: width + padding esquerdo e direito + borda esquerda e direita. Com border-box: só o width. A margin fica fora da caixa nos dois casos, então ela soma no espaço que o elemento ocupa, não na largura dele.

A margin faz parte do box model?

Sim, é a camada mais externa, mas é sempre transparente e nunca entra na largura nem no fundo do próprio elemento. Ela só afasta as caixas vizinhas.

Devo usar box-sizing: border-box em tudo?

A maioria dos projetos usa, com *, *::before, *::after { box-sizing: border-box; } no topo da folha de estilo. Isso faz larguras em porcentagem e padding somarem do jeito que as pessoas esperam, e frameworks como Bootstrap e Tailwind trazem o mesmo reset.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR