
CSS Grid e Flexbox na prática: quando usar cada um
Conteúdo educativo. Sem patrocínio das ferramentas citadas. As recomendações refletem uso comum no mercado e não constituem indicação de compra ou contratação. Para decisões profissionais específicas, considere consultoria especializada.
Grid e Flexbox não competem — complementam. Flexbox resolve layout unidimensional (linha ou coluna). Grid resolve layout bidimensional (linhas e colunas ao mesmo tempo). Na prática, 90% dos sites modernos usam Grid para o esqueleto da página e Flexbox para alinhar itens dentro de cada célula. Este artigo traz código real, padrões de projeto e a tabela decisiva para parar de sofrer com CSS.
Comparação direta
| Característica | Flexbox | Grid |
|---|---|---|
| Dimensão | 1D (linha OU coluna) | 2D (linha E coluna) |
| Espaço sobrando | Distribui entre itens (flex-grow) | Distribui entre trilhas (fr) |
| Alinhamento | justify-content / align-items no container | justify-items / align-items nas células |
| Gap | gap (desde 2020, todos os navegadores) | gap (mesma sintaxe) |
| Caso de uso típico | Navbar, card footer, botões em linha | Página inteira, galeria, dashboard |
| Browser support | IE 11 (parcial), todos os modernos | Todos os modernos (Edge 16+, 2017) |
Flexbox: o canivete suíço de componentes
Flexbox foi projetado para distribuir espaço entre itens em um único eixo. O container define o eixo principal (flex-direction: row ou column) e os itens respondem com flex-grow, flex-shrink e flex-basis.
Padrão: navbar com espaço entre marca e links
.navbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
padding: 0.75rem 1.5rem;
}
.navbar .links {
display: flex;
gap: 1rem;
list-style: none;
}Padrão: card com footer alinhado ao final
.card {
display: flex;
flex-direction: column;
height: 100%;
}
.card .content {
flex: 1 1 auto; /* ocupa o espaço restante */
}
.card .footer {
flex: 0 0 auto; /* mantém tamanho natural */
}A propriedade flex é o atalho para flex-grow, flex-shrink e flex-basis, nessa ordem. flex: 1 1 auto significa: cresça se houver espaço, encolha se necessário, base inicial é o tamanho do conteúdo. Para botões de mesmo tamanho independente do texto, use flex: 1 1 0 (ou flex: 1).
Propriedades que confundem: justify-content vs align-items
- justify-content alinha no eixo principal (row = horizontal, column = vertical).
- align-items alinha no eixo transversal (row = vertical, column = horizontal).
- Quando flex-direction muda para column, justify-content passa a controlar a vertical e align-items a horizontal — o que muitos devs esquecem.
Grid: layout de página sem media queries
Grid permite definir trilhas (tracks) explícitas e posicionar itens em células nomeadas. A unidade fr distribui espaço restante proporcionalmente. A função minmax() impede que colunas fiquem menores que um limite, criando responsividade intrínseca.
Padrão: layout clássico de aplicação (header, sidebar, main, footer)
.app {
display: grid;
grid-template-columns: 240px 1fr;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
min-height: 100vh;
gap: 0;
}
.app-header { grid-area: header; }
.app-sidebar { grid-area: sidebar; }
.app-main { grid-area: main; }
.app-footer { grid-area: footer; }Padrão: galeria responsiva sem media queries
.gallery {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 1.5rem;
}auto-fit expande as colunas para preencher a linha; se sobrar espaço, divide entre as existentes. minmax(280px, 1fr) garante que cada item tenha no mínimo 280px de largura. Quando a tela diminui, o navegador automaticamente quebra para menos colunas — sem escrever @media.
Subgrid (navegadores modernos, 2023+)
Subgrid permite que um item Grid filho herde as trilhas do pai. Útil quando cards precisam alinhar títulos, descrições e botões entre si mesmo com conteúdos de tamanhos diferentes. Suporte: Firefox desde 2019, Chrome/Edge 117+ (2023), Safari 16+ (2022).
.card-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1.5rem;
}
.card {
display: grid;
grid-template-rows: subgrid;
grid-row: span 3; /* herda 3 trilhas do pai */
gap: 0.5rem;
}Quando usar Grid, quando usar Flexbox
- Use Flexbox quando o layout é linear: botões em linha, tags, itens de menu, alinhar ícone + texto, centralizar um modal na tela.
- Use Grid quando o layout tem linhas e colunas interdependentes: dashboard com cards, galeria de imagens, formulário com labels e inputs alinhados em grade.
- Combine os dois: Grid define a estrutura macro da página; Flexbox alinha elementos dentro de cada célula (header, card, sidebar item).
- Evite usar Flexbox para layouts de página inteira com wrap — o algoritmo de quebra de linha do Flexbox é menos previsível que o Grid para 2D.
Container Queries: o próximo passo
Media queries olham o viewport. Container queries olham o tamanho do elemento pai. Isso permite que um componente reaja ao espaço disponível onde ele foi inserido, independente da tela. Suporte: todos os navegadores modernos desde 2023 (Chrome 105+, Safari 16+, Firefox 110+).
.card-wrapper {
container-type: inline-size;
}
@container (min-width: 400px) {
.card { display: flex; gap: 1rem; }
.card .media { flex: 0 0 120px; }
}Container queries funcionam especialmente bem com Grid: o pai define a estrutura e o container, o filho se adapta ao espaço que recebeu.
Perguntas frequentes
+Grid substitui o Flexbox?
Não. Grid é para layout bidimensional (linhas + colunas ao mesmo tempo). Flexbox é para layout unidimensional (uma linha ou uma coluna). Na maioria dos projetos modernos, os dois coexistem: Grid para o esqueleto da página, Flexbox para componentes internos.
+Por que meu grid-template-areas não funciona?
Verifique três coisas: (1) o número de células em cada string deve ser igual ao número de colunas definido em grid-template-columns; (2) cada área nomeada deve ser um retângulo contíguo (sem Ls ou formatos irregulares); (3) não use caracteres especiais nos nomes de área.
+Qual a diferença entre auto-fit e auto-fill?
auto-fit estica as colunas existentes para preencher a linha inteira; colunas vazias desaparecem. auto-fill mantém colunas vazias reservadas, o que pode deixar espaço em branco na direita. Para galerias responsivas, auto-fit é quase sempre o comportamento desejado.
+O gap do Flexbox e do Grid é o mesmo?
Sim, desde 2020 a propriedade gap (e row-gap / column-gap) é unificada entre Grid, Flexbox e Multi-column Layout. Antes, Flexbox usava apenas margin nos itens. Hoje gap: 1rem funciona em ambos.
+Subgrid já pode ser usado em produção?
Sim, se seu público usa navegadores atualizados. Chrome/Edge 117+ (set/2023), Safari 16+ (2022), Firefox 113+. Para suporte a navegadores mais antigos, use Grid normal com trilhas explícitas iguais no pai e nos filhos como fallback.
Fontes consultadas
- CSS Grid Layout — MDN Web Docs
- CSS Flexible Box Layout — MDN Web Docs
- Grid by Example — Rachel Andrew
- A Complete Guide to Flexbox — CSS-Tricks
- A Complete Guide to CSS Grid — CSS-Tricks
- Can I use — CSS Subgrid
Revisão editorial: publicado em . Última revisão em . Conteúdo educativo, sem patrocínio das ferramentas citadas.
Leia também

Como Começar na Programação do Zero em 2026: Guia Definitivo
Roteiro completo para quem quer entrar na programação em 2026: escolha de linguagem, setup de ambiente, lógica de programação, primeiros projetos, comunidades e como evitar armadilhas comuns de iniciantes.

HTML, CSS e JavaScript: O Trio Essencial da Web Moderna
Domine os três pilares do desenvolvimento web: HTML semântico para estrutura, CSS moderno para estilo e layout responsivo, e JavaScript para interatividade, manipulação do DOM e consumo de APIs.

Git e GitHub Básico: Controle de Versão para Quem Coda
Guia prático de Git e GitHub para iniciantes: instalação, commits, branches, merge, rebase, pull requests, resolução de conflitos e fluxos de trabalho profissionais em equipe.