Search buenodc

Box Model

Um conceito fundamental para entender CSS é o modelo de caixa (box model). Ele é tão importante que existe uma brincadeira clássica sobre ele. Reproduza o código abaixo em seu navegador.

<div class="box">CSS IS ASWOME</div>
.box {
    text-transform: uppercase;
    font-size: 6rem;
    font-weight: 700;
    border: 5px solid #000;
    padding: 2rem;
    margin: 2rem 0 4rem;
    width: 300px; 
}

CSS is Awesome

O resultado do seu código deverá ser similar a imagem mostrada anteriormente, mas porque? Aqui entra a importância de se compreender o conceito do modelo de caixa.

O conceito mais importante de se lembrar é que tudo o que é renderizado pelo CSS (mostrado na tela) é uma caixa. Não importa qual conteúdo, seja um parágrafo, um link ou imagem, tudo é representado pelo CSS como sendo uma caixa. Lembre-se da máxima: tudo é caixa e cada caixa possui quatro áreas: conteúdo, preenchimento, borda e margem.

  • conteúdo: é a área onde o conteúdo é renderizado.
  • preenchimento: é a área que envolve o conteúdo. Também pode ser referenciada pelo espaço entre o conteúdo e a borda.
  • borda: é a área que define o limite da caixa. É um espaço que envolve a área de preenchimento.
  • margem: é o espaço que envolve a borda. Pode ser referenciado como o espaço que entre o elemento com margem e os demais elementos renderizados na tela.

Perceba a imagem abaixo, nela você pode ver três quadros pendurados na parede. Essa imagem é uma ótima analogia ao modelo de caixa na qual cada quadro representa um elemento e por consequência é renderizado como uma caixa pelo CSS.

Quadros na parede

Agora perceba a imagem abaixo, nela você pode visualizar as áreas do modelo de caixa:

  • conteúdo: a arte em si (foto);
  • preenchimento: e a área branca entre a arte e a moldura;
  • borda: a moldura da arte, representada pela parte com a cor preta;
  • margem: o espaço entre os quadros;

Box Model com quadros

Agora voltamos para o problema inicial apresentado. A demonstração tem a frase “CSS is awesome” em uma caixa na qual a largura - propriedade width - possui uma largura fixa 300px. Porém o texto dentro da caixa ocupa um espaço maior que os 300 pixels definidos para a caixa, logo o conteúdo extrapola o espaço reservado para ele.

Importante: Quando o conteúdo é muito grande para a caixa em que está, chamamos isso de overflow.

Essa definição específica da largura é chamada de dimensionamento extrínseco. Nele existe um limite de quanto conteúdo é possível adicionar antes que ultrapasse os limites da caixa. Para resolver esse problema podemos utilizar o dimensionamento intrínseco. Nesse dimensionamento você está deixando o navegador tomar as decisões baseados no tamanho do conteúdo inserido no elemento. É importante lembrar que este é o comportamento padrão realizado pelos navegadores. Embora o dimensionamento extrínseco proporcione mais controle na superfície, o dimensionamento intrínseco proporciona maior flexibilidade.

Para resolver o problema você poderia simplesmente omitir a declaração with que como visto anteriormente seria o comportamento padrão do navegador ou utilizar o valor min-content. A palavra-chave min-content diz à caixa para ter apenas a largura mínima intrínseca de seu conteúdo (a largura o texto).

Outro ponto importante é entender como o navegador interpreta a largura de um elemento. Por exemplo, observe o seguinte código CSS abaixo e responda a pergunta, qual a largura do elemento .box?

.box {
    width:200px;
    border: solid 10px purple;
    padding: 10px;
}

Você pode ficar tentando a falar 200px já que a propriedade with está definida com esse valor, porém na verdade a largura será de 240px. Esse é um comportamento esquisito e pouco intuitivo visto que quando pensamos no elemento como um todo esperamos que a largura do elemento considere também a sua borda e seu preenchimento.

Esse comportamento é o padrão dos navegadores então tome cuidado. Porém, graças ao CSS3, hoje é possível contornar esse comportamento com a propriedade box-sizing. Por padrão seu valor é content-box, mas podemos alterá-lo para border-box. Esse valor vai instruir ao navegador a considerar a largura como sendo a largura do conteúdo + sua borda + seu preenchimento.

No caso do exemplo acima, se aplicássemos a propriedade box-sizing: border-box ao elemento, teríamos uma largura total de 200px e não mais 240px. Como esse comportamento costuma ser mais previsível para o desenvolvimento, os desenvolvedores costumam adicionar essa regra a arquivos especiais conhecidos como “redefinidores” (resets) e normalizadores (normalizers).