Espaçamento com gap no Grid e Flexbox | Web Academy
Durante duas décadas, colocar um simples espaço vazio entre dois botões ou entre três cartões de uma galeria foi uma das tarefas mais frustrantes do desenvolvimento web. Como a propriedade margin é aplicada a todas as instâncias de um elemento, a margem do último filho empurrava a borda externa do contêiner para fora, exigindo “gambiarras” como :last-child { margin-right: 0 } ou margens negativas tenebrosas no contêiner pai (margin: -10px). Essa era de sofrimento acabou com a padronização da propriedade universal gap no CSS Grid e no Flexbox.
📑 Índice do Conteúdo
1. A História e a Unificação do gap
Originalmente, a propriedade foi criada sob os nomes grid-gap, grid-row-gap e grid-column-gap, funcionando com exclusividade dentro de contêineres com display: grid.
Ao perceber a elegância e a precisão dessa solução, o comitê da W3C (através do módulo CSS Box Alignment Level 3) tomou uma decisão histórica:
- Removeu o prefixo restritivo
grid-, rebatizando as propriedades paragap,row-gapecolumn-gap. - Estendeu o suporte dessas propriedades para o CSS Flexbox e até para colunas de texto com
column-count!
Compatibilidade Total: Hoje, 100% dos navegadores modernos (Chrome, Firefox, Safari, Edge, Opera) suportam a propriedade gap sem prefixo tanto no Grid quanto no Flexbox. Você não precisa mais de nenhum hack de margem negativa!
2. Sintaxe e Valores do gap
A propriedade abreviada gap aceita um ou dois valores para definir o espaçamento vertical e horizontal:
/* Sintaxe: gap: [row-gap] [column-gap]; */
.conteiner {
gap: 24px 16px; /* 24px entre linhas, 16px entre colunas */
}
/* Valor Único: aplica a mesma distância em ambas as direções */
.conteiner-quadrado {
gap: 20px; /* 20px entre linhas E colunas */
}
/* Propriedades Longas e Independentes */
.conteiner-detalhado {
row-gap: 32px; /* Espaço vertical entre linhas */
column-gap: 12px; /* Espaço horizontal entre colunas */
}
3. Como o gap Opera no CSS Grid
No CSS Grid, o gap atua diretamente sobre as canaletas (gutters) que separam as Grid Lines:
- Ele adiciona respiro exclusivamente entre as faixas internas da grade.
- Ele nunca adiciona espaço nas bordas externas do contêiner (entre a borda do pai e a primeira/última linha). O espaço externo continua sendo controlado por
paddingno pai. - O motor do Grid deduz o tamanho total somado de todos os gaps antes de computar as frações
fr, garantindo que o layout nunca transborde a tela. - Quando usamos
repeat(auto-fit, minmax(...)), qualquer coluna vazia que colapsar para0pxtem seugapcorrespondente também colapsado a zero automaticamente!
4. Como o gap Opera no CSS Flexbox
No Flexbox, o gap é a solução definitiva para o alinhamento de listas e botões:
- Em um contêiner com
flex-direction: row, ogapatua horizontalmente apenas entre os irmãos adjacentes. O último item encosta perfeitamente na borda direita sem sobras. - Em um contêiner com
flex-direction: column, ogapatua verticalmente apenas entre os itens empilhados. - Quando você ativa a quebra de linha com
flex-wrap: wrap, orow-gapcontrola com precisão a distância entre as linhas que caem, eliminando a necessidade de seletores condicionais complexos.
Onde o gap NÃO Funciona: A propriedade gap só é reconhecida pelo navegador em elementos com contexto de formatação estruturado: display: grid, display: inline-grid, display: flex e display: inline-flex. Aplicar gap em caixas normais com display: block ou inline-block não produzirá absolutamente nenhum efeito!
5. Matriz Comparativa: gap no Grid vs. gap no Flexbox
| Aspecto | Comportamento no CSS Grid | Comportamento no Flexbox |
|---|---|---|
| Natureza do Vão | Canaleta bidimensional rígida entre linhas de grade. | Respiro unidimensional dinâmico entre itens vizinhos. |
| Tratamento do Espaço | Descontado antes do cálculo das frações fr. |
Consumido como espaço não flexível no eixo ativo. |
| Quebra de Linhas | Controlado nativamente pela definição de linhas e colunas. | row-gap atua entre as linhas criadas por flex-wrap. |
| Bordas Externas | Zero espaço nas extremidades externas. | Zero espaço antes do 1º item e após o último. |
6. Laboratório Prático: Comparando gap no Flexbox e no Grid
No exemplo abaixo, observe como o gap resolve com pouquíssimas linhas dois desafios comuns: um formulário de cadastro em Flexbox e uma grade de métricas em CSS Grid com espaçamento assimétrico:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<title>Laboratório de Espaçamento com gap</title>
<style>
body {
font-family: 'Inter', system-ui, sans-serif;
background: #0b0f19;
color: #f8fafc;
padding: 30px;
margin: 0;
}
/* 1. FLEXBOX COM GAP (Barra de Ações e Formulário) */
.barra-acoes-flex {
display: flex;
flex-wrap: wrap;
gap: 12px; /* 12px entre os botões sem vazar nas pontas */
background: #1e293b;
padding: 16px;
border-radius: 10px;
border: 1px solid #334155;
margin-bottom: 30px;
}
.btn-acao {
background: #334155;
color: #fff;
border: none;
padding: 10px 18px;
border-radius: 6px;
font-weight: 600;
cursor: pointer;
}
.btn-destaque {
background: #2563eb;
}
/* 2. CSS GRID COM GAP ASSIMÉTRICO (row-gap diferente de column-gap) */
.grade-metricas-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 28px 16px; /* 28px vertical (row-gap) e 16px horizontal (column-gap) */
}
.card-metrica {
background: #111827;
border: 1px solid #1f2937;
border-radius: 10px;
padding: 20px;
box-shadow: 0 4px 12px rgba(0,0,0,0.3);
}
.card-metrica h4 {
margin: 0;
font-size: 0.85rem;
color: #94a3b8;
}
.card-metrica .numero {
font-size: 1.8rem;
font-weight: 800;
color: #38bdf8;
margin-top: 6px;
}
</style>
</head>
<body>
<h3 style="color:#e2e8f0; margin-top:0;">1. Barra de Ações com Flexbox (<code>gap: 12px</code>)</h3>
<div class="barra-acoes-flex">
<button class="btn-acao btn-destaque">+ Novo Projeto</button>
<button class="btn-acao">Filtrar</button>
<button class="btn-acao">Exportar PDF</button>
<button class="btn-acao">Configurações</button>
</div>
<h3 style="color:#e2e8f0;">2. Grade com CSS Grid e Gap Assimétrico (<code>gap: 28px 16px</code>)</h3>
<div class="grade-metricas-grid">
<div class="card-metrica">
<h4>Consultas API</h4>
<div class="numero">1.42M</div>
</div>
<div class="card-metrica">
<h4>Tempo Médio</h4>
<div class="numero">42ms</div>
</div>
<div class="card-metrica">
<h4>Erros HTTP</h4>
<div class="numero" style="color:#10b981;">0.00%</div>
</div>
<div class="card-metrica">
<h4>Uptime</h4>
<div class="numero">99.98%</div>
</div>
</div>
</body>
</html>
Abra este laboratório no Playground IDE e teste alterar os valores do gap para observar a separação fluida e higiênica sem alteração das margens externas:
7. Resumo e Próximos Passos
- A propriedade
gapunificou o espaçamento entre elementos no CSS Grid e no Flexbox, eliminando hacks de margem negativa. - A sintaxe
gap: [row-gap] [column-gap]permite definir espaçamentos verticais e horizontais independentes. - O
gapnunca vaza para fora das extremidades externas do contêiner, atuando exclusivamente entre os itens irmãos. - No CSS Grid, o
gapé subtraído matematicamente pelo navegador antes do cálculo de fraçõesfr. - No Flexbox, o
gapfunciona em linha única e também entre linhas quebradas porflex-wrap.
Próximo Passo: Imagine poder desenhar o mapa visual da sua página inteira em texto puro no CSS, escrevendo palavras como "header header" e "sidebar main"? Na Lição 35, conheceremos a técnica mais elegante de arquitetura web: Áreas Nomeadas com grid-template-areas!