Se você já se deparou com os valores de CSS min-content
, max-content
e fit-content
e não entendeu muito bem para o quê servem, chegou a hora de tirar essa dúvida de uma vez por todas.
Entender as propriedades de dimensionamento de CSS é necessário para qualquer desenvolvedor que deseja flexibilidade para apresentar conteúdos de forma adequada.
Em CSS, é possível definir um tamanho de elemento usando os valores de comprimento (px
, em
etc.), porcentagem e palavra-chave. Embora os tipos de valor de comprimento e porcentagem sejam frequentemente usados para layouts, eles nem sempre atendem a todas as necessidades.
Em algum casos, é preciso usar os tipos de valor de palavra-chave, incluindo min-content
, max-content
e fit-content
.
Tamanho intrínseco e tamanho extrínseco
Considere um elemento div com width
e height
fixas de 200px
:
1 2 3 4 |
<div class="s_1"> nemo suscipitarchitectodeserunt vero, eveniet soluta deleniti alias dolor illum praesentium ipsa minus </div> |
Para facilitar a visualização do tamanho, foi colocada uma borda na div.
Quando se altera o tamanho natural de um elemento aplicando um valor específico a ele, como visto na imagem acima, isso é chamado de tamanho extrínseco.
Por outro lado, quando o tamanho do conteúdo define o tamanho do elemento, isso é chamado tamanho intrínseco (ou natural).
Ao restringir a dimensão do bloco a um tamanho específico, acontece um overflow (ou “estouro de conteúdo”), que é uma desvantagem do dimensionamento extrínseco.
Mas é possível remediar o comportamento indesejado para produzir um layout melhor determinando o tamanho intrínseco do elemento a partir do conteúdo usando os valores de palavras-chave min-content
, max-content
e fit-content
.
min-content
De acordo com a especificação do W3C, min-content
é o menor tamanho que uma caixa pode ter sem acontecer overflow em seu conteúdo.
Para conteúdo horizontal, min-content usa o comprimento do pedaço de conteúdo mais largo na caixa do elemento e define automaticamente esse valor de comprimento como a largura.
O conteúdo, neste caso, inclui o texto e recursos como imagens e vídeos.
Modificando um pouco o exemplo acima, é possível aplicar min-content
ao elemento assim:
1 2 3 4 5 |
.s_2 { /* ... */ width: min-content; /* ... */ } |
Que surtirá o resultado:
Com min-content
, a palavra mais longa dentro do conteúdo define o tamanho da caixa; esta é a largura mínima intrínseca da caixa.
Exemplos práticos de min-content
Para demonstrar a implementação da palavra-chave min-content
em cenários do mundo real, considere os casos de uso a seguir.
Legendas em imagens
Em um caso em que seja preciso colocar numa imagem uma legenda que siga sua largura, é possível usar min-content
para obter o resultado desejado.
Veja o código a seguir:
1 2 3 4 5 6 7 8 9 10 |
<figure> <img src="https://upload.wikimedia.org/wikipedia/commons/1/1b/Square_200x200.png" alt="lorem ipsum" /> <figcaption> Lorem ipsum dolor sit amet consectetur adipisicing elit </figcaption> </figure> |
Isso dá ao elemento figure
uma borda para ver a extensão do tamanho.
Como figure
é um elemento de bloco, sua largura ocupa naturalmente seu elemento-contêiner.
Ao atribuir uma largura de min-content
ao elemento figure
, seu tamanho é definido pelo maior “pedaço” de conteúdo. Neste caso, a imagem:
1 2 3 4 |
figure { /* ... */ width: min-content; } |
Que produzirá o resultado:
Dimensionamento de grid e flex items
min-content
também é um valor válido para propriedades de dimensionamento de Grid e Flexbox. Em CSS, a propriedade flex-basis
define o tamanho da caixa de conteúdo (ou content box).
Isso torna a palavra-chave min-content
um valor ideal para obter automaticamente o tamanho mínimo intrínseco da caixa.
No caso, flex-basis: min-content
.
De igual maneira, ao usar CSS Grid, é possível atribuir a palavra-chave min-content
às propriedades grid-template-rows
ou grid-template-columns
para obter o tamanho mínimo intrínseco da caixa.
Considere o seguinte código:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<div class="grid"> <header class="header"> <!-- ... --> </header> <div class="content"> <!-- ... --> </div> <div class="footer"> <!-- ... --> </div> </div> |
Trabalhando com CSS Grid e aplicando a palavra-chave min-content
:
1 2 3 4 5 |
.grid { display: grid; grid-template-rows: min-content auto min-content; height: 100vh; } |
Com isso, obtém-se o valor mínimo intrínseco para a altura do conteúdo sem causar overflow.
Sem min-content
, obtém-se um comportamento diferente. Para ver como fica, é possível remover temporariamente as linhas de grid-template-rows
e aplicar uma altura fixa ao cabeçalho:
1 2 3 4 5 6 7 8 9 10 |
.grid { ... /* grid-template-rows: min-content auto min-content; */ ... } .header { ... height: 40px; } |
Com isso, não se tem mais o tamanho natural do conteúdo. Nesse caso, as caixas de elementos podem ser muito grandes para seu conteúdo, causando overflow no conteúdo das caixas.
max-content
Segundo aa especificação do W3C, max-content
representa o tamanho ideal de uma caixa (em um determinado eixo) quando há espaço disponível infinito.
Em outras palavras, max-content
representa o tamanho que uma caixa precisa para conter todo o seu conteúdo sem “quebrar” (wrap) ou “estourar” (overflow).
Isto posto, veja este exemplo de aplicação de max-content
a um tamanho de elemento:
1 2 3 4 |
<div id="container"> <div class="item1">Lorem ipsum dolor, sit amet consectetur adipisicing elit.</div> <div class="item2">Lorem ipsum dolor, sit amet consectetur adipisicing elit.</div> </div> |
Que resulta em:
Aqui, o primeiro elemento assume o valor de largura padrão auto
, acomodando tanto espaço quanto o contêiner permitir. Mas, ao aplicar o valor max-content
à mesma caixa, obtém-se o tamanho exato do conteúdo da caixa.
O valor da palavra-chave max-content
é ideal em situações em que é preciso da largura máxima do conteúdo para decidir o tamanho da caixa.
Exemplo prático de max-content
Considere uma estrutura de layout com CSS Grid, na qual se aplica max-content
às colunas.
O HTML inclui:
1 2 3 4 5 |
<div class="container"> <div>Lorem</div> <div>Lorem ipsum dolor sit amet</div> <div>Lorem ipsum dolor</div> </div> |
E o CSS:
1 2 3 4 5 |
.container { display: grid; grid-template-columns: 1fr max-content max-content; /* ... */ } |
Isso renderiza a coluna com o valor max-content
tomando o tamanho do conteúdo, enquanto a coluna com a unidade fr
ocupa o espaço restante disponível.
Efeito indesejável de max-content
max-content, como foi visto, funciona muito bem para o tamanho que uma caixa precisa para conter todo o seu conteúdo sem “quebrar” (wrap) ou “estourar” (overflow).
No entanto, em casos em que o elemento-pai ou ancestral não pode acomodar o tamanho da caixa, a caixa tende a overflow.
HTML de um exemplo:
1 2 3 |
<div id="container"> <div class="item1">Lorem ipsum dolor, sit amet consectetur adipisicing elit.</div> </div> |
E respectivo CSS:
1 2 3 4 5 6 7 8 9 |
#container { /* ... */ width: 200px; } .item1 { width: max-content; /* ... */ } |
Com este código, a largura máxima intrínseca da caixa é maior que o contêiner, causando overflow.
Em situações como essa, é necessário ajustar o conteúdo da caixa para caber no espaço disponível do contêiner.
É aí que entra a palavra-chave fit-content
.
fit-content
Dependendo do tamanho de um elemento-contêiner, ao aplicar fit-content
a um elemento de caixa dentro desse contêiner, a caixa fica com tamanho segundo min-content
, max-content
ou o contêiner disponível como seu tamanho ideal.
Quando recebe espaço disponível infinito, max-content
define o tamanho ideal da caixa, no entanto, quando a viewport é mais estreita, o espaço disponível se torna o tamanho da caixa para evitar overflow até que a caixa use min-content
.
Revisitando o último exemplo, aplicando fit-content ao elemento de caixa, tería-se o seguinte CSS:
1 2 3 4 |
.item1 { width: fit-content; /* ... */ } |
Como é possível de ver abaixo, a caixa usa o espaço disponível, mas nunca se expande além de max-content
e, quando a viewport é mais estreita, a caixa nunca diminui além de min-content
.
A função fit-content()
A especificação do W3C também aponta que a função fit-content()
permite que se defina uma largura máxima permitida para o tamanho de um elemento.
Essa função CSS geralmente dimensiona colunas e linhas de grid usando grid-template-columns
e grid-template-rows
, respectivamente.
fit-content()
aceita uma porcentagem ou unidade de comprimento como argumento:
1 |
fit-content(percentage | length) |
Tal como a palavra-chave fit-content
, ao atribuir esse valor de função para determinar o tamanho em um layout usando Grid, ele usa o argumento especificado como o tamanho máximo permitido da caixa, garantindo que a caixa nunca ultrapasse max-content
.
Considere o exemplo de uma estrutura de layout de grid aplicando um fit-content()
à coluna:
1 2 3 4 5 6 7 |
<div class="container"> <div>Lorem ipsum dolor</div> <div> Lorem ipsum dolor, sit consectetur adipisicing elit.! </div> <div>Lorem</div> </div> |
De CSS:
1 2 3 4 5 |
.container { display: grid; grid-template-columns: fit-content(200px) fit-content(250px) auto; /* ... */ } |
O argumento passado para fit-content()
diferencia as duas funções.
Na primeira coluna, foi passado 200px
como argumento, portanto, a coluna tem uma largura máxima permitida de 200px
e a segunda coluna tem uma largura máxima permitida de 250px
. A terceira coluna ocupa o espaço restante do contêiner, pois é atribuído um valor de auto
.
As caixas cujos tamanhos são definidos por fit-content()
nunca se expandem além da largura especificada e também nunca vão além de max-content
, mas, quando a viewport é mais estreita, a caixa pode encolher para caber no conteúdo.
Conclusão
Esses valores de palavras-chave intrínsecos, que oferecem a flexibilidade de apresentar o conteúdo da página da maneira mais adequada, realmente podem ser usados em uma infinidade de situações de layout.
Agora você já conhece e sabe como usar os valores de palavra-chave min-content
, max-content
e fit-content
em seus projetos.