SkillsTecnológicas
Menu
Front-end

Flexbox CSS: Guia Prático com Exemplos em 2026

Aprenda Flexbox CSS do zero: eixos, alinhamento, flex-wrap, grow, shrink, basis e exemplos práticos para criar layouts responsivos e acessíveis.

Marcos RodriguesPublicado em 3 de julho de 2024Atualizado em 18 de agosto de 202614 min de leitura
Desenvolvedor reorganizando cartões de interface em telas de diferentes tamanhos

Flexbox CSS é um modelo de layout criado para organizar elementos em uma dimensão por vez: uma linha ou uma coluna.

Com ele, você consegue alinhar componentes, distribuir espaços, controlar crescimento e redução dos itens e adaptar uma interface a diferentes larguras sem recorrer a cálculos frágeis.

O segredo para usar Flexbox bem não está em decorar todas as propriedades. Está em compreender o contêiner, os itens e os dois eixos que mudam conforme flex-direction.

Quando essa lógica fica clara, centralizar elementos, montar menus, criar cards e resolver muitos problemas responsivos se torna previsível.

Neste guia, você aprenderá desde display: flex até flex-grow, flex-shrink, flex-basis, quebra de linha, espaçamento e acessibilidade.

Os exemplos podem ser copiados para um arquivo HTML e testados diretamente no navegador.

O que é Flexbox CSS?

Flexbox é o nome popular do CSS Flexible Box Layout. Ele cria um contexto de formatação no qual os filhos diretos de um elemento podem crescer, encolher, mudar de direção e ser alinhados de acordo com o espaço disponível.

A especificação do W3C para Flexible Box Layout define esse comportamento e os algoritmos de distribuição.

Seu modelo é unidimensional: trabalha principalmente com uma linha ou uma coluna por vez. Mesmo quando os itens quebram em várias linhas, cada linha distribui seu próprio espaço.

Esse detalhe diferencia Flexbox do CSS Grid e explica por que algumas grades de cards ficam desalinhadas quando são construídas apenas com flex.

Flexbox é especialmente útil para componentes orientados pelo conteúdo: menus, grupos de botões, cabeçalhos, barras de ferramentas, campos de formulário, cards e pequenos blocos de interface.

Ele pode participar de uma página maior construída com Grid, sem conflito. As ferramentas se complementam.

Eixo principal e eixo transversal

Toda decisão de alinhamento começa pelos eixos. O eixo principal é definido por flex-direction. Com o valor padrão row, ele acompanha a direção de escrita da linha.

O eixo transversal é perpendicular ao principal. Se a direção mudar para column, o principal passa a acompanhar a coluna e o transversal passa a atravessá-la.

  • justify-content distribui os itens no eixo principal.
  • align-items alinha os itens no eixo transversal.
  • align-self altera o alinhamento transversal de apenas um item.
  • align-content distribui linhas no eixo transversal quando há quebra e espaço disponível.

É melhor pensar em “início” e “fim” dos eixos do que decorar “horizontal” e “vertical”. Essa lógica continua funcionando com column, idiomas escritos da direita para a esquerda e diferentes modos de escrita.

A documentação da MDN apresenta os conceitos básicos e os eixos do Flexbox com exemplos interativos.

Cartões alinhados sobre dois eixos perpendiculares que representam o funcionamento do Flexbox
O eixo principal acompanha flex-direction; o eixo transversal cruza essa direção e orienta align-items.

Estrutura básica do Flexbox CSS

Para iniciar, aplique display: flex ao elemento pai. Os filhos diretos viram flex items; elementos mais internos continuam seguindo seu próprio layout até que outro contexto seja criado neles.

<div class="grupo">
  <article class="item">Primeiro</article>
  <article class="item">Segundo</article>
  <article class="item">Terceiro</article>
</div>
.grupo {
  display: flex;
  gap: 1rem;
}

.item {
  padding: 1rem;
  border: 1px solid #cbd5e1;
}

Sem outras declarações, os itens aparecem em uma linha, não quebram, podem encolher e ficam esticados no eixo transversal.

Esses resultados vêm dos valores iniciais: flex-direction: row, flex-wrap: nowrap, flex: 0 1 auto e align-items: stretch. Conhecer o padrão evita adicionar regras que não fazem diferença.

Propriedades do contêiner flex

As propriedades do contêiner controlam a direção, a quebra e o alinhamento do conjunto. As mais usadas são:

  • display: cria o contexto com flex ou inline-flex.
  • flex-direction: define row, row-reverse, column ou column-reverse.
  • flex-wrap: mantém uma linha com nowrap ou permite novas linhas com wrap.
  • flex-flow: combina direção e quebra, como flex-flow: row wrap.
  • justify-content: distribui espaço no eixo principal.
  • align-items: alinha os itens no eixo transversal.
  • align-content: distribui as linhas quando há várias linhas e espaço transversal.
  • gap: cria espaçamento consistente entre itens e linhas sem margens nas bordas externas.

Uma confusão frequente é esperar que align-content altere uma única linha.

Ele só se torna perceptível quando existe mais de uma flex line, normalmente com flex-wrap: wrap, e o contêiner possui espaço sobrando no eixo transversal. Para uma linha, use align-items.

Propriedades dos itens flex

As propriedades aplicadas aos filhos controlam a participação de cada item na distribuição:

  • flex-grow: indica se o item pode crescer e sua proporção na divisão do espaço positivo.
  • flex-shrink: participa da redução quando a soma das bases ultrapassa o contêiner.
  • flex-basis: informa o tamanho base considerado antes de crescer ou encolher.
  • flex: é o atalho recomendado para grow, shrink e basis.
  • align-self: substitui o alinhamento transversal apenas daquele item.
  • order: muda a ordem visual, mas não a ordem lógica do documento.

Os fatores não representam diretamente porcentagens de largura. Se dois itens possuem flex-grow: 1, eles dividem igualmente o espaço positivo restante depois que as bases e outras dimensões entram no cálculo.

Se um possui fator 2, recebe duas partes desse espaço para cada parte recebida pelo item de fator 1.

Como funciona a propriedade flex

A sintaxe completa segue a ordem flex: grow shrink basis. Escrever os três valores durante o aprendizado deixa a intenção clara:

.conteudo {
  flex: 1 1 30rem;
}

.barra-lateral {
  flex: 0 1 18rem;
}

O conteúdo pode crescer, pode encolher e parte de uma base de 30 rem. A barra lateral não cresce, mas pode encolher a partir de 18 rem.

Em um contêiner com flex-wrap: wrap, essa combinação permite que a lateral desça quando as bases não couberem de forma confortável.

flex: 1 1 0 é útil quando irmãos devem ignorar o tamanho inicial do conteúdo e dividir o espaço de modo proporcional.

flex: 1 1 auto considera o tamanho automático de cada item antes da distribuição; por isso itens com conteúdos diferentes podem terminar com larguras diferentes. flex: none equivale a 0 0 auto e impede crescimento e redução.

Como alinhar elementos com Flexbox

Para centralizar um item nos dois eixos, o padrão clássico é simples:

.painel {
  min-height: 20rem;
  display: flex;
  justify-content: center;
  align-items: center;
}

A altura mínima cria espaço transversal visível. Sem espaço livre no eixo, uma propriedade de distribuição pode parecer inativa.

Outros valores comuns de justify-content são space-between, space-around e space-evenly. Para align-items, aparecem com frequência start, end, center, stretch e baseline.

Não existe justify-self funcional para flex items porque o espaço no eixo principal é distribuído entre o grupo.

Quando apenas um item precisa se afastar dos demais, margens automáticas normalmente resolvem. A MDN detalha alinhamento, gap e margens automáticas no Flexbox.

Flex-wrap, gap e layouts responsivos

Por padrão, flex-wrap vale nowrap. Os itens tentam permanecer na mesma linha e encolhem enquanto seu conteúdo permite. Com wrap, o navegador cria novas linhas quando necessário:

.lista {
  display: flex;
  flex-wrap: wrap;
  gap: 1.25rem;
}

.lista > * {
  flex: 1 1 16rem;
}

Esse padrão cria itens flexíveis com base de 16 rem. Se houver espaço, eles crescem; quando a soma deixa de caber, quebram.

Isso pode reduzir a quantidade de breakpoints, mas não elimina media queries quando o design precisa mudar navegação, tipografia, ordem semântica ou outras decisões específicas.

Para aprofundar esse tema, consulte o guia de CSS responsivo com media queries.

gap é preferível para a distância regular entre itens porque não adiciona espaço nas bordas externas do conjunto.

Margens ainda são úteis quando um elemento precisa de comportamento individual, mas usar margens em todos os filhos costuma exigir compensações no contêiner.

Cartões flexíveis passando de uma linha larga para duas linhas em um contêiner estreito
Com flex-wrap, os itens podem criar novas linhas; cada linha distribui seu próprio espaço disponível.

Margens automáticas no Flexbox

Uma margem automática absorve o espaço livre disponível em sua direção. Isso permite separar um item do grupo sem alterar a distribuição de todos.

Em uma barra horizontal, margin-inline-start: auto empurra o item para o final da linha e respeita a direção de escrita melhor que margin-left.

.acoes {
  display: flex;
  align-items: center;
  gap: 0.75rem;
}

.acoes__perfil {
  margin-inline-start: auto;
}

Em uma coluna flexível, margin-block-start: auto pode empurrar um botão para o fim do card.

A técnica funciona quando há espaço livre; se o conteúdo ocupar todo o contêiner, a margem automática fica sem espaço para absorver.

Flexbox ou CSS Grid: qual usar?

Use Flexbox quando o problema principal estiver em uma dimensão: distribuir itens em uma barra, empilhar conteúdo em um card ou alinhar controles.

Use Grid quando linhas e colunas precisam obedecer a uma estrutura conjunta. A comparação oficial entre Flexbox e outros layouts reforça essa distinção entre uma e duas dimensões.

  • Menu horizontal: Flexbox normalmente é mais direto.
  • Grupo de botões: Flexbox distribui e alinha pelo conteúdo.
  • Card com corpo e rodapé: Flexbox em coluna resolve a altura interna.
  • Galeria alinhada por linhas e colunas: Grid tende a expressar melhor a intenção.
  • Layout de página com áreas definidas: Grid pode cuidar da estrutura, e Flexbox dos componentes.

Se você estiver atribuindo larguras artificiais aos flex items apenas para que uma linha se alinhe com a anterior, provavelmente está tentando obter um layout bidimensional.

Nesse caso, Grid reduz exceções. Já se o tamanho do conteúdo deve influenciar a distribuição, Flexbox é uma escolha natural.

O artigo sobre CSS moderno mostra como essas ferramentas convivem com container queries e outras técnicas atuais.

Exemplo 1: menu de navegação responsivo

O exemplo abaixo mantém a marca e os links alinhados, permite quebra e envia a ação principal para o final quando houver espaço:

<nav class="menu" aria-label="Navegação principal">
  <a class="menu__marca" href="/">Início</a>
  <div class="menu__links">
    <a href="/guias">Guias</a>
    <a href="/projetos">Projetos</a>
  </div>
  <a class="menu__acao" href="/contato">Contato</a>
</nav>
.menu,
.menu__links {
  display: flex;
  align-items: center;
  gap: 1rem;
}

.menu {
  flex-wrap: wrap;
  padding: 1rem;
}

.menu__acao {
  margin-inline-start: auto;
}

@media (max-width: 36rem) {
  .menu__links {
    order: 3;
    flex-basis: 100%;
  }
}

O HTML permanece em uma ordem compreensível, e a media query muda apenas a composição visual.

Em um produto real, teste navegação por teclado, foco visível e largura das áreas clicáveis.

Flexbox organiza a apresentação, mas não substitui HTML semântico nem acessibilidade.

Exemplo 2: cards flexíveis

Uma lista de cards pode crescer e quebrar sem uma largura fixa rígida:

.cards {
  display: flex;
  flex-wrap: wrap;
  gap: 1.5rem;
}

.card {
  flex: 1 1 18rem;
  min-width: 0;
  padding: 1.25rem;
  border-radius: 0.75rem;
  background: #fff;
  box-shadow: 0 0.5rem 1.5rem rgb(15 23 42 / 0.12);
}

min-width: 0 permite que um item fique menor que o tamanho mínimo implícito de seu conteúdo quando necessário.

Sem essa correção, uma URL longa, um trecho sem espaços ou outro conteúdo intrínseco pode forçar overflow mesmo com flex-shrink: 1.

Esse conjunto cria cards flexíveis, mas não garante que colunas de linhas diferentes fiquem alinhadas.

Se a grade precisa manter trilhas idênticas em todas as linhas, CSS Grid oferece controle mais apropriado. Para praticar o padrão em projetos reais, veja estes projetos frontend para aprimorar habilidades.

Exemplo 3: botão alinhado no fim do card

Quando cards possuem descrições de tamanhos diferentes, é comum querer manter a ação no rodapé. Transforme o próprio card em um contêiner flexível vertical:

.card {
  display: flex;
  flex-direction: column;
}

.card__acao {
  margin-block-start: auto;
  padding-block-start: 1rem;
}

Os elementos internos ficam empilhados, e a margem automática consome o espaço restante antes da ação.

Para que vários cards tenham a mesma altura em uma linha, o contêiner externo pode manter o comportamento padrão align-items: stretch. Evite alturas fixas quando o conteúdo puder crescer com tradução, zoom ou preferências do usuário.

Ordem visual e acessibilidade

order, row-reverse e column-reverse mudam a apresentação visual, mas não corrigem a ordem lógica do HTML. Leitores de tela e navegação sequencial podem continuar seguindo a fonte.

O próprio padrão do W3C alerta que essas propriedades não devem substituir uma ordem correta no documento.

Organize primeiro o HTML na sequência que faz sentido sem CSS. Use reordenação apenas para ajustes visuais que não prejudiquem compreensão ou foco.

Depois, teste com a tecla Tab, zoom elevado, leitor de tela quando disponível e direções de escrita relevantes. Uma interface visualmente elegante pode se tornar confusa se o foco saltar pela página em outra ordem.

Erros comuns e como corrigir

  • Aplicar propriedades no elemento errado: direção e alinhamento do grupo pertencem ao contêiner; grow, shrink, basis e align-self pertencem aos itens.
  • Confundir os eixos: verifique flex-direction antes de escolher justify ou align.
  • Esperar quebra automática: o valor inicial é nowrap; declare flex-wrap: wrap.
  • Usar align-content em uma linha: use align-items para itens; align-content precisa de linhas e espaço transversal.
  • Definir apenas width e ignorar flex-basis: o algoritmo usa a base flexível; declare a intenção no atalho flex.
  • Encontrar overflow em conteúdo longo: experimente min-width: 0, quebra de palavras apropriada e inspeção do tamanho intrínseco.
  • Usar order para consertar HTML: corrija a sequência na fonte para manter foco e leitura coerentes.
  • Forçar Grid com Flexbox: se linhas e colunas precisam se alinhar juntas, escolha Grid.

Outro erro é empilhar muitas exceções sem compreender o espaço disponível. Remova temporariamente larguras, min-width, overflow e regras flex dos itens.

Reintroduza uma declaração por vez e observe qual delas altera a base, a redução ou o alinhamento.

Como depurar Flexbox no navegador

Os navegadores modernos destacam flex containers nas ferramentas de desenvolvimento.

Inspecione o pai, confirme display: flex nos estilos calculados e ative a sobreposição do layout.

Ela mostra linhas, espaços e dimensões que nem sempre são óbvios no CSS.

  1. Selecione o contêiner e confirme sua largura e altura reais.
  2. Identifique a direção do eixo principal e se existe quebra.
  3. Observe quais filhos são itens diretos; um wrapper intermediário muda o resultado.
  4. Confira o valor calculado de flex, min-width, max-width e overflow de cada item.
  5. Reduza e aumente a viewport para localizar o ponto de falha, não apenas um dispositivo específico.
  6. Teste conteúdo maior, zoom e textos longos antes de considerar o componente pronto.

Para quem está consolidando fundamentos, o roteiro de cinco passos para dominar CSS ajuda a transformar inspeção e experimentação em prática consistente.

Boas práticas para CSS sustentável

  • Use HTML semântico e uma ordem lógica antes de pensar na apresentação.
  • Escolha Flexbox pelo problema de layout, não por hábito.
  • Prefira propriedades lógicas, como margin-inline-start, quando a direção de escrita importa.
  • Use gap para espaçamento do conjunto e margens para necessidades individuais.
  • Escreva o atalho flex com intenção clara, especialmente em componentes compartilhados.
  • Evite alturas fixas para blocos com conteúdo variável.
  • Defina breakpoints pelo ponto em que o conteúdo deixa de funcionar, não pelo nome de um aparelho.
  • Teste teclado, zoom, textos longos e diferentes larguras.

Também vale manter cada componente responsável por seu próprio layout.

A página pode usar Grid, um cabeçalho pode usar Flexbox e um grupo interno pode criar outro flex container.

Essa composição é mais sustentável que uma regra global tentando controlar todos os descendentes.

Se você ainda está montando sua base, o guia com dicas para aprender HTML, CSS e JavaScript organiza a sequência de estudo.

Frameworks podem acelerar componentes, mas não eliminam a necessidade de entender o algoritmo.

Ao dominar Flexbox, você consegue interpretar utilitários, corrigir conflitos e decidir quando o CSS direto é mais simples. Veja a comparação entre framework CSS e CSS puro para avaliar esse equilíbrio.

Perguntas frequentes sobre Flexbox CSS

Flexbox substitui CSS Grid?

Não. Flexbox resolve melhor layouts em uma dimensão, enquanto Grid controla linhas e colunas em conjunto.

Eles podem ser usados na mesma interface: Grid na estrutura da página e Flexbox no alinhamento interno dos componentes.

Por que justify-content não funciona?

Geralmente não existe espaço livre no eixo principal, a propriedade foi aplicada a um item em vez do contêiner ou flex-direction mudou o eixo esperado. Inspecione o tamanho real do contêiner e as bases dos itens.

Qual é a diferença entre align-items e align-content?

align-items alinha os itens dentro de sua linha no eixo transversal. align-content distribui o conjunto de linhas nesse eixo e só produz efeito visível quando há múltiplas linhas e espaço transversal sobrando.

É preciso usar media query com Flexbox?

Nem sempre. flex-wrap, bases flexíveis e gap resolvem muitas adaptações guiadas pelo conteúdo. Media queries continuam úteis quando a composição, navegação ou outras decisões precisam mudar em determinado espaço disponível.

Conclusão

Flexbox CSS se torna muito mais simples quando você pensa em contêiner, itens e eixos. justify-content trabalha no eixo principal; align-items, no transversal; flex controla base, crescimento e redução; wrap permite novas linhas; e gap mantém o espaçamento consistente.

Comece recriando o menu, os cards e o botão alinhado deste guia. Em seguida, altere flex-direction, as bases e o conteúdo para observar o algoritmo.

A prática de inspecionar o espaço disponível e os valores calculados ensina mais que decorar propriedades isoladas — e prepara você para combinar Flexbox, Grid e responsividade com decisões conscientes.