Layouts com CSS Grid e minmax()

Aprenda sobre layouts responsivos usando CSS Grid com minmax(), auto-fit ou auto-fill para fazer layouts responsivos e eficientes usando CSS moderno.

Ir para o artigo

Existem muitos tutoriais e guias pelas webs que ensinam a trabalhar com CSS Grid, em geral. Inclusive, temos um curso completo sobre CSS Grid que você pode assistir de grátis.

Mas o que nem sempre é mostrado é a possibilidade do uso da função minmax() para acrescentar um grau extra de controle e dinamicidade nos layouts feitos com CSS Grid.

Neste artigo, será mostrado, justamente, vamos nos aprofundar no minmax() e aprender como, quando e por que usar minmax() com CSS Grid e como isso pode trazer um poder impressionante a layouts e à responsividade em geral.

Introdução a layouts com CSS Grid e minmax()

Se você ainda não tinha ouvido falar, minmax() faz o seguinte: define um intervalo de tamanho maior ou igual a min e menor ou igual a max.

E é possível usar minmax() como um valor para definir colunas ou linhas de uma Grid. Veja um exemplo básico:

Wireframe do layout resultante do código anterior, usando CSS Grid e minmax().

Analisando:

  • Foi especificada uma grid com 3 colunas;
  • A largura da primeira coluna é minmax(200px, 500px), ou seja, o valor mínimo é 200px e o valor máximo é 500px;
  • As outras 2 colunas têm 1fr cada, significando que elas ocuparão o espaço restante disponível.

Rumando para preocupações mais condizentes a layouts do mundo real, é preciso começar pensar na responsividade disso.

O que acontece quando o tamanho da viewport é muito pequena? A resposta curta é: barra de rolagem horizontal. E ninguém gosta de ver uma barra de rolagem horizontal — a não ser que tenha sido planejada.

Wireframe com barra de rolagem em viewport menor quando do uso do exemplo de CSS Grid e minmax().

Isso significa que minmax() não consegue lidar sozinho com web design responsivo; é preciso que o dev dê um talento no código para ficar certinho. Mais sobre isso daqui a pouco.

Validação de layouts com CSS Grid e minmax()

Se o valor “min” em minmax(min, max) for maior que “max”, o máximo será ignorado e tudo será tratado como um valor mínimo.

Além disso, é importante ter em mente que usar 1fr para o valor mínimo é inválido. Isso é pior do que o mínimo ser maior que o máximo! Toda a declaração será ignorada.

Usar zero para o valor mínimo de minmax()

O que será que acontece ao usar minmax(0, 500px)?

A largura será pelo menos zero e não ultrapassará 500px. Isso significa que, se a largura da viewport não for suficiente, a largura da coluna será redimensionada.

Wireframe com representação do uso do exemplo de CSS Grid e minmax().

Uma grid simples

Num exemplo de uma grid simples, suponhamos que é preciso criar uma grdde de 3 colunas:

Se for da preferência do freguês leitor, seria possível usar repeat() para um código mais enxuto:

Wireframe com grid de 3 colunas usando CSS Grid e minmax().

De qualquer maneira, isso não é recomendado, já que não funcionaria da maneira que a maioria pode estar imaginando, pois causaria uma barra de rolagem horizontal. 🤢

Barra de rolagem horizontal

Pois é… Usar minmax() com CSS Grid para layouts dessa maneira, a depender do tamanho da viewport, pode causar uma barra de rolagem horizontal.

Como se está definindo explicitamente o número de colunas, o navegador não pode fazê-las quebrar (wrap) quando a largura da viewport for pequena. Como resultado, isso causará uma barra de rolagem horizontal.

Wireframe com grid de 3 colunas usando CSS Grid e minmax() causando barra de rolagem horizontal.

Para consertar essa barra de rolagem horizontal, é preciso informar ao navegador que o número de colunas deverá diminuir se a largura da viewport não for o bastante.

Se o caso fosse Flexbox, seria possível fazer usando flex-wrap: wrap.

Wireframe mostrando a diferença de usar Flexbox para prevenir barra de rolagem horizontal na técnica de CSS Grid e minmax().

Com CSS Grid, é possível usar as palavras-chave auto-fit ou auto-fill.

Wireframe mostrando a diferença de usar CSS Grid para prevenir barra de rolagem horizontal na técnica de CSS Grid e minmax().

Usar auto-fit ou auto-fill

Para evitar ajustes nos problemas mencionados acima, é possível obter os benefícios das palavras-chave auto-fit ou auto-fill. A diferença entre uma e outra é sutil, mas significativa.

Resumidamente, auto-fit expandirá os itens da grid para preencher o espaço disponível, enquanto auto-fill manterá o espaço disponível reservado sem alterar a largura dos itens da grid.

Wireframe mostrando a diferença de auto-fill e auto-fit na técnica de CSS Grid e minmax().

Em determinados casos, dependendo do tamanho da viewport, usar auto-fill/fit poderá produzir o mesmo resultado, no entanto, essa semelhança não será notada até que se redimensione a viewport.

Casos de uso e exemplos

Cards Grid

Wireframe mostrando um grid de cards com CSS Grid e minmax().

Um caso clássico para o uso de CSS Grid e minmax() é a criação de um wrapper de cards responsivos.

Quando se começa a aprender CSS Grid, não é incomum achar assustador ler o valor de grid-template-columns. É importante prestar atenção às viewports abaixo de 250px, pois haverá uma barra de rolagem horizontal.

Wireframe mostrando um grid de cards com CSS Grid e minmax() com problemas de largura (viewport insuficiente para mostrar o conteúdo).

Para resolver isso, há, pelo menos, 2 soluções. A primeira é usar CSS media queries. A ideia é definir grid-template-columns para 1fr e, quando a largura da viewport for grande o suficiente, aplicar o minmax().

A segunda solução é usar funções de comparação CSS.

Ao usar a função de comparação min() como o primeiro valor para minmax(), eis o que está acontecendo:

  • Se a largura da viewport for menor que 250px, o primeiro valor da função minmax() será 100% da largura do elemento-pai;
  • Se a largura da viewport for maior que 250px, o primeiro valor de minmax() será 250px.

Uso da unidade ch para um wrapper de conteúdo

Um caso de uso interessante para minmax() é usá-lo para criar um layout de artigo. Para este exemplo, o conteúdo é centralizado horizontalmente.

A primeira e a última colunas funcionam como gutters; a do meio é a mais importante. Observe que ela tem minmax(auto, 70ch).

Isso significa que a largura máxima para essa coluna é de 70 caracteres por linha. Esse é um comprimento de caractere ideal para melhor legibilidade.

Wireframe mostrando um grid para layout de artigo usando CSS Grid e minmax().

A técnica também faz com que tudo funcione muito bem em dispositivos móveis (responsivo sem media queries), já que a primeira e a última colunas serão recolhidas com uma largura mínima de 1rem.

Wireframe mostrando um grid para layout de artigo usando CSS Grid e minmax() (mobile).

A desvantagem em usar auto-fit de forma irresponsável

Por tudo o que foi mostrado, pode ser tentador usar auto-fit para todos os layouts com CSS Grid.

Mas a desvantagem é que, quando o conteúdo é dinâmico e você não tem controle, as coisas podem quebrar facilmente.

Uma grid de cards, por exemplo, pode parece perfeita em 4 colunas. No entanto, quando há apenas um card, ela se expande para preencher o espaço restante disponível.

Wireframe mostrando um grid para layout de cards usando CSS Grid e minmax(), comparando 4 itens com 1 item.

O motivo é que se o componente do card tiver uma imagem com texto, por exemplo, ele expandirá a imagem para preencher a largura total, o que faz com que a imagem pareça extremamente ruim.

Por isso é interessante que você sempre use auto-fit para fazer layouts com CSS Grid de maneira consciente.

Se o componente que você estiver trabalhando tem uma mídia a ser exibida, outras abordagens talvez sejam mais interessantes.

Conclusão

Fazer layouts usando CSS Grid com minmax(), auto-fit ou auto-fill faz parte das técnicas de fazer layouts responsivos e eficientes usando CSS moderno.

É importante que você se atualize e use as técnicas mais recentes para layouts com CSS Grid, mas faça de maneiras consciente, para não gerar bugs visuais desnecessários.

Usamos cookies para melhorar sua experiência e para ajudar a entender como nosso site é usado. Ao utilizar este site, você aceita o uso de cookies. Consulte nossa política de privacidade para obter mais informações.