O modelo de caixa

Assim que você começa a espaçar as coisas com CSS, você esbarra no mesmo quebra-cabeça que todos esbarram: você define uma largura, adiciona alguns preenchimentos, e o elemento fica mais largo do que você pediu. Dois parágrafos ficam mais próximos um do outro do que os números indicam que deveriam. Nada disso é um erro. É o modelo de caixa, o conjunto de regras que decide quanto espaço cada elemento ocupa, e uma vez que você consegue visualizá-lo, a maioria de suas surpresas de espaçamento deixa de ser surpresa.
Cada elemento é uma caixa
CSS trata cada elemento na página como um retângulo, até mesmo uma única palavra ou um link. Esse retângulo é construído a partir de quatro camadas empilhadas de dentro para fora, e isso é o modelo de caixa: o conteúdo no meio, depois preenchimento ao redor dele, depois uma borda, depois margem do lado de fora.
Imagine uma foto emoldurada em uma parede. A foto é o conteúdo. O passepartout branco ao redor da foto é o preenchimento, espaço respirável dentro do marco. O marco de madeira em si é a borda. E a parede vazia entre este marco e o próximo é a margem. Cada elemento que você estiliza é embalado da mesma forma, de dentro para fora.
.card {
padding: 16px; /* espaço dentro, ao redor do conteúdo */
border: 2px solid #333; /* o marco */
margin: 24px; /* espaço fora, afastando vizinhos */
}padding, border e margin
As três camadas de espaçamento fazem um trabalho cada uma. Preenchimento é espaço do lado de dentro, entre o conteúdo e a borda. Margem é espaço do lado de fora, afastando outros elementos. A borda é a linha desenhada entre eles.
Você pode definir um valor para todos os quatro lados de uma vez, ou direcionar um único lado:
.card {
padding: 20px; /* todos os quatro lados ganham 20px */
margin-bottom: 32px; /* apenas a borda inferior */
}A forma resumida padding: 20px é uma maneira rápida de dizer topo, direita, fundo e esquerda todos juntos. Quando você precisa que um lado seja diferente do resto, use a propriedade específica como margin-bottom.
padding quando o texto parece apertado dentro de uma caixa, e margin quando duas caixas ficam muito próximas. Um valor como padding: 20px cobre todos os quatro lados, ou nomeie um lado como margin-bottom quando apenas um precisa mudar. box-sizing: content-box vs border-box
Aqui está a surpresa que pega quase todo mundo. Você define um cartão para width: 300px, adiciona um pouco de preenchimento, e o cartão acaba ficando mais largo que 300 pixels na página. Você não fez nada errado. Por padrão, width apenas mede o conteúdo no meio, e qualquer preenchimento e borda são adicionados em cima.
Há uma correção de uma linha que faz a largura se comportar da forma que você esperava. Defina box-sizing: border-box, e agora a largura que você digita é a largura completa da caixa, preenchimento e borda inclusos:
.card {
box-sizing: border-box; /* width agora inclui preenchimento e borda */
width: 300px;
padding: 20px; /* o cartão fica com 300px de largura, não 340px */
}width que você define apenas mede o conteúdo no meio, então preenchimento e borda fazem a caixa ficar maior que o número que você digitou. Definir box-sizing: border-box corrige isso: a largura se torna a caixa inteira, preenchimento e borda inclusos. Este aqui me pegou por idades, então vale a pena lembrar cedo. Colapso de margem
Uma última surpresa, e é sobre margens se empilhando. Coloque dois parágrafos um sobre o outro, dê ao primeiro uma margem inferior de 24px e ao segundo uma margem superior de 16px, e você pode esperar 40px de lacuna entre eles. Você realmente recebe 24px.
Isso é chamado colapso de margem. Quando duas margens verticais se encontram, o navegador não as soma. Ele mantém a maior das duas e joga a menor fora. Então a margem maior vence, e a lacuna é 24px, não 40px. Isso só acontece com margens superior e inferior, nunca com preenchimento.
.intro {
margin-bottom: 24px;
}
.details {
margin-top: 16px;
/* a lacuna entre eles é 24px, a margem maior, não 40px */
}24px abaixo encontrando 16px acima dá uma lacuna de 24px, não 40px. Isso só acontece com margens superior e inferior, e surpreende todo mundo na primeira vez. 
