Como usar a função minmax() do Css Grid Layout

CSS Grid Layout by David Arty
Autor da image: David Arty.

Fonte: How the minmax() Function Works

Uma nova característica muito útil apresentada com a especificação do Grid Layout do CSS é a função minmax(). Ela nos permite escrever um CSS muito mais poderoso e sucinto, configurando valores para a grade (grid track), incluindo na mesma linha um valor mínimo e máximo.

A função minmax()

A função minmax() aceita dois parâmetros, um valor mínimo e um máximo:


minmax(min, max)

Se o valor máximo definido for menor que o valor mínimo, ele é ignorado, e a função é tratada como se apresentasse apenas o valor mínimo.

A função minmax() aceita 6 tipos de valores:

Tipo Unidade de medida Exemplos
Comprimento fixo pixel 100px, 50px
Porcentagem % 50%, 10%
Comprimento flexível fr 1fr, 2fr
max-content - max-content
min-content - min-content
auto - auto

Veja exemplos de cada um:

Comprimento fixo

Talvez o exemplo mais simples de valor usado com a função minmax(), já que especificar tamanhos em pixels já é comum em todas as regras de estilos que definem medidas. Considere por exemplo uma grade simples, com três colunas e apenas uma linha.

Exemplo de grid simples, 3 colunas e 1 linha

Usando a função minmax() podemos especificar que a célula amarela permaneça entre 100px e 200px. Conforme a janela é redimensionada, a valor absoluto muda, mas sempre dentro dos dois limites.


.grid {
    display: grid;
    grid-template-columns: minmax(100px, 200px) 1fr 1fr;
}

Demonstração da função minmax() com valores absolutos

Porcentagem

Também podemos usar porcentagens com a função minmax(). Digamos que precisássemos que a mesma célula amarela tivesse o tamanho máximo de 50% da grade, mas nunca menos do que 200px.


.grid {
    display: grid;
    grid-template-columns: minmax(200px, 50%) 1fr 1fr;
}

Demonstração da função minmax() com porcentagens

Não importa o quanto a tela diminua, a célula amarela nunca ficará menor do que 200px. Porém, quando houver mais espaço, ela aumentará até ocupar metade da tela.

Comprimento flexível

O tamanho flexível (fr) é uma nova unidade de medida que surgiu junto com a especificação do Grid Layout, e representa uma fração do espaço disponível dentro do container da grade. Por exemplo, considere um container de 100px com duas colunas. Uma coluna tem a largura fixa de 20px e a outra tem a largura de 1fr. A segunda coluna terá efetivamente 80px de largura, já que ela assume todo o espaço restante da grade.

Até o momento, a unidade fr só pode ser usada para o valor máximo na função minmax(). Embora esteja anotado na especificação que, no futuro, ela também poderá ser aplicada ao valor mínimo. Voltando ao exemplo prático, em que a nossa célula amarela tem a largura mínima de 200px, mas queremos que, quando a tela tive um espaço maior, ela fique com 1fr de largura, que é o mesmo tamanho das outras duas colunas.


.grid {
    display: grid;
    grid-template-columns: minmax(200px, 1fr) 1fr 1fr;
}

Demonstração da função minmax() com a nova unidade fr

Já que todas as colunas têm 1fr em telas maiores, elas dividem o espaço da grade igualmente.

max-content

A palavra-chave max-content é um valor especial que representa o “tamanho ideal” da célula. É o menor valor possível para que a célula, desde que ela se ajuste ao redor do conteúdo. Por exemplo, se o conteúdo da célula for uma sentença, a largura ideal da célula seria o comprimento da sentença inteira, sem quebras de linha, independente de qual seja este comprimento.

Voltando ao exemplo anterior, vamos especificar que a célula amarela tenha um mínimo e um máximo de max-content.


.grid {
    display: grid;
    grid-template-columns: minmax(max-content, max-content) 1fr 1fr;
}

Demonstração da função minmax() com a palavra-chave max-content

Como podemos ver, a coluna se expande para se ajustar ao tamanho do texto. Desde que ambos os valores mínimo e máximo estão configurados para max-content, a largura da coluna permanece sempre a mesma.

min-content

A palavra chave min-content, assim como no caso anterior, é um valor especial que representa o menor valor possível que a célula pode ter sem causar um estouro (overflow) do conteúdo, a menos que seja inevitável.

Para ilustrar a diferença entre min-content e max-content, podemos usar o mesmo conteúdo do exemplo anterior, passando para a função minmax() o valor min-content.


.grid {
    display: grid;
    grid-template-columns: minmax(min-content, min-content) 1fr 1fr;
}

Demonstração da função minmax() com a palavra-chave min-content

Podemos definir que o conteúdo de dentro da célula seja alterado, para ocupar o mínimo espaço horizontal possível, sem causar nenhum estouro.

auto

Finalmente, temos o valor auto, que tem diferentes significados, dependendo se é usado como o valor máximo ou mínimo na função minmax().

Quando usado como o máximo, o valor auto é equivalente ao valor max-content. Se usado como mínimo, o valor auto representa o “maior tamanho mínimo” que a célula pode ter. Diferente do valor min-content, o resultado é especificado por min-width/min-height.

Para ilustrar, vamos novamente configurar a célula amarela com a função minmax() com o valor auto para o mínimo e máximo.


.grid {
    display: grid;
    grid-template-columns: minmax(auto, auto) 1fr 1fr;
}

Demonstração da função minmax() com a palavra-chave auto

Usando a função minmax() para gerar design responsivo sem media queries

Como foi visto, existem muitos casos para usar a função minmax(). Provavelmente o uso mais popular seja a habilidade da função minmax() para criar designs responsivos sem a necessidade de media queries.

Design responsivo com a função minmax()

Cada coluna da grade tem uma largura mínima de 200px. Quando a tela é redimensionada, muda o número de colunas para que elas mantenham o tamanho ideal. Com CSS Grid e a função minmax(), basta duas linhas de código para isso.


.grid {
    display: grid;
    grid-template-columns: repeat( auto-fit, minmax(200px, 1fr) );
}

Além da função minmax(), existem duas outras partes importantes neste código:

Uma limitação, na minha opinião bem importante, é que isso só funciona se todas as colunas tiverem a mesma largura. Temos que usar repeat() junto com a palavra-chave auto-fit, já que é isso que permite que o número de colunas seja flexível. No entanto, esta ainda pode ser uma técnica extremamente útil em certas circunstâncias.

Ire Aderinokun, autora do texto original How the minmax() Function Works

Avatar: Ire Aderinokun