[Easy] 🏷️ Box Model
Padrão
O Box Model é um termo utilizado em CSS para discutir como projetar layouts. Ele pode ser entendido como uma caixa que envolve os elementos HTML, com quatro propriedades principais:
- content: Usado principalmente para exibir o conteúdo do elemento, como texto.
- padding: A distância entre o conteúdo do elemento e sua borda.
- margin: A distância do elemento em relação a outros elementos externos.
- border: A linha de borda do próprio elemento.
box-sizing
O tipo de Box Model utilizado é determinado pela propriedade box-sizing.
Isso significa que, quando o elemento calcula largura e altura, as propriedades padding e border utilizam preenchimento interno ou expansão externa.
O valor padrão é content-box, que usa expansão externa. Nesta condição, além da largura e altura do próprio elemento, padding e border adicionais precisam ser incluídos no cálculo. Veja:
div {
width: 100px;
padding: 10px;
border: 1px solid #000;
}
A largura deste div é calculada como 100px(width) + 20px(padding esquerdo e direito) + 2px(border esquerda e direita) = 122px.
border-box
Evidentemente, o método acima não é confiável, pois obriga o desenvolvedor frontend a calcular constantemente largura e altura dos elementos. Para melhorar a experiência de desenvolvimento, naturalmente adota-se o outro modo: border-box.
Como no exemplo abaixo, ao inicializar os estilos, define-se o box-sizing de todos os elementos como border-box:
* {
box-sizing: border-box; // global style
}
Dessa forma, adota-se a forma de preenchimento interno, tornando o design de largura e altura dos elementos mais intuitivo, sem a necessidade de ajustar números por causa de padding ou border.
Exemplo Comparativo
Supondo as mesmas configurações de estilo:
.box {
width: 100px;
height: 100px;
padding: 10px;
border: 5px solid #000;
margin: 20px;
}
content-box (valor padrão)
- Largura real ocupada =
100px(width)+20px(padding esquerdo e direito)+10px(border esquerda e direita)=130px - Altura real ocupada =
100px(height)+20px(padding superior e inferior)+10px(border superior e inferior)=130px - Área do content =
100px x 100px - Observação:
marginnão é incluído na largura do elemento, mas afeta a distância em relação a outros elementos
border-box
- Largura real ocupada =
100px(padding e border comprimem para dentro) - Altura real ocupada =
100px - Área do content =
100px-20px(padding esquerdo e direito)-10px(border esquerda e direita)=70px x 70px - Observação:
marginigualmente não é incluído na largura do elemento
Comparação Visual
content-box:
┌─────────── margin (20px) ───────────┐
│ ┌──────── border (5px) ──────────┐ │
│ │ ┌──── padding (10px) ──────┐ │ │
│ │ │ │ │ │
│ │ │ content (100×100) │ │ │
│ │ │ │ │ │
│ │ └───────────────────────────┘ │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────┘
Largura total: 130px (sem margin)
border-box:
┌─────────── margin (20px) ───────────┐
│ ┌──────── border (5px) ──────────┐ │
│ │ ┌──── padding (10px) ──────┐ │ │
│ │ │ │ │ │
│ │ │ content (70×70) │ │ │
│ │ │ │ │ │
│ │ └───────────────────────────┘ │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────┘
Largura total: 100px (sem margin)
Armadilhas Comuns
1. Tratamento do margin
Seja em content-box ou border-box, margin nunca é incluído na largura e altura do elemento. Os dois modos afetam apenas o cálculo de padding e border.
.box {
box-sizing: border-box;
width: 100px;
padding: 10px;
border: 5px solid;
margin: 20px; /* Não é incluído no width */
}
/* A largura real do elemento ainda é 100px, mas a distância em relação a outros elementos será 20px a mais */
2. Largura em porcentagem
Ao usar largura em porcentagem, o cálculo também é afetado pelo box-sizing:
.parent {
width: 200px;
}
.child {
width: 50%; /* 50% do elemento pai = 100px */
padding: 10px;
border: 5px solid;
}
/* content-box: Largura real 130px (pode ultrapassar o elemento pai) */
/* border-box: Largura real 100px (exatamente 50% do elemento pai) */
3. Elementos inline
box-sizing não funciona em elementos inline, pois a definição de width e height em elementos inline é ineficaz por si só.
span {
display: inline;
width: 100px; /* Ineficaz */
box-sizing: border-box; /* Também ineficaz */
}
4. min-width / max-width
min-width e max-width também são afetados pelo box-sizing:
.box {
box-sizing: border-box;
min-width: 100px; /* Inclui padding e border */
padding: 10px;
border: 5px solid;
}
/* Largura mínima do content = 100 - 20 - 10 = 70px */