icardb
CSS Grid e Flexbox na prática: quando usar cada um
Voltar para artigosPROGRAMAÇÃO

CSS Grid e Flexbox na prática: quando usar cada um

Por Equipe Editorial Icardb 7 min de leitura

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ísticaFlexboxGrid
Dimensão1D (linha OU coluna)2D (linha E coluna)
Espaço sobrandoDistribui entre itens (flex-grow)Distribui entre trilhas (fr)
Alinhamentojustify-content / align-items no containerjustify-items / align-items nas células
Gapgap (desde 2020, todos os navegadores)gap (mesma sintaxe)
Caso de uso típicoNavbar, card footer, botões em linhaPágina inteira, galeria, dashboard
Browser supportIE 11 (parcial), todos os modernosTodos 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

css
.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

css
.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)

css
.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

css
.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).

css
.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+).

css
.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

Revisão editorial: publicado em . Última revisão em . Conteúdo educativo, sem patrocínio das ferramentas citadas.

Crédito da imagem: Ilustração editorial: Equipe Icardb

Leia também