Propriedade grid-template-rows: Definindo as linhas
Crie as linhas do seu layout grid, especificando seus tamanhos.
Assim como grid-template-columns define a estrutura vertical do seu grid, a propriedade grid-template-rows é aplicada ao Contêiner Grid para especificar o número de linhas e o tamanho de cada uma delas.
Pense no grid-template-rows como o "arquiteto" que desenha as paredes horizontais da sua casa (o Contêiner Grid). Você decide quantos andares (linhas) terá e qual será a altura de cada um.
Como funciona grid-template-rows
Você define os tamanhos das linhas listando-os, separados por espaços. Cada valor representa a altura de uma linha.
Valores Comuns:
A propriedade grid-template-rows aceita os mesmos tipos de valores que grid-template-columns:
Unidades de Medida Fixas (px, em, rem, %):
- Definem alturas fixas para suas linhas.
- Ex:
grid-template-rows: 50px 100px 75px;(cria 3 linhas com essas alturas fixas). - Ex:
grid-template-rows: 30% 70%;(cria 2 linhas que ocupam porcentagens da altura do contêiner).
Unidade
fr(Fractional Unit):frsignifica "fraction" (fração).1frrepresenta uma parte do espaço disponível.- Ex:
grid-template-rows: 1fr 1fr 1fr;(cria 3 linhas de altura igual, dividindo o espaço disponível igualmente). - Ex:
grid-template-rows: 1fr 2fr;(cria 2 linhas; a segunda linha será o dobro da altura da primeira). - Ex:
grid-template-rows: 50px 1fr;(cria uma linha de 50px, e o espaço restante é ocupado pela segunda linha).
auto:- A linha se ajusta automaticamente ao tamanho do conteúdo que ela contém.
- Ex:
grid-template-rows: auto 1fr auto;(as linhas das extremidades se ajustam ao conteúdo, e a linha do meio ocupa o espaço restante).
min-content:- A linha terá a menor altura possível sem quebrar o conteúdo.
max-content:- A linha terá a altura necessária para exibir todo o conteúdo em uma única linha, sem quebras.
minmax(min, max):- Define um intervalo de tamanho para a linha. A linha terá no mínimo
mine no máximomax. - Ex:
grid-template-rows: minmax(80px, 1fr) 150px;(a primeira linha terá no mínimo 80px e no máximo 1 fração do espaço disponível, a segunda terá 150px).
- Define um intervalo de tamanho para a linha. A linha terá no mínimo
Exemplo Prático:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<title>Grid Template Rows</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
background-color: #f4f4f4;
}
.grid-container {
display: grid;
grid-template-columns: 1fr 1fr 1fr; /* 3 colunas de largura igual para este exemplo */
gap: 10px;
background-color: #e0e0e0;
border: 2px solid #333;
padding: 10px;
width: 80%;
height: 400px; /* Altura fixa para o contêiner para ver o efeito das linhas */
margin: 0 auto 30px auto;
}
.grid-item {
background-color: lightblue;
border: 1px solid blue;
padding: 15px;
color: #333;
font-weight: bold;
text-align: center;
display: flex;
justify-content: center;
align-items: center;
}
/* --- Exemplos de grid-template-rows --- */
.container-fixed-rows {
grid-template-rows: 80px 120px 50px; /* 3 linhas com alturas fixas */
}
.container-fr-rows {
grid-template-rows: 1fr 1fr 1fr; /* 3 linhas de altura igual */
}
.container-fr-ratio-rows {
grid-template-rows: 1fr 2fr 0.5fr; /* 3 linhas com proporções diferentes */
}
.container-mixed-rows {
grid-template-rows: 50px 1fr auto; /* Fixo, flexível, auto-ajustável */
}
.container-minmax-rows {
grid-template-rows: minmax(60px, 100px) 1fr; /* Linha 1 entre 60px e 100px, Linha 2 flexível */
}
.container-content-rows {
grid-template-rows: min-content max-content 1fr; /* Min-content, Max-content, flexível */
}
</style>
</head>
<body>
<h1>Propriedade `grid-template-rows`</h1>
<h2>Linhas com Alturas Fixas (`80px 120px 50px`)</h2>
<div class="grid-container container-fixed-rows">
<div class="grid-item">Item 1</div>
<div class="grid-item">Item 2</div>
<div class="grid-item">Item 3</div>
<div class="grid-item">Item 4</div>
<div class="grid-item">Item 5</div>
<div class="grid-item">Item 6</div>
<div class="grid-item">Item 7</div>
<div class="grid-item">Item 8</div>
<div class="grid-item">Item 9</div>
</div>
<h2>Linhas com `fr` (Fração Igual: `1fr 1fr 1fr`)</h2>
<div class="grid-container container-fr-rows">
<div class="grid-item">Item 1</div>
<div class="grid-item">Item 2</div>
<div class="grid-item">Item 3</div>
<div class="grid-item">Item 4</div>
<div class="grid-item">Item 5</div>
<div class="grid-item">Item 6</div>
<div class="grid-item">Item 7</div>
<div class="grid-item">Item 8</div>
<div class="grid-item">Item 9</div>
</div>
<h2>Linhas com `fr` (Proporções Diferentes: `1fr 2fr 0.5fr`)</h2>
<div class="grid-container container-fr-ratio-rows">
<div class="grid-item">Item 1</div>
<div class="grid-item">Item 2</div>
<div class="grid-item">Item 3</div>
<div class="grid-item">Item 4</div>
<div class="grid-item">Item 5</div>
<div class="grid-item">Item 6</div>
<div class="grid-item">Item 7</div>
<div class="grid-item">Item 8</div>
<div class="grid-item">Item 9</div>
</div>
<h2>Linhas Mistas (`50px 1fr auto`)</h2>
<div class="grid-container container-mixed-rows">
<div class="grid-item">Item Fixo</div>
<div class="grid-item">Item Flexível</div>
<div class="grid-item">Item Auto Ajuste com Conteúdo Longo</div>
<div class="grid-item">Outro Fixo</div>
<div class="grid-item">Outro Flexível</div>
<div class="grid-item">Outro Auto</div>
<div class="grid-item">Mais um Fixo</div>
<div class="grid-item">Mais um Flexível</div>
<div class="grid-item">Mais um Auto</div>
</div>
<h2>Linhas com `minmax(min, max)` (`minmax(60px, 100px) 1fr`)</h2>
<div class="grid-container container-minmax-rows">
<div class="grid-item">Item MinMax</div>
<div class="grid-item">Item Flexível</div>
<div class="grid-item">Outro MinMax</div>
<div class="grid-item">Outro Flexível</div>
<div class="grid-item">Mais um MinMax</div>
<div class="grid-item">Mais um Flexível</div>
</div>
<h2>Linhas com `min-content` e `max-content` (`min-content max-content 1fr`)</h2>
<div class="grid-container container-content-rows">
<div class="grid-item">Pequeno</div>
<div class="grid-item">Conteúdo Muito Longo Que Não Quebra</div>
<div class="grid-item">Flexível</div>
<div class="grid-item">Pequeno 2</div>
<div class="grid-item">Outro Conteúdo Muito Longo Que Não Quebra</div>
<div class="grid-item">Flexível 2</div>
<div class="grid-item">Pequeno 3</div>
<div class="grid-item">Mais Conteúdo Muito Longo Que Não Quebra</div>
<div class="grid-item">Flexível 3</div>
</div>
</body>
</html>
Resultado:
- Você verá vários contêineres grid, cada um demonstrando um tipo diferente de definição de linha.
- Observe como as linhas se adaptam ou mantêm sua altura de acordo com os valores de
grid-template-rows. - Redimensione a janela do navegador para ver o efeito das unidades
freminmaxna responsividade.
Boas Práticas:
- Defina suas linhas: Juntamente com
grid-template-columns,grid-template-rowsé essencial para construir a estrutura bidimensional do seu grid. - Use
frpara flexibilidade: A unidadefré tão útil para linhas quanto para colunas, garantindo que suas linhas se adaptem ao espaço vertical disponível. - Altura do Contêiner: Para que as unidades
fremgrid-template-rowstenham um efeito visível, o Contêiner Grid precisa ter uma altura definida (ex:height: 400px;oumin-height: 100vh;). Caso contrário, as linhasfrse ajustarão ao conteúdo, comoauto. - Combine unidades: Misture unidades fixas (px), porcentagens e
frpara criar layouts complexos e flexíveis. minmax()para controle: Useminmax()para garantir que suas linhas não fiquem nem muito pequenas nem muito grandes, oferecendo um controle responsivo robusto.- Visualização: Use as ferramentas de desenvolvedor do navegador para visualizar as linhas de grade e os tamanhos das linhas. Isso é crucial para entender e depurar seu layout.
Dominar grid-template-rows é o segundo passo para desenhar a estrutura vertical do seu layout Grid, complementando o que você aprendeu sobre grid-template-columns.