Home > Blog > Desenvolvimento Web
Desenvolvimento Web
Programação

O que é Flexbox? A Revolução no Layout Web

Atualizado em: 19 de dezembro de 2024

texto escrito "CSS Flexbox" com o logo do CSS

Introdução ao Flexbox

Você já se perguntou o que é flexbox e por que tantos desenvolvedores web estão falando sobre isso? Se sim, você está no lugar certo! O Flexbox, ou Flexible Box Layout, é uma ferramenta poderosa do CSS que veio para revolucionar a maneira como criamos layouts para páginas web.

Imagine que você está montando um quebra-cabeça, mas as peças podem se ajustar automaticamente para caber perfeitamente no espaço disponível. Legal, né? É mais ou menos assim que o flexbox funciona no mundo do design web. Ele permite que você crie layouts flexíveis e responsivos com muito mais facilidade do que as técnicas tradicionais.

Antes do flexbox, fazer layouts complexos e responsivos era um verdadeiro desafio. Os desenvolvedores tinham que usar truques com float, position e outras propriedades CSS que nem sempre davam o resultado esperado. Era como tentar encaixar um quadrado em um buraco redondo – dava trabalho e nem sempre ficava perfeito.

Mas aí chegou o flexbox para salvar o dia! Com ele, podemos criar designs que se adaptam a diferentes tamanhos de tela sem quebrar o layout. É como ter um super-herói do CSS trabalhando para você.

O flexbox é especialmente útil quando você precisa:

  • Alinhar elementos na vertical e na horizontal
  • Distribuir espaço entre itens de forma inteligente
  • Mudar a ordem dos elementos sem alterar o HTML
  • Criar layouts que se ajustam conforme o conteúdo muda

Uma das melhores coisas sobre o que é flexbox é que ele simplifica muito o código. Você não precisa mais de um monte de divs aninhadas ou classes complicadas para fazer um layout funcionar. Com apenas algumas propriedades, você consegue resultados incríveis.

Mas calma lá! Antes de sair usando flexbox em tudo, é importante entender como ele funciona. Nos próximos tópicos, vamos mergulhar fundo nos conceitos, propriedades e truques do flexbox. Você vai ver que, com um pouco de prática, criar layouts flexíveis e responsivos vai se tornar uma tarefa muito mais fácil e divertida.

Então, prepare-se para uma jornada emocionante pelo mundo do flexbox. Você está prestes a descobrir uma ferramenta que vai mudar a forma como você pensa e cria layouts web. Vamos lá?

Conceitos básicos do Flexbox

Agora que entendemos o que é flexbox de forma geral, vamos nos aprofundar nos conceitos básicos, acompanhados de exemplos de código para tornar tudo mais claro.

Container Flex

O primeiro conceito importante é o de container flex. Este é o elemento pai que vai conter todos os itens que queremos organizar com flexbox. Para criar um container flex, usamos a propriedade display: flex; ou display: inline-flex;.

HTML
<div class="container">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
</div>
CSS
.container {
  display: flex;
}

Itens Flex

Dentro do container flex, temos os itens flex. Estes são os filhos diretos do container, os elementos que vamos organizar.

Eixos

O flexbox trabalha com dois eixos:

  1. Eixo principal (main axis): Por padrão, é o eixo horizontal, da esquerda para a direita.
  2. Eixo transversal (cross axis): É perpendicular ao eixo principal. Por padrão, é o eixo vertical, de cima para baixo.

Podemos mudar a direção desses eixos usando a propriedade flex-direction:

CSS
.container {
  display: flex;
  flex-direction: row; /* padrão: horizontal */
  /* Outras opções:
  flex-direction: column; /* vertical */
  flex-direction: row-reverse; /* horizontal invertido */
  flex-direction: column-reverse; /* vertical invertido */
  */
}

Linhas e Colunas Flex

Quando os itens não cabem em uma única linha (ou coluna), eles podem quebrar para a próxima. Isso é controlado pela propriedade flex-wrap:

CSS
.container {
  display: flex;
  flex-wrap: wrap;
  /* Outras opções:
  flex-wrap: nowrap; /* padrão: não quebra */
  flex-wrap: wrap-reverse; /* quebra na direção oposta */
  */
}

Espaço Disponível

O flexbox é ótimo em distribuir o espaço extra entre os itens. Isso é controlado principalmente pelas propriedades justify-content (para o eixo principal) e align-items (para o eixo transversal):

CSS
.container {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

Tamanho Base e Tamanho Flexível

O tamanho base é o tamanho inicial de um item antes do flexbox fazer sua mágica. O tamanho flexível é quanto esse item pode crescer ou encolher.

CSS
.item {
  flex-basis: 100px; /* tamanho base */
  flex-grow: 1; /* fator de crescimento */
  flex-shrink: 1; /* fator de encolhimento */
}

Alinhamento

O flexbox oferece várias formas de alinhar os itens. Além do justify-content e align-items mencionados anteriormente, temos o align-self para itens individuais:

CSS
.container {
  display: flex;
  align-items: center; /* alinhamento padrão para todos os itens */
}

.item-especial {
  align-self: flex-start; /* alinhamento específico para este item */
}

Vamos ver um exemplo que combina vários desses conceitos:

HTML
<div class="container">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
  <div class="item">4</div>
  <div class="item">5</div>
</div>
CSS
.container {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  justify-content: space-around;
  align-items: center;
  height: 200px;
  background-color: #f0f0f0;
}

.item {
  flex-basis: 100px;
  height: 100px;
  margin: 10px;
  background-color: #3498db;
  color: white;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 24px;
}

.item:nth-child(odd) {
  align-self: flex-start;
}

.item:nth-child(even) {
  align-self: flex-end;
}

Neste exemplo, criamos um container flex que:

  • Organiza os itens em linha (flex-direction: row)
  • Permite que os itens quebrem para a próxima linha se necessário (flex-wrap: wrap)
  • Distribui o espaço em torno dos itens (justify-content: space-around)
  • Centraliza os itens verticalmente (align-items: center)

Os itens têm um tamanho base de 100px, e usamos align-self para posicionar os itens ímpares no topo e os pares na base do container.

Entender esses conceitos básicos é crucial para dominar o que é flexbox. Eles formam a base sobre a qual vamos construir layouts incríveis e responsivos. Com esses conceitos em mente e os exemplos de código para referência, você está bem equipado para começar a experimentar e criar seus próprios layouts flexíveis. as propriedades específicas que usamos para controlar o comportamento do container flex e dos itens flex. Prepare-se para dar superpoderes aos seus layouts!

Propriedades do container Flex

Agora que entendemos os conceitos básicos do que é flexbox, vamos explorar as propriedades que podemos usar no container flex. Estas propriedades determinam como os itens flex vão se comportar dentro do container.

display

Esta é a propriedade que transforma um elemento em um container flex.

CSS
.container {
  display: flex;
  /* ou */
  display: inline-flex;
}

flex-direction

Esta propriedade define o eixo principal do container.

CSS
.container {
  display: flex;
  flex-direction: row; /* padrão: da esquerda para a direita */
  /* Outras opções:
  flex-direction: row-reverse; /* da direita para a esquerda */
  flex-direction: column; /* de cima para baixo */
  flex-direction: column-reverse; /* de baixo para cima */
  */
}

Exemplo prático:

HTML
<div class="container">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
</div>
CSS
.container {
  display: flex;
  flex-direction: column;
  height: 300px;
  background-color: #f0f0f0;
}

.item {
  padding: 20px;
  background-color: #3498db;
  color: white;
  margin: 10px;
}

flex-wrap

Esta propriedade determina se os itens devem ser forçados em uma única linha ou se podem fluir para várias linhas.

CSS
.container {
  display: flex;
  flex-wrap: nowrap; /* padrão: todos os itens em uma linha */
  /* Outras opções:
  flex-wrap: wrap; /* itens quebram em várias linhas, de cima para baixo */
  flex-wrap: wrap-reverse; /* itens quebram em várias linhas, de baixo para cima */
  */
}

Exemplo:

CSS
.container {
  display: flex;
  flex-wrap: wrap;
  width: 300px;
}

.item {
  width: 100px;
  height: 100px;
  background-color: #3498db;
  margin: 5px;
}

justify-content

Esta propriedade alinha os itens ao longo do eixo principal.

CSS
.container {
  display: flex;
  justify-content: flex-start; /* padrão: itens no início do container */
  /* Outras opções:
  justify-content: flex-end; /* itens no final do container */
  justify-content: center; /* itens centralizados */
  justify-content: space-between; /* itens distribuídos uniformemente, primeiro no início, último no final */
  justify-content: space-around; /* itens distribuídos uniformemente com espaço igual ao redor */
  justify-content: space-evenly; /* itens distribuídos uniformemente com espaço igual entre eles */
  */
}

Exemplo:

CSS
.container {
  display: flex;
  justify-content: space-between;
  height: 200px;
  background-color: #f0f0f0;
}

.item {
  width: 50px;
  height: 50px;
  background-color: #3498db;
  color: white;
  display: flex;
  justify-content: center;
  align-items: center;
}

align-items

Esta propriedade alinha os itens ao longo do eixo transversal.

CSS
.container {
  display: flex;
  align-items: stretch; /* padrão: itens esticados para preencher o container */
  /* Outras opções:
  align-items: flex-start; /* itens no início do eixo transversal */
  align-items: flex-end; /* itens no final do eixo transversal */
  align-items: center; /* itens centralizados no eixo transversal */
  align-items: baseline; /* itens alinhados pela linha de base do texto */
  */
}

Exemplo:

CSS
.container {
  display: flex;
  align-items: center;
  height: 200px;
  background-color: #f0f0f0;
}

.item {
  width: 50px;
  height: 50px;
  background-color: #3498db;
  color: white;
  margin: 0 10px;
}

.item:nth-child(2) {
  height: 100px;
}

align-content

Esta propriedade é usada quando há várias linhas de itens e controla como as linhas são espaçadas em relação umas às outras.

CSS
.container {
  display: flex;
  flex-wrap: wrap;
  align-content: flex-start; /* linhas agrupadas no início */
  /* Outras opções:
  align-content: flex-end; /* linhas agrupadas no final */
  align-content: center; /* linhas agrupadas no centro */
  align-content: space-between; /* linhas distribuídas uniformemente */
  align-content: space-around; /* linhas distribuídas uniformemente com espaço em volta */
  align-content: stretch; /* linhas esticadas para ocupar o espaço (padrão) */
  */
}

Exemplo:

CSS
.container {
  display: flex;
  flex-wrap: wrap;
  align-content: space-between;
  height: 400px;
  background-color: #f0f0f0;
}

.item {
  width: 100px;
  height: 100px;
  background-color: #3498db;
  color: white;
  margin: 5px;
  display: flex;
  justify-content: center;
  align-items: center;
}

Essas propriedades do container flex são a chave para criar layouts flexíveis e responsivos. Elas permitem que você controle como os itens se comportam dentro do container, adaptando-se a diferentes tamanhos de tela e conteúdos.

Propriedades dos itens Flex

Agora que já entendemos o que é flexbox e como controlar o container flex, vamos mergulhar nas propriedades que podemos aplicar aos itens flex individuais. Essas propriedades nos dão um controle ainda mais refinado sobre como cada elemento se comporta dentro do layout flexbox.

flex-grow

A propriedade flex-grow determina quanto um item flex vai crescer em relação aos outros itens quando houver espaço extra no container. O valor padrão é 0, o que significa que o item não vai crescer.

CSS
.item {
  flex-grow: 1; /* Este item vai crescer */
}
.item-grande {
  flex-grow: 2; /* Este item vai crescer duas vezes mais que o anterior */
}

flex-shrink

A propriedade flex-shrink controla quanto um item vai encolher em relação aos outros quando não há espaço suficiente no container. O valor padrão é 1.

CSS
.item {
  flex-shrink: 1; /* Comportamento padrão de encolhimento */
}
.item-rigido {
  flex-shrink: 0; /* Este item não vai encolher */
}

flex-basis

A propriedade flex-basis define o tamanho inicial de um item flex antes que o espaço extra seja distribuído.

CSS
.item {
  flex-basis: 200px; /* Tamanho inicial de 200 pixels */
}
.item-auto {
  flex-basis: auto; /* Tamanho baseado no conteúdo */
}

flex (abreviação)

A propriedade flex é uma forma abreviada de definir flex-grow, flex-shrink e flex-basis de uma vez.

CSS
.item {
  flex: 1 0 auto; /* flex-grow: 1, flex-shrink: 0, flex-basis: auto */
}

align-self

A propriedade align-self permite sobrescrever o alinhamento definido pelo align-items do container para um item específico.

CSS
.container {
  display: flex;
  align-items: center; /* Alinhamento padrão para todos os itens */
}
.item-topo {
  align-self: flex-start; /* Este item será alinhado ao topo */
}

order

A propriedade order permite mudar a ordem dos itens sem alterar o HTML.

CSS
.item-1 {
  order: 2; /* Este item aparecerá depois do item-2 */
}
.item-2 {
  order: 1; /* Este item aparecerá antes do item-1 */
}

Exemplo prático

Vamos ver um exemplo que combina várias dessas propriedades:

HTML
<div class="container">
  <div class="item item-1">Item 1</div>
  <div class="item item-2">Item 2</div>
  <div class="item item-3">Item 3</div>
</div>
CSS
.container {
  display: flex;
  height: 300px;
  background-color: #f0f0f0;
}

.item {
  padding: 20px;
  background-color: #3498db;
  color: white;
  margin: 10px;
}

.item-1 {
  flex: 1 1 100px; /* Cresce e encolhe, base de 100px */
  order: 2;
}

.item-2 {
  flex: 2 0 150px; /* Cresce duas vezes mais que item-1, não encolhe, base de 150px */
  align-self: center;
  order: 1;
}

.item-3 {
  flex: 1 1 100px;
  align-self: flex-end;
  order: 3;
}

Neste exemplo, criamos um layout flexbox onde:

  • O item 2 aparece primeiro (devido ao order: 1) e ocupa mais espaço (flex-grow: 2).
  • O item 1 vem em seguida, cresce normalmente e pode encolher se necessário.
  • O item 3 aparece por último, alinhado à base do container.

Entender o que é flexbox e como usar essas propriedades dos itens flex dá a você um controle incrível sobre seu layout. Você pode fazer itens crescerem, encolherem, se alinharem de forma única e até mudar de ordem, tudo isso sem alterar a estrutura HTML.

Vantagens do uso do Flexbox

Entender o que é flexbox e como usá-lo traz uma série de benefícios para o desenvolvimento web. Vamos explorar algumas das principais vantagens:

1. Simplificação do código

O flexbox reduz significativamente a quantidade de código necessário para criar layouts complexos. Veja um exemplo comparativo:

Antes do flexbox:

CSS
.container {
  overflow: hidden;
}
.item {
  float: left;
  width: 33.33%;
  margin-bottom: 20px;
}
.item:nth-child(3n+1) {
  clear: left;
}

Com flexbox:

CSS
.container {
  display: flex;
  flex-wrap: wrap;
}
.item {
  flex: 0 0 33.33%;
  margin-bottom: 20px;
}

2. Alinhamento vertical simplificado

O flexbox torna o alinhamento vertical, algo historicamente complicado em CSS, muito mais simples:

CSS
.container {
  display: flex;
  align-items: center;
  height: 100vh;
}

3. Ordem flexível dos elementos

Com o flexbox, você pode alterar a ordem visual dos elementos sem modificar o HTML:

CSS
.item1 { order: 2; }
.item2 { order: 3; }
.item3 { order: 1; }

4. Distribuição de espaço automática

O flexbox facilita a distribuição de espaço entre os elementos:

CSS
.container {
  display: flex;
  justify-content: space-between;
}

5. Flexibilidade e responsividade

O flexbox permite criar layouts que se adaptam facilmente a diferentes tamanhos de tela:

CSS
.container {
  display: flex;
  flex-wrap: wrap;
}
.item {
  flex: 1 1 200px;
}

6. Controle de crescimento e encolhimento

Você pode controlar como os itens crescem ou encolhem em relação uns aos outros:

CSS
.item-fixo { flex: 0 0 100px; }
.item-flexivel { flex: 1 1 auto; }

7. Centralização perfeita

Centralizar elementos tanto horizontal quanto verticalmente se torna trivial:

CSS
.container {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
}

8. Layouts dinâmicos

O flexbox permite criar layouts que se ajustam automaticamente ao conteúdo:

CSS
.container {
  display: flex;
}
.sidebar {
  flex: 0 0 200px;
}
.content {
  flex: 1;
}

9. Compatibilidade com diferentes navegadores

O flexbox é amplamente suportado em navegadores modernos, tornando-o uma escolha confiável para layouts responsivos.

10. Facilidade de aprendizado e uso

Apesar de poderoso, o conceito básico do que é flexbox é relativamente simples de entender e aplicar, especialmente em comparação com técnicas mais antigas de layout.

Essas vantagens fazem do flexbox uma ferramenta essencial no arsenal de qualquer desenvolvedor web moderno. Ele simplifica tarefas que antes eram complexas, permite maior criatividade no design e melhora a eficiência do desenvolvimento.

No entanto, é importante lembrar que, como qualquer ferramenta, o flexbox tem seus casos de uso ideais. Para layouts mais complexos em duas dimensões, por exemplo, o CSS Grid pode ser uma opção melhor. O segredo é entender o que é flexbox, suas forças e quando usá-lo para obter o máximo benefício.

Compatibilidade e suporte dos navegadores

Entender o que é flexbox é importante, mas é igualmente crucial saber como ele é suportado pelos diferentes navegadores. Felizmente, o flexbox tem um excelente suporte nos navegadores modernos, mas ainda existem algumas considerações a serem feitas.

Suporte atual

A boa notícia é que o flexbox é amplamente suportado em todos os navegadores modernos. Isso inclui:

  • Chrome 29+
  • Firefox 22+
  • Safari 6.1+
  • Opera 12.1+
  • Internet Explorer 11+
  • Edge (todas as versões)
  • iOS Safari 7.1+
  • Android Browser 4.4+

Esses números indicam que a grande maioria dos usuários da web pode aproveitar layouts baseados em flexbox sem problemas.

Prefixos de fornecedor

Em versões mais antigas de alguns navegadores, você pode precisar usar prefixos de fornecedor. No entanto, para a maioria dos casos de uso modernos, isso não é mais necessário. Se você precisar dar suporte a navegadores muito antigos, considere usar um autoprefixer em seu processo de build.

Internet Explorer

O Internet Explorer 11 suporta flexbox, mas com algumas peculiaridades. Por exemplo, ele não suporta a propriedade flex-wrap corretamente em alguns casos. Se você precisar dar suporte ao IE11, é recomendável testar cuidadosamente seus layouts flexbox neste navegador.

Ferramentas de detecção

Para verificar se o flexbox é suportado, você pode usar a detecção de recursos em CSS:

CSS
@supports (display: flex) {
  .container {
    display: flex;
  }
}

Ou em JavaScript:

JavaScript
if ('flex' in document.documentElement.style) {
  // Flexbox é suportado
}

Fallbacks

Para navegadores que não suportam flexbox, é uma boa prática fornecer um fallback. Isso geralmente envolve usar técnicas de layout mais antigas como float ou inline-block:

CSS
.container {
  display: block; /* Fallback para navegadores antigos */
}

.container > * {
  display: inline-block;
  width: 33.33%;
}

@supports (display: flex) {
  .container {
    display: flex;
  }

  .container > * {
    flex: 1;
    width: auto;
  }
}

Considerações de desempenho

Em geral, o flexbox tem um bom desempenho. No entanto, em layouts muito complexos com muitos itens flexíveis, você pode notar alguma lentidão em dispositivos mais antigos. Nestes casos, considere simplificar seu layout ou usar técnicas alternativas para partes específicas do design.

Flexbox vs. Grid

Enquanto o flexbox é excelente para layouts unidimensionais, o CSS Grid é mais adequado para layouts bidimensionais. O suporte ao Grid é ligeiramente menor que o do flexbox, mas ainda é muito bom em navegadores modernos. Considere usar ambos em conjunto para criar layouts complexos e responsivos.

CSS
.page {
  display: grid;
  grid-template-columns: 1fr 3fr;
}

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

.main-content {
  display: flex;
  flex-wrap: wrap;
}

Entender o que é flexbox e como ele é suportado pelos navegadores é crucial para criar layouts web robustos e responsivos. Com seu amplo suporte e flexibilidade, o flexbox é uma ferramenta poderosa no arsenal de qualquer desenvolvedor web moderno.

Ranking dos 10 Melhores Cursos de Programação de 2025

Descubra os melhores cursos de programação. Aprenda a escolher o curso ideal para iniciar ou avançar na carreira de desenvolvedor

Os comentários estão desativados.

POSTS RELACIONADOS

Ver todos

Seta para a direita

Quer se Tornar um Programador de Sucesso?

Descubra os melhores cursos de programação para acelerar sua carreira e aprender do jeito certo!