Box Model

Box Model

Tudo exibido pelo CSS é uma caixa. Entender como o CSS Box Model funciona é, portanto, uma base fundamental do CSS.

Digamos que você tenha este pedaço de HTML:

<p>Eu sou um parágrafo de texto que contém algumas palavras.</p>

Então você escreve este CSS para ele:

p {
  width: 100px;
  height: 50px;
  padding: 20px;
  border: 1px solid;
}

O conteúdo sairia do seu elemento e teria 142px de largura, em vez de 100px. Por que?! O box model é a base fundamental do CSS e entender como ele funciona, como é afetado por outros aspectos do CSS e, mais importante, como você pode controlá-lo ajudará você a escrever um CSS mais previsível.

Uma coisa muito importante para se lembrar ao escrever CSS, ou trabalhar na web como um todo, é que tudo exibido pelo CSS é uma caixa. Seja uma caixa que usa border-radius para ficar semelhante a um círculo ou apenas algum texto: a principal coisa a lembrar é que são todas caixas.

Conteúdo e dimensionamento

As caixas têm comportamento diferente com base em seu valor de display, suas dimensões definidas e o conteúdo que reside dentro delas. Esse conteúdo pode ser ainda mais caixas — geradas por elementos filho — ou conteúdo de texto simples. De qualquer forma, esse conteúdo afetará o tamanho da caixa por padrão.

Você pode controlar isso usando o dimensionamento extrínseco (extrinsic sizing) ou pode continuar deixando o navegador tomar decisões por você com base no tamanho do conteúdo, usando o dimensionamento intrínseco (intrinsic sizing).

Vamos ver rapidamente a diferença, usando uma demonstração para nos ajudar.

Extrinsic sizing vs intrinsic sizing

Observe que quando a caixa está usando Extrinsic sizing, há um limite de quanto conteúdo você pode adicionar antes que ele ultrapasse os limites da caixa. Isso faz com que a palavra “incrível” transborde.

intrinsic sizing Desativado

CSS IS AWESOME

A demonstração tem as palavras "CSS is awesome" em uma caixa com dimensões fixas e uma borda grossa. A caixa tem uma largura definida, portanto é dimensionada extrinsecamente (Extrinsic sizing). Ele controla o dimensionamento de seu conteúdo filho. O problema com isso, porém, é que a palavra "awesome" é muito larga para a caixa, então ela transborda para fora da caixa de border box pai. Uma maneira de evitar esse estouro é permitir que a caixa seja intrinsecamente dimensionada (intrinsic sizing), definindo a largura do elemento ou, nesse caso, definindo o width como min-content. A palavra-chave min-content diz à caixa para ser tão larga quanto a largura mínima intrínseca (intrinsic) de seu conteúdo (a palavra "awesome"). Isso permite que a caixa se encaixe perfeitamente em "CSS is awesome".

Vejamos algo mais complexo para ver o impacto de tamanhos diferentes no conteúdo real:

Extrinsic sizing vs intrinsic sizing

Ative e desative o extrinsic sizing para ver como você pode obter mais controle com o extrinsic sizing e permitir que o conteúdo tenha mais controle com o intrinsic sizing.

intrinsic sizing Desativado

240px

A purple Petunia flower in close focus
Você pode editar este texto para ver como ele muda o layout da nossa caixa, dependendo do tamanho intrínseco e extrínseco.

Ative e desative o intrinsic sizing para ver como você pode obter mais controle com o extrinsic sizing e permitir que o conteúdo tenha mais controle com o intrinsic sizing. Para ver o efeito que o dimensionamento intrínseco e extrínseco tem, adicione algumas frases de conteúdo ao cartão. Quando esse elemento está usando extrinsic sizing, há um limite de quanto conteúdo você pode adicionar antes que ele ultrapasse os limites do elemento, mas esse não é o caso quando o intrinsic sizing é ativado.

Por padrão, esse elemento tem largura definida. Essas dimensões fornecem limites estritos para tudo dentro do elemento, que será respeitado, a menos que o conteúdo seja muito grande para a caixa, caso em que ocorrerá um estouro visível. Você pode ver isso em ação alterando o conteúdo da legenda, abaixo da imagem da flor, para algo que exceda a altura da caixa, que é algumas linhas de conteúdo.

Termo-chave

Quando o conteúdo é muito grande para a caixa em que está, chamamos isso de estouro. Você pode gerenciar como um elemento lida com o conteúdo de overflow, usando a propriedade overflow.

Ao alternar para o intrinsic sizing, você permite que o navegador tome decisões por você, com base no tamanho do conteúdo da caixa. É muito mais difícil haver estouro com intrinsic sizing porque nossa caixa será redimensionada com seu conteúdo, em vez de tentar dimensionar o conteúdo. É importante lembrar que esse é o comportamento flexível padrão de um navegador. Embora o extrinsic sizing forneça mais controle na superfície, o intrinsic sizing fornece mais flexibilidade, na maioria das vezes.

The areas of the box model

As caixas são compostas de áreas distintas do modelo de caixa que fazem um trabalho específico.

Areas of the box model

As quatro áreas principais do modelo de caixa: content box, padding box, border box e margin box.

Você começa com a content box, que é a área em que o conteúdo reside. Como você aprendeu antes: esse conteúdo pode controlar o tamanho de seu pai, portanto, geralmente é a área de tamanho mais variável.

A padding box envolve a content box e é o espaço criado pela propriedade de padding. Como o preenchimento(padding) está dentro da caixa, o plano de fundo da caixa ficará visível no espaço criado. Se nossa caixa tiver regras de overflow definidas, como overflow: auto ou overflow: scroll, as barras de rolagem também ocuparão esse espaço.

A border box envolve o padding e seu espaço é ocupado pelo valor do border. A border box são os limites da sua caixa e a border edge é o limite do que você pode ver visualmente. A propriedade border é usada para enquadrar visualmente um elemento.

A área final, a margin box, é o espaço ao redor de sua caixa, definido pela regra de margin em sua caixa. Propriedades como o outline e a box-shadow também ocupam esse espaço porque são pintadas na parte superior, portanto, não afetam o tamanho da nossa caixa. Você poderia ter uma outline-width de 200px em nossa caixa e tudo dentro e incluindo a caixa de borda seria exatamente do mesmo tamanho.

Uma analogia útil

O box-model é complexo de entender, então vamos recapitular o que você aprendeu com uma analogia.

Box Model Example

Neste diagrama, você tem três porta-retratos montados em uma parede, um ao lado do outro. O diagrama possui rótulos que associam elementos do quadro ao box-model.

Para específicar esta analogia:

  • O content-box é a arte.
  • O padding-box é o branco fosco, entre a moldura e a arte.
  • O border-box é a moldura, fornecendo uma borda literal para a arte.
  • O margin-box é o espaço entre cada quadro.
  • O shadow ocupa o mesmo espaço que a caixa de margem.

Debugando o box-model

O DevTools do seu Navegador fornece uma visualização dos cálculos do box-model de uma caixa selecionada, o que pode ajudá-lo a entender como o box-model funciona e, mais importante, como ele está afetando o site em que você está trabalhando.

1: Abra o seu DevTools: Para abrir o seu Devtools basta clicar com o botão direito do seu mouse e selecionar a opção "Inspecionar Elemento" ou em Inglês: "Inspect".

2: Selecione um Elemento: Selecione um elemento no seu site no DevTools para ver os detalhes do box-model.

3: Visualize o box-model: Agora você pode ver os detalhes do box-model do elemento selecionado. Você pode ver o tamanho de cada área do box-model, bem como o tamanho total da caixa. Você também pode ver o tamanho de cada área do box-model em relação ao elemento pai.

Controlando o box-model

Para entender como controlar o modelo de caixa, primeiro você precisa entender o que acontece no seu navegador.

Todo navegador aplica uma folha de estilo de agente do usuário a documentos HTML. O CSS usado varia entre cada navegador, mas eles fornecem padrões sensatos para facilitar a leitura do conteúdo. Eles definem como os elementos devem parecer e se comportar se não houver CSS definido. É nos user agent styles que a display padrão de uma caixa também é definida. Por exemplo, se estivermos em um fluxo normal, o valor de display padrão de um elemento <div> é block, um <li> tem um valor de exibição padrão de list-item e um <span> tem um valor de display padrão de inline.

Um elemento inline possui margin block, mas outros elementos não a respeitam. Use inline-block e esses elementos respeitarão a margem do bloco, enquanto o elemento mantém a maioria dos mesmos comportamentos que tinha como elemento inline. Um item de block, por padrão, preencherá o espaço inline disponível, enquanto os elementos inline e inline-block serão tão grandes quanto seu conteúdo.

Juntamente com a compreensão de como os user agent styles afetam cada caixa, você também precisa entender o box-sizing, que informa à nossa caixa como calcular o tamanho da caixa. Por padrão, todos os elementos têm o seguinte estilo de agente do usuário: box-sizing: content-box;.

Ter content-box como o valor de box-sizing significa que quando você definir dimensões, como width e height, elas serão aplicadas à content box. Se você definir padding e border, esses valores serão adicionados ao tamanho da content box.

.minha-caixa {
  width: 200px;
  border: 10px solid;
  padding: 20px;
}

Qual a largura que você acha que .minha-caixa terá?

A largura real desta caixa será 260px. Como o CSS usa por padrão o box-sizing: content-box, a largura aplicada é a largura do conteúdo, padding e border em ambos os lados são adicionados a isso. Portanto, 200px para o conteúdo + 40px de preenchimento + 20px de borda totalizam uma largura visível de 260px.

Você pode controlar isso, porém, fazendo a seguinte modificação para usar o modelo de caixa alternativo, border-box:

.minha-caixa {
  box-sizing: border-box; /* <- Adicionando Border-Box  */
  width: 200px;
  border: 10px solid;
  padding: 20px;
}

Esse modelo alternativo de caixa diz ao CSS para aplicar a width ao border-box em vez da content-box. Isso significa que nossa border e padding são empurrados para dentro e, como resultado, quando você define .minha-caixa para 200px de largura: na verdade, ele é renderizado com 200px de largura.

Confira como isso funciona na demonstração interativa a seguir. Observe que quando você alterna o valor do box-sizing, ele mostra - por meio de um fundo azul - qual CSS está sendo aplicado dentro de nossa caixa.

*,
*::before,
*::after {
  box-sizing: border-box;
}

Esta regra CSS seleciona cada elemento no documento e cada pseudo elemento ::before e ::after e aplica box-sizing: border-box. Isso significa que cada elemento agora terá esse box-model alternativo.

Como o box-model alternativo pode ser mais previsível, os desenvolvedores geralmente adicionam essa regra a redefinições e normalizadores.

Aprenda com o Mestre você também

Mestre é o um espaço para todas as nossas ideias. Eventualmente, ele terá centenas de vídeos premium e uma comunidade próspera, mas agora é o começo!

Obtenha acesso total a todo o nosso conteúdo de vídeo premium, atualizado mensalmente.

R$ 30/por mês

Acompanhe todo conteúdo