Contexto real
Chamado chegou — layout quebrado
Antes de abrir qualquer editor, leia o chamado. Em projetos reais, você precisa entender o problema antes de sair editando código.
"O site da nossa loja tá com o layout dos cards de produto todo desconfigurado. O card ultrapassa o container cinza. Preciso de um fix urgente pra amanhã de manhã. Não mexa na estrutura HTML, só no CSS — o back-end já subiu o template em produção."
Código inicial
O código que você recebeu
Abra a pasta exercicio/ no VS Code. Esses são os arquivos que estão no servidor.
Tente visualizar o problema no navegador antes de continuar.
<div class="container"> <div class="product-card"> <h2>Camiseta Básica</h2> <p class="price">R$ 49,90</p> <button>Comprar</button> </div> </div>
.container { width: 300px; background: #e8e8e8; border: 2px solid #ccc; padding: 0; } .product-card { width: 300px; /* igual ao container */ padding: 20px; /* ← problema aqui */ border: 3px solid #999; /* ← e aqui */ background: white; }
Investigação no DevTools
Abre o DevTools e investiga
Antes de qualquer fix, você precisa entender o que está acontecendo. DevTools é a ferramenta de diagnóstico de todo dev front-end.
- 1 No navegador com o arquivo aberto, pressione
F12(ou clique com botão direito → Inspecionar) - 2 Clique no ícone de cursor e selecione o elemento
.product-card - 3 Vá até a aba Computed ou role até o diagrama de Box Model no painel de estilos
- 4 Anote os valores de border, padding e content que aparecem no diagrama
- 5 Some tudo manualmente no papel antes de olhar a resposta abaixo
content-box), o padding e o border são somados depois da
largura declarada. Some tudo e veja qual é o tamanho real do card.
Teoria rápida
Como o Box Model funciona
Todo elemento HTML é uma caixa com 4 camadas. O problema é que o CSS, por padrão, não inclui padding e border no cálculo da largura — e aí o bug aparece.
content-box (padrão)
width define só o conteúdo.
Padding e border somam por fora.
O elemento fica maior do que você declarou.
border-box (o que você quer)
width inclui tudo — padding e border
já estão dentro do valor declarado. O elemento
nunca vai além do tamanho definido.
content-box, a caixa embaixo não conta nos 30cm —
a pizza "ocupa mais espaço". Com border-box, os 30cm
já incluem a caixa e tudo mais.
Correção prática
Hora de consertar — sem alterar o HTML
O cliente não quer que você mexa na estrutura. A correção precisa ser só no CSS. Tente resolver antes de olhar a solução.
Seu desafio
O card precisa ter exatamente 300px de largura total, incluindo o padding de 20px e o border de 3px.
Adicione apenas uma propriedade CSS ao .product-card
para resolver o problema. Não altere nada no HTML.
.product-card { width: 300px; padding: 20px; border: 3px solid #999; background: white; box-sizing: border-box; /* ← aqui está o fix */ }
Com border-box, o browser recalcula automaticamente o conteúdo:
Experimentação ativa
Mexa no código e observe o comportamento
Faça essas modificações no arquivo exercicio/style.css uma por vez.
Salve e recarregue o navegador depois de cada alteração.
padding: 20px para padding: 50px
sem o border-box. Observe o card explodir para fora.
box-sizing: border-box e mantenha o padding em 50px.
Veja o card se comportar corretamente dentro dos 300px.
border: 15px solid red. Com border-box,
o card continua em 300px. Sem ele, quanto fica?
width: 300px do card e coloque width: 100%.
O que acontece com e sem border-box?
Desafio final — nível mercado
Novo pedido chegou
O cliente ficou satisfeito com o fix e pediu uma melhoria: agora quer uma grade de 3 cards lado a lado dentro do container.
"Agora quero 3 cards de produto lado a lado, dentro de um container de 900px. Cada card deve ter padding de 16px e border de 2px. Coloca um espaçamento de 15px entre eles. Os cards não podem ultrapassar o container."
Restrições
• 3 cards com largura igual, lado a lado em um container de 900px
• Cada card: padding: 16px e border: 2px solid
• Espaçamento de 15px entre cada card
• Os cards não podem ultrapassar o container
/*
Container: 900px
3 cards + 2 gaps de 15px = 900px
900 - 30 = 870px para os 3 cards
870 / 3 = 290px por card
Com border-box: width: 290px já inclui
o padding de 16px e o border de 2px.
Limpo, previsível, sem surpresa.
*/
Erros comuns
O que todo mundo faz de errado
Esses erros aparecem em code review o tempo todo. Conhecer eles evita perder horas debugando o óbvio.
Esquecer que o padrão é content-box
width: 300px, adiciona padding: 20px
e se surpreende porque o elemento ficou com 340px. Não é bug do CSS — é o
comportamento padrão. Solução definitiva: use border-box globalmente
e esqueça esse problema para sempre.
Misturar % com padding sem border-box
width: 50% + padding: 20px sem border-box
resulta em um elemento maior que 50% do pai. O padding é somado por fora
da porcentagem calculada. Com border-box, o padding fica dentro dos 50%.
Confundir margin com padding
Margin collapse — margens verticais que somem
margin-bottom: 20px e
margin-top: 20px não somam 40px — ficam 20px.
Isso é o margin collapse: margens verticais adjacentes se colapsam para o maior valor.
Só acontece no eixo vertical. Horizontal não colapsa.
Aplicar border-box só no elemento problemático
*.
Boas práticas
O reset que todo projeto real usa
Não existe projeto sério de front-end sem esse reset. Ele vai no topo de todo arquivo CSS e previne 90% dos bugs de Box Model antes de escrever qualquer linha de código.
*,
*::before,
*::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
Por que ::before e ::after?
Pseudo-elementos também são caixas. Sem incluir eles, ícones e decorações feitas com CSS puro podem ter comportamento diferente do esperado.
Por que zerar margin e padding?
Cada navegador tem estilos padrão diferentes. Resetar garante que o layout começa idêntico em todo lugar — Chrome, Firefox, Safari e Edge.
Resumo final
O que você aprendeu hoje
Ticket #4421 resolvido. Aqui está o mapa do que foi coberto:
Modelo padrão
content-box
padding e border somam por fora
Modelo correto
border-box
padding e border ficam dentro
Ferramenta
DevTools
diagrama de Box Model em Computed
Reset global
* { }
aplique em todo projeto novo
/*
content-box (padrão do CSS):
tamanho real = width + padding + border
border-box (o que você quer):
tamanho real = width ← só isso
Sempre use border-box. Sempre.
*/
display: inline-block
vs block e como o comportamento de margin muda em cada um.
São os próximos bugs que você vai encontrar em projeto real.