Modelo de caixa

O CSS Podcast - 001: o modelo de caixa

Digamos que você tenha este trecho de HTML:

<p>I am a paragraph of text that has a few words in it.</p>

Em seguida, escreva este CSS para ele:

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

O conteúdo acaba tendo 142 px de largura, em vez dos 100 px especificados, e sai do elemento. Por quê?

O modelo de caixa é uma base essencial do CSS. Entender como ele funciona, como é afetado por outros aspectos do CSS e, principalmente, como controlá-lo pode ajudar você a escrever um CSS mais previsível.

Entender o modelo de caixa do CSS vai ajudar você a descobrir por que o conteúdo não cabe em um elemento.

É importante lembrar que tudo o que é exibido pelo CSS é uma caixa, mesmo que seja apenas um texto ou tenha um border-radius que o faça parecer um círculo.

Conteúdo e dimensionamento

As caixas têm comportamentos diferentes com base no valor display, nas dimensões definidas e no conteúdo que contêm. Esse conteúdo pode ser texto simples ou mais caixas geradas por elementos filhos. De qualquer forma, o conteúdo afeta o tamanho da caixa por padrão.

Você pode controlar isso usando o dimensionamento extrínseco ou o dimensionamento intrínseco para permitir que o navegador tome decisões com base no tamanho do conteúdo.

Confira uma demonstração básica que explica a diferença:

Quando a caixa tem dimensionamento extrínseco, há um limite para a quantidade de conteúdo que pode ser adicionada antes que ela transborde. Isso faz com que a palavra "awesome" transborde.

A demonstração tem as palavras "CSS is awesome" em uma caixa com dimensões fixas e uma borda espessa. Como a caixa tem uma largura especificada, ela é dimensionada extrinsecamente. Isso significa que ela controla o dimensionamento do conteúdo filho. No entanto, a palavra "awesome" é muito grande para a caixa, então ela transborda para fora da caixa de borda da caixa mãe (mais informações sobre isso adiante). Uma maneira de evitar esse overflow é permitir que a caixa seja dimensionada intrinsecamente, não definindo a largura ou, nesse caso, definindo a width como min-content. A palavra-chave min-content informa à caixa que ela deve ter apenas a largura mínima intrínseca do conteúdo (a palavra "awesome"). Isso permite que a caixa se ajuste perfeitamente ao texto.

Confira um exemplo mais complexo que mostra o impacto de diferentes dimensionamentos no conteúdo real:

O dimensionamento extrínseco permite controlar o tamanho de um elemento. O dimensionamento intrínseco impede o overflow de texto.

Ative e desative o dimensionamento intrínseco para ver como o dimensionamento extrínseco oferece mais controle e o dimensionamento intrínseco oferece mais controle ao conteúdo. Para conferir os efeitos, adicione algumas frases de texto ao card. Quando esse elemento tem dimensionamento extrínseco, há um limite para a quantidade de conteúdo que pode ser adicionada antes que ele transborde, mas isso não acontece quando o dimensionamento intrínseco está ativado.

Por padrão, esse elemento tem uma width e height definidas de 400px cada. Essas dimensões fornecem limites estritos para tudo dentro do elemento, que são respeitados, a menos que o conteúdo seja muito grande para a caixa. Para conferir isso na prática, mude a legenda abaixo da imagem da flor para algo que exceda a altura da caixa.

Termo principal: o overflow acontece quando o conteúdo é muito grande para a caixa em que está. É possível gerenciar como um elemento processa o conteúdo de overflow usando a propriedade overflow.

A mudança para o dimensionamento intrínseco permite que o navegador tome decisões com base no tamanho do conteúdo da caixa. Isso torna o overflow muito menos provável, porque a caixa é redimensionada com o conteúdo.

É importante lembrar que o dimensionamento intrínseco é o comportamento padrão do navegador e geralmente oferece muito mais flexibilidade do que o dimensionamento extrínseco.

As áreas do modelo de caixa

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

Diagrama das quatro principais áreas do modelo de caixa.
As quatro principais áreas do modelo de caixa: caixa de conteúdo, caixa de preenchimento, caixa de borda e caixa de margem.

A caixa de conteúdo é a área em que o conteúdo reside. O conteúdo pode controlar o tamanho do pai, então essa geralmente é a área de tamanho mais variável.

A caixa de preenchimento envolve a caixa de conteúdo e é o espaço criado por a propriedade padding. Como o preenchimento está dentro da caixa, o plano de fundo dela fica visível no espaço criado. Se a caixa tiver regras de overflow definidas, como overflow: auto ou overflow: scroll, as barras de rolagem também vão ocupar esse espaço.

As barras de rolagem ficam na caixa de preenchimento.

A caixa de borda envolve a caixa de preenchimento, e o espaço dela é definido pelo border valor, que cria um frame visual para o elemento. A borda do elemento é o limite do que você pode ver.

A área final, a caixa de margem, é o espaço ao redor da caixa, definido pela regra margin dela. Propriedades como outline e box-shadow também ocupam esse espaço porque são pintadas na parte de cima do elemento e não afetam o tamanho da caixa. Mudar a outline-width da caixa de 200px não muda nada dentro da borda.

Um contorno amplo não afeta o tamanho do restante do elemento.

Uma analogia útil

O modelo de caixa é complexo de entender. Por isso, confira uma analogia para o que você aprendeu até agora.

Ilustração do modelo de caixa com um porta-retrato.

Neste diagrama, há três porta-retratos montados lado a lado em uma parede. Os elementos da imagem emoldurada correspondem ao modelo de caixa da seguinte maneira:

  • A caixa de conteúdo é a obra de arte.
  • A caixa de preenchimento é a placa de montagem branca, entre o frame e a obra de arte.
  • A caixa de borda é o frame, que fornece uma borda literal para a obra de arte.
  • A caixa de margem é o espaço entre os frames.
  • A sombra ocupa o mesmo espaço que a caixa de margem.

Depurar o modelo de caixa

As ferramentas para desenvolvedores do navegador fornecem uma visualização dos cálculos do modelo de caixa de uma caixa selecionada, o que pode ajudar você a entender como o modelo de caixa funciona e como ele afeta o site em que você está trabalhando.

Para testar isso no Chrome:

  1. Abra as DevTools.
  2. Selecione um elemento.
  3. Mostre o depurador do modelo de caixa.
O depurador do modelo de caixa para a demonstração de contorno.

Controlar o modelo de caixa

Para entender como controlar o modelo de caixa, primeiro é preciso entender o que acontece no navegador.

Cada navegador aplica uma folha de estilo do user agent a documentos HTML. A folha de estilo define como os elementos devem aparecer e se comportar, caso eles não recebam CSS definido. O CSS nas folhas de estilo do user agent varia de navegador para navegador, mas todos têm padrões que facilitam a leitura do conteúdo.

A folha de estilo do user agent define o valor padrão para elementos que usam display. Por exemplo, o valor display padrão de um elemento <div> é block, um <li> tem um valor display padrão de list-item e um <span> tem um valor display padrão de inline.

Um elemento inline tem uma margem de bloco, mas outros elementos não a respeitam. Com inline-block, outros elementos respeitam a margem de bloco, mas o primeiro elemento mantém a maioria dos mesmos comportamentos que tinha como um inline elemento. Um item block preenche o espaço inline disponível por padrão, enquanto os elementos inline e inline-block são tão grandes quanto o conteúdo.

A folha de estilo do user agent também define padrões para box-sizing, que informa a uma caixa como calcular o tamanho. Por padrão, todos os elementos são definidos como box-sizing: content-box;. Isso significa que, quando você define dimensões como width e height, elas são aplicadas à caixa de conteúdo. Se você definir padding e border, esses valores serão adicionados ao tamanho da caixa de conteúdo.

Teste seu conhecimento

Teste seu conhecimento sobre as propriedades que afetam o tamanho do modelo de caixa.

.my-box {
  width: 200px;
  border: 10px solid;
  padding: 20px;
}

Qual é a largura de .my-box?

200px
Como o valor padrão para box-sizing é content-box, o preenchimento e as bordas são adicionados à largura. 200px estaria correto se a caixa tivesse box-sizing: border-box.
260px
O dimensionamento de caixa padrão é content-box, o que significa que o preenchimento e as bordas são adicionados à caixa geral.

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

É possível mudar isso especificando o dimensionamento border-box:

.my-box {
  box-sizing: border-box;
    width: 200px;
    border: 10px solid;
    padding: 20px;
}

Esse modelo de caixa alternativo informa ao CSS para aplicar a width à caixa de borda em vez da caixa de conteúdo. Isso significa que nossa border e padding são inseridas, então, quando você define .my-box como 200px de largura, ela é renderizada como 200px de largura.

Confira como isso funciona na demonstração interativa a seguir. Quando você alterna o valor box-sizing, a área azul mostra qual CSS está sendo aplicado dentro da caixa.

Compare os efeitos do dimensionamento de caixa de conteúdo e de caixa de borda.
*,
*::before,
*::after {
  box-sizing: border-box;
}

Essa regra de CSS seleciona todos os elementos no documento e todos os pseudo-elementos ::before e ::after e aplica box-sizing: border-box. Isso significa que todos os elementos agora usam esse modelo de caixa alternativo.

Como o modelo de caixa alternativo pode ser mais previsível, os desenvolvedores costumam adicionar essa regra a redefinições e normalizadores, como A (mais) Modern CSS Reset (link em inglês).

Recursos

Folhas de estilo do user agent