Grid Container e a Unidade fr no CSS3 | Web Academy
Definir grades com valores estáticos em pixels (como 200px) funciona bem em tutoriais básicos, mas o mundo real é implacável: os usuários acessam suas interfaces através de telas minúsculas de smartphones, tablets verticais, notebooks e monitores ultrawide de 4K. Para criar grades verdadeiramente fluidas e elásticas sem os velhos pesadelos de cálculos manuais com porcentagem, a W3C inventou uma unidade de medida revolucionária exclusiva do CSS Grid: a Fractional Unit (unidade fr). Nesta lição, você dominará o dimensionamento de faixas, a mistura de medidas fixas com flexíveis e o poder da Grade Implícita.
📑 Índice do Conteúdo
1. Por que Porcentagens (%) Quebravam Layouts com gap
Antes da unidade fr, para criar três colunas iguais na tela, o instinto natural dos desenvolvedores era usar porcentagens:
/* A ARMADILHA CLÁSSICA */
.grade-quebrada {
display: grid;
grid-template-columns: 33.333% 33.333% 33.333%;
gap: 20px; /* PERIGO: Causa barra de rolagem horizontal indesejada! */
}
Por que essa abordagem falha? Porque a matemática do navegador calcula (33.333% × 3) + (20px × 2). O resultado dessa soma é inevitavelmente maior do que 100% da largura da janela, estourando o contêiner e gerando um transbordamento (overflow) horizontal desastroso!
2. O que é a Unidade fr (Fração de Espaço Livre)?
A unidade fr não mede pixels brutos nem porcentagens cegas. Ela representa uma fração do espaço livre disponível (free space) após todos os elementos fixos e vãos de espaçamento serem subtraídos:
.grade-perfeita {
display: grid;
grid-template-columns: 1fr 1fr 1fr; /* 3 colunas rigorosamente iguais */
gap: 20px; /* O gap é descontado ANTES de fatiar o espaço! */
}
A Matemática Inteligente do Navegador
Quando encontra unidades fr, o motor do navegador executa quatro etapas automáticas:
- Lê a largura total disponível do Grid Container.
- Subtrai todas as larguras fixas declaradas (em
px,rem, etc.). - Subtrai a soma exata de todas as canaletas de
gap. - Pega o Espaço Livre Restante, soma todos os valores de
fre divide as fatias proporcionalmente!
3. Padrões de Dimensionamento com grid-template-columns
1. Proporções Desiguais (Ex.: Layout 2 para 1)
/* A primeira coluna recebe 2/3 do espaço livre e a segunda recebe 1/3 */
.layout-assimetrico {
display: grid;
grid-template-columns: 2fr 1fr;
}
2. O Padrão Ouro de Dashboards: Barra Fixa + Miolo Fluido
Você precisa de uma barra lateral de navegação com exatamente 260px rígidos e quer que a área de conteúdo principal ocupe 100% do que sobrar na tela? A combinação de pixels com 1fr resolve isso com elegância poética:
.dashboard-scaffold {
display: grid;
grid-template-columns: 260px 1fr; /* Sidebar estática + Conteúdo fluido */
gap: 24px;
}
3. A Palavra-Chave auto
A palavra-chave auto ajusta a faixa da grade ao tamanho do seu próprio conteúdo interno (content-based). Ela se expande apenas o suficiente para abrigar o maior item daquela coluna ou linha:
/* Coluna 1 ajustada ao tamanho do ícone/logo, Coluna 2 fluida */
.cabecalho-grid {
display: grid;
grid-template-columns: auto 1fr auto;
}
4. Grade Explícita vs. Grade Implícita (Explicit vs. Implicit Grid)
Uma das características mais fascinantes do CSS Grid é sua capacidade de lidar com dados dinâmicos:
A Grade Explícita
São as faixas de linhas e colunas que você declarou formalmente no CSS através de grid-template-columns e grid-template-rows.
A Grade Implícita
Imagine que você definiu uma grade explícita com 3 colunas e 2 linhas (total de 6 células). No entanto, o seu banco de dados ou API retornou 10 produtos. O que o navegador faz com os 4 produtos que sobraram?
Ele não quebra o layout nem descarta os nós! O navegador cria automaticamente linhas implícitas adicionais para abrigar os novos itens.
Controlando a Grade Implícita: Por padrão, as linhas criadas automaticamente pelo navegador têm altura baseada no conteúdo (auto). Para padronizar a altura de qualquer linha nova gerada pelo fluxo dinâmico, usamos grid-auto-rows:
.galeria-produtos {
display: grid;
grid-template-columns: 1fr 1fr 1fr; /* Grade explícita: 3 colunas */
grid-auto-rows: 180px; /* Grade implícita: TODA nova linha terá 180px! */
gap: 16px;
}
Da mesma forma, a propriedade grid-auto-flow define em qual direção os novos itens implícitos devem fluir:
grid-auto-flow: row(Padrão): Adiciona novas linhas para baixo.grid-auto-flow: column: Adiciona novas colunas para o lado direito.grid-auto-flow: dense: O algoritmo tenta preencher “buracos” deixados por itens maiores que ficaram para trás na grade.
5. Matriz de Medidas de Faixas (Tracks)
| Unidade / Valor | Comportamento | Cálculo com Gap | Caso de Uso Recomendado |
|---|---|---|---|
fr |
Fração flexível do espaço restante. | ✅ Deduz o gap automaticamente. | Colunas responsivas e áreas fluidas principais. |
px / rem |
Tamanho fixo e estático inalterável. | Não se altera. | Barras laterais, avatares, larguras de menus. |
auto |
Ajusta-se ao tamanho do conteúdo interno. | Respeita limites. | Cabeçalhos, botões com rótulos de largura variável. |
% |
Porcentagem bruta da largura do contêiner. | ❌ Ignora o gap (pode quebrar). | Raro; prefira sempre fr em CSS Grid. |
6. Laboratório Prático: Dashboard Scaffold com fr e Grade Implícita
No código interativo abaixo, construímos um esqueleto de Dashboard combinando uma barra lateral fixa de 240px com uma área de trabalho fluida de 1fr, contendo cartões dinâmicos padronizados por grid-auto-rows:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<title>Laboratório de CSS Grid com Unidade fr</title>
<style>
body {
font-family: 'Inter', system-ui, sans-serif;
background: #0b0f19;
color: #f8fafc;
margin: 0;
padding: 24px;
}
/* 1. O Macro-Layout: Sidebar Fixa (240px) + Painel Fluido (1fr) */
.dashboard-app {
display: grid;
grid-template-columns: 240px 1fr;
gap: 20px;
min-height: 480px;
}
.sidebar {
background: #111827;
border: 1px solid #1f2937;
border-radius: 12px;
padding: 20px;
}
.sidebar h3 { margin-top: 0; color: #38bdf8; }
/* 2. O Micro-Grid Interno com fr e Grade Implícita */
.painel-metricas {
display: grid;
grid-template-columns: 1fr 1fr; /* 2 colunas proporcionais */
grid-auto-rows: 130px; /* Linhas implícitas com exatos 130px */
gap: 16px;
}
.metric-card {
background: #1e293b;
border: 1px solid #334155;
border-radius: 10px;
padding: 18px;
display: flex;
flex-direction: column;
justify-content: center;
box-shadow: 0 4px 12px rgba(0,0,0,0.25);
}
.metric-card h4 { margin: 0; font-size: 0.85rem; color: #94a3b8; }
.metric-card .valor { font-size: 1.8rem; font-weight: 800; color: #10b981; margin-top: 6px; }
</style>
</head>
<body>
<div class="dashboard-app">
<aside class="sidebar">
<h3>⚡ Economaster</h3>
<p style="color:#64748b; font-size:0.85rem;">Sidebar com largura estática inegociável de 240px.</p>
</aside>
<main class="painel-metricas">
<!-- 4 Cards populando a grade (2 colunas x 2 linhas) -->
<div class="metric-card">
<h4>Total de Alunos</h4>
<div class="valor">14.820</div>
</div>
<div class="metric-card">
<h4>Horas de Laboratório</h4>
<div class="valor">92.400h</div>
</div>
<div class="metric-card">
<h4>Lições Concluídas</h4>
<div class="valor">58.210</div>
</div>
<div class="metric-card">
<h4>Índice de Retenção</h4>
<div class="valor">98.4%</div>
</div>
</main>
</div>
</body>
</html>
Abra este laboratório no Playground IDE e experimente redimensionar a janela do navegador para observar a barra lateral preservando rigidamente seus 240px enquanto a área de cartões em 1fr se expande suavemente sem provocar overflow:
7. Resumo e Próximos Passos
- A unidade
frrepresenta uma fração do espaço livre restante no contêiner após subtrair itens fixos egap. - Usar
frelimina completamente os erros de cálculo e barras de rolagem provocadas pela soma de%comgap. - Misturar unidades fixas (ex.:
260px) com unidades flexíveis (1fr) é o padrão da indústria para painéis com barras laterais. - A Grade Explícita é formada pelas faixas declaradas formalmente em
grid-template-columnserows. - A Grade Implícita abriga os nós excedentes e pode ser padronizada através de
grid-auto-rowsegrid-auto-flow.
Próximo Passo: E se você precisar de 12 colunas iguais sem digitar 1fr doze vezes seguidas? E se você quiser uma grade que recalcula o número de colunas automaticamente no celular sem precisar de NENHUMA media query? Na Lição 33, desvendaremos o trio mágico: repeat(), minmax() e auto-fit / auto-fill!