Modelo de Caixa CSS

O Modelo de Caixa é a base do layout CSS. No mundo CSS, cada elemento HTML é tratado como uma "caixa" retangular composta por área de conteúdo, preenchimento, borda e margem.

Referência Rápida de Propriedades do Modelo de Caixa

Propriedade Valores Comuns Finalidade
width 300px, 50%, auto Largura da área de conteúdo
height 200px, auto Altura da área de conteúdo
padding 20px, 10px 20px, 10px 20px 15px 5px Espaçamento interno (conteúdo até borda)
border 2px solid #333 Borda (largura + estilo + cor)
margin 10px, 20px auto, 0 auto Espaçamento externo (elemento até outros elementos)
box-sizing content-box (padrão), border-box Escopo de cálculo largura/altura

Quatro Partes do Modelo de Caixa

De dentro para fora:

┌─────────────────────────────────────┐  ← Margem
│  ┌───────────────────────────────┐  │  ← Borda
│  │  ┌─────────────────────────┐  │  │  ← Preenchimento
│  │  │                         │  │  │
│  │  │     Área de Conteúdo    │  │  │
│  │  │                         │  │  │
│  │  └─────────────────────────┘  │  │
│  └───────────────────────────────┘  │
└─────────────────────────────────────┘

1. Área de Conteúdo

A área onde o conteúdo real reside, como texto e imagens. Largura e altura são controladas pelas propriedades width e height.

2. Preenchimento

O espaço entre a área de conteúdo e a borda, usado para criar espaço em branco entre conteúdo e borda.

Exemplo

HTML
<style>
.box {
  padding: 20px;  /* 20px em todos os lados */
  background: #fce4ec;
  border: 2px solid #e91e63;
}
</style>
<div class="box">Este elemento de caixa tem preenchimento criando 20px de espaço entre conteúdo e borda</div>
▶ Experimente

3. Borda

A linha de borda que envolve o preenchimento e a área de conteúdo.

Exemplo

HTML
<style>
.box {
  border: 2px solid #333;
  padding: 16px;
  background: #f9f9f9;
}
</style>
<div class="box">Este elemento de caixa tem uma borda envolvendo o lado de fora do preenchimento</div>
▶ Experimente

4. Margem

O espaço entre a borda e outros elementos, usado para controlar a distância entre elementos.

Exemplo

HTML
<style>
.box {
  margin: 10px;  /* 10px em todos os lados */
  background: #e8f5e9;
  border: 1px solid #66bb6a;
  padding: 10px;
}
</style>
<div class="box">Caixa 1 - tem margem de 10px</div>
<div class="box">Caixa 2 - 20px de distância da Caixa 1</div>
<div class="box">Caixa 3 - 20px de distância da Caixa 2</div>
▶ Experimente
💡 Nota: As margens superior e inferior de elementos de nível bloco "colapsam" (pegam o valor máximo em vez de somar). As margens esquerda e direita não colapsam.

Tamanho Real do Elemento

Esta é a parte mais confusa — a largura e altura de um elemento não equivalem às dimensões da área de conteúdo.

Por padrão (box-sizing: content-box):

Largura total do elemento = width + padding-left + padding-right + border-left + border-right
Altura total do elemento = height + padding-top + padding-bottom + border-top + border-bottom

Por exemplo:

Exemplo

HTML
<style>
.box {
  width: 200px;
  height: 100px;
  padding: 20px;
  border: 2px solid black;
  background: #e3f2fd;
  text-align: center;
  line-height: 1.5;
}
</style>
<div class="box">
  Área de conteúdo 200×100px<br>
  Renderização real 244×144px
</div>
▶ Experimente

O tamanho real de renderização desta caixa é:

Se você pensou que esta caixa era apenas 200×100, está errado! Muitos iniciantes tropeçam aqui.

Propriedade box-sizing

Para resolver o problema do "tamanho real maior que o definido", o CSS3 introduziu a propriedade box-sizing.

content-box (padrão)

width e height incluem apenas a área de conteúdo; preenchimento e borda não são incluídos. Este é o padrão e a fonte da "armadilha."

border-box

width e height incluem conteúdo + preenchimento + borda; borda e preenchimento não "expandem" o elemento:

Exemplo: Comparação content-box vs border-box

HTML
<style>
.container {
  display: flex;
  justify-content: space-around;
}
.box {
  width: 300px;
  height: 200px;
  border: 10px solid indianred;
}
.item {
  width: 100%;
  background: rgba(49, 115, 187, 0.3);
  border: solid #5B6DCD 10px;
  padding: 15px;
}
.s1 { box-sizing: content-box; }
.s2 { box-sizing: border-box; }
</style>
<div class="container">
  <div class="box">
    <h3>content-box (padrão)</h3>
    <div class="item s1">width: 100% + padding + border = transborda o pai</div>
  </div>
  <div class="box">
    <h3>border-box</h3>
    <div class="item s2">width: 100% inclui padding + border = encaixa perfeitamente</div>
  </div>
</div>
▶ Experimente
💡 Comparação: No modo content-box, elementos filhos transbordam o pai; no modo border-box, elementos filhos encaixam perfeitamente. É por isso que projetos modernos recomendam definir globalmente box-sizing: border-box.

Configuração Global de border-box

Muitos projetos definem isso globalmente em seu reset:

Exemplo

HTML
<style>
*, *::before, *::after {
  box-sizing: border-box;
}
</style>
<div class="box-demo">Caixa de demonstração</div>
▶ Experimente

Depurando o Modelo de Caixa

Use as ferramentas do desenvolvedor do navegador para inspecionar visualmente o modelo de caixa:

💡 Dica de depuração: Pressione F12 para abrir as Ferramentas do Desenvolvedor, depois na aba Computado do painel Elementos, você pode ver visualmente o conteúdo, preenchimento, borda e margem de cada elemento — esta é a maneira mais rápida de diagnosticar problemas de layout.

  1. Clique com o botão direito em um elemento na página, selecione "Inspecionar"
  2. Selecione o elemento no painel Elementos
  3. Mude para o painel Computado ou Layout
  4. Você verá um diagrama do modelo de caixa mostrando valores de conteúdo, preenchimento, borda e margem

Diferenças do Modelo de Caixa Entre Tipos de Elementos


❓ Perguntas Frequentes

Q Devo usar content-box ou border-box?
R A maioria dos projetos escolhe `border-box`. Com border-box, padding e borda não expandem as dimensões do elemento, tornando os cálculos de layout mais intuitivos. Muitos frameworks (Bootstrap, Tailwind) definem globalmente border-box. A menos que tenha necessidades especiais, não use o padrão content-box.
Q Como vejo o modelo de caixa no navegador?
R Pressione F12 para abrir as Ferramentas do Desenvolvedor, selecione um elemento no painel Elementos, e o painel Computado ou Estilos à direita mostrará a estrutura de quatro camadas do modelo de caixa (conteúdo/preenchimento/borda/margem). Esta é a maneira mais rápida de diagnosticar problemas de layout — fortemente recomendado fazer disso um hábito.
Q Tanto margin quanto padding criam espaçamento — quando devo usar qual?
R Lembre-se de um princípio: a cor de fundo deve cobrir esta área? Com padding, o fundo cobre; com margem, não cobre. Simplesmente: espaçamento dentro de um elemento usa padding; espaçamento entre elementos usa margem.

📖 Resumo

📝 Exercícios

Básico

  1. Crie uma caixa 200×200 com preenchimento de 30px e borda de 5px solid. Use as ferramentas do desenvolvedor do navegador para verificar as dimensões reais de renderização e verificar a fórmula do modelo de caixa.
  2. Copie a caixa acima, adicione box-sizing: border-box, observe mudanças no tamanho real, e compare com o exercício anterior.

Intermediário

  1. Crie uma página com duas caixas lado a lado, ajuste suas margens, e observe o fenômeno de "colapso de margem" (as margens superior/inferior de elementos de nível bloco pegam o máximo em vez de somar).
  2. Use border-box para criar um "layout de duas colunas com 50% de largura cada e 20px de espaço entre elas."

Desafio

  1. Crie um componente de card com:
    • Largura fixa de 300px
    • Preenchimento de 20px
    • Borda 1px solid #ddd
    • Border-radius 8px
    • Use border-box para garantir que a largura total seja sempre 300px
  2. Crie um layout de formulário usando cálculos do modelo de caixa para alinhar perfeitamente campos de entrada e botões.
100%