Box Model Entendendo como funciona elementos no HTML

Sempre quando vamos estilizar algum elemento via CSS, é comum, e precisamos estar cientes, que alguma alteração que iremos fazer possa impactar em outros elementos. Isso fica fácil de compreender quando entendemos o conceito de box model.
Basicamente, a idéia do box model é composta por quatro partes:
  • conteúdo
  • espaçamento
  • bordas
  • margens
Resumindo, podemos dizer que o box model trata-se de como as 4 propriedades acima se relacionam para compor a dimensão do elemento.
Imagem demonstrando o conceito de box-model
  1. .classe {
  2. width: 50px;
  3. height: 50px;
  4. border: 1px solid gray;
  5. padding: 10px 20px;
  6. }
Se aplicarmos a classe acima em um elemento, ele vai ter as dimensões que setamos (50 pixels de altura e largura), certo? Errado. O elemento vai ser renderizado com 72 pixels de altura e 92 pixels de largura. Isso acontece devido ao fato das propriedades padding e border serem somadas à largura e altura já definidas, aumentando as dimensões do elemento. Isso nos leva a ver que as propriedades width e height definem as dimensões do seu conteúdo e não do elemento como um todo.
Largura
50 (largura definida) +
20 (padding left) +
20 (padding right) +
1 (border left) +
1 (border right) => 92 pixels de largura
Altura
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <!-- Demostra a noticia com ela é --> <ins class="adsbygoogle" style="display:inline-block;width:970px;height:90px" data-ad-client="ca-pub-9446227258700542" data-ad-slot="8295479456"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script>
50 (altura definida) +
10 (padding top) +
10 (padding bottom) +
1 (border top) +
1 (border bottom) => 72 pixels de altura
Um exemplo prático pra vermos a dor de cabeça que você pode ter no seu dia a dia. Imagine que você precise ter um elemento que ocupe 100% da largura disponível. Mas também precisa que esse elemento tenha 10 pixels de padding e uma borda de 1 pixel.
  1. .dor-de-cabeca {
  2. width: 100%;
  3. padding: 10px;
  4. border: solid 1px gray;
  5. }
Seu elemento com a classe dor-de-cabeca ultrapassa o limite de 100% que você tinha definido, provavelmente quebrando o layout. A nova largura dele é resultante da soma: 100% (largura definida) + 20 pixels (padding left e right) + 2 pixels (border left e right).

A propriedade box-sizing

Já vimos o tanto de facilidades que o CSS3 trouxe para a vida dos desenvolvedores. Uma delas é a propriedade box-sizing que permite que mudemos o comportamento do box-model.
Por padrão, todos os elementos possuem o valor content-box para essa propriedade. Trata-se do que vimos nos exemplos acima: o box-model é definido apenas pelo conteúdo.
  1. box-sizing: content-box;
Um outro exemplo para exemplificar o box-model com o uso do content-box. Considere os elementos, abaixo:
  1. .elemento1 {
  2. background: #ddd;
  3. width: 250px;
  4. height: 50px;
  5. }
  6.  
  7. .elemento2 {
  8. background: #ddd;
  9. width: 250px;
  10. height: 50px;
  11. padding: 0 50px;
  12. }
Imagem demonstrando o valor content-box para a propriedade box-sizing e as diferenças no cálculo da largura de elementos
Os elementos são definidos com a mesma largura, mas como podemos ver na imagem acima, o elemento2 é renderizado maior devido ao padding.

A solução border-box

A propriedade box-sizing permite um novo valor que resolve todos os problemas apresentados nos exemplos anteriores:
  1. box-sizing: border-box;
O que ela faz? Simples. Ela altera o comportamento do box-model, fazendo com que o navegador calcule a largura/altura do elemento contando não apenas o seu conteúdo (como visto no content-box), mas também considerando o padding (espaçamento) e border (borda) do elemento.
O exemplo anterior, com a aplicação do border-box:
  1. .elemento1,
  2. .elemento2 { box-sizing: border-box; }
  3.  
  4. .elemento1 {
  5. background: #ddd;
  6. width: 250px;
  7. height: 50px;
  8. }
  9.  
  10. .elemento2 {
  11. background: #ddd;
  12. width: 250px;
  13. height: 50px;
  14. padding: 0 50px;
  15. }
Imagem demonstrando o valor border-box para a propriedade box-sizing e o novo comportamento do box-model para o cálculo da largura de um elemento

Suporte

suporte atual é bem grande, com mais de 90% (em torno de 77% com suporte parcial e 15% com suporte total), o que nos leva a utilizar os prefixos sempre que formos utilizar a propriedade.
  1. * {
  2. -webkit-box-sizing: border-box;
  3. -moz-box-sizing: border-box;
  4. -ms-box-sizing: border-box;
  5. box-sizing: border-box;
  6. }

Postagens mais visitadas