O CSS Flexbox é um modelo de layout unidimensional que facilita a criação de designs responsivos e flexíveis. Ele simplifica a distribuição de espaço entre itens em um container e oferece controle preciso sobre o alinhamento, ordenação e tamanho dos elementos.
Neste guia completo, vamos explorar desde os fundamentos do Flexbox até técnicas avançadas, permitindo que você crie layouts modernos e adaptáveis a diferentes tamanhos de tela.
Introdução ao Flexbox
O Flexbox foi introduzido para resolver problemas comuns de alinhamento e espaçamento em layouts CSS. Com ele, você pode:
- Alinhar itens horizontal e verticalmente sem hacks.
- Distribuir espaço de forma proporcional entre itens.
- Alterar a ordem visual dos elementos sem modificar o HTML.
Por que usar o Flexbox?
- Facilidade de Uso: Sintaxe simples e intuitiva.
- Flexibilidade: Itens podem crescer ou encolher para preencher o espaço disponível.
- Responsividade: Adapta-se automaticamente a diferentes tamanhos de tela.
Conceitos Básicos
Flex Container e Flex Items
- Flex Container: O elemento pai que define um contexto flexível. É estabelecido com
display: flex;
oudisplay: inline-flex;
. - Flex Items: Os elementos filhos diretos do flex container que serão organizados no layout flexível.
Eixos Principal e Transversal
- Eixo Principal (Main Axis): Define a direção em que os itens são dispostos. Por padrão, é horizontal (da esquerda para a direita).
- Eixo Transversal (Cross Axis): Perpendicular ao eixo principal. Por padrão, é vertical (de cima para baixo).
Propriedades do Flex Container
display: flex;
Define um elemento como um flex container.
.container {
display: flex;
}
flex-direction
Determina a direção do eixo principal.
- Valores:
row
(padrão): Da esquerda para a direita.row-reverse
: Da direita para a esquerda.column
: De cima para baixo.column-reverse
: De baixo para cima.
.container {
display: flex;
flex-direction: row;
}
flex-wrap
Controla se os itens devem quebrar ou não para a próxima linha.
- Valores:
nowrap
(padrão): Todos os itens em uma única linha.wrap
: Itens quebram para uma nova linha.wrap-reverse
: Itens quebram para uma nova linha invertida.
.container {
display: flex;
flex-wrap: wrap;
}
flex-flow
Shorthand para flex-direction
e flex-wrap
.
.container {
display: flex;
flex-flow: row wrap;
}
justify-content
Alinha os itens ao longo do eixo principal.
- Valores:
flex-start
(padrão): Início do eixo.flex-end
: Final do eixo.center
: Centro do eixo.space-between
: Espaço igual entre os itens.space-around
: Espaço igual ao redor dos itens.space-evenly
: Espaçamento uniforme entre os itens.
.container {
display: flex;
justify-content: center;
}
align-items
Alinha os itens ao longo do eixo transversal.
- Valores:
stretch
(padrão): Itens esticam para preencher o container.flex-start
: Início do eixo transversal.flex-end
: Final do eixo transversal.center
: Centro do eixo transversal.baseline
: Alinha pela linha de base do texto.
.container {
display: flex;
align-items: center;
}
align-content
Alinha as linhas do flex container quando há espaço extra no eixo transversal. Funciona quando há quebra de linha (flex-wrap: wrap;
).
- Valores:
flex-start
flex-end
center
space-between
space-around
stretch
(padrão)
.container {
display: flex;
flex-wrap: wrap;
align-content: space-between;
}
Propriedades dos Flex Items
order
Controla a ordem em que os itens aparecem no container.
- Valor padrão:
0
- Valores: Inteiros positivos ou negativos.
.item {
order: 2;
}
flex-grow
Define a capacidade de um item crescer se necessário.
- Valor padrão:
0
(não cresce) - Valores: Número positivo.
.item {
flex-grow: 1;
}
flex-shrink
Define a capacidade de um item encolher se necessário.
- Valor padrão:
1
(pode encolher) - Valores: Número positivo.
.item {
flex-shrink: 0;
}
flex-basis
Define o tamanho inicial de um item antes da distribuição de espaço.
- Valores:
auto
(padrão), comprimento específico (px, %, etc.).
.item {
flex-basis: 200px;
}
flex
Shorthand para flex-grow
, flex-shrink
e flex-basis
.
/* Equivalente a flex-grow: 1; flex-shrink: 0; flex-basis: auto; */
.item {
flex: 1 0 auto;
}
/* Cresce para preencher o espaço disponível */
.item {
flex: 1;
}
align-self
Alinha individualmente um item, sobrepondo align-items
.
- Valores:
auto
(padrão)flex-start
flex-end
center
baseline
stretch
.item {
align-self: flex-end;
}
Exemplos Práticos
Criando um Menu de Navegação
HTML:
<nav class="navbar">
<a href="#">Início</a>
<a href="#">Sobre</a>
<a href="#">Serviços</a>
<a href="#">Contato</a>
</nav>
CSS:
.navbar {
display: flex;
justify-content: space-around;
background-color: #333;
}
.navbar a {
color: white;
text-decoration: none;
padding: 15px;
}
Layout de Galeria Responsiva
HTML:
<div class="gallery">
<div class="item">Imagem 1</div>
<div class="item">Imagem 2</div>
<div class="item">Imagem 3</div>
<div class="item">Imagem 4</div>
<div class="item">Imagem 5</div>
</div>
CSS:
.gallery {
display: flex;
flex-wrap: wrap;
}
.item {
flex: 1 1 calc(33.333% - 20px);
margin: 10px;
background-color: #ccc;
text-align: center;
padding: 20px;
}
@media (max-width: 768px) {
.item {
flex: 1 1 calc(50% - 20px);
}
}
@media (max-width: 480px) {
.item {
flex: 1 1 100%;
}
}
Construindo Layouts Responsivos com Flexbox
O Flexbox facilita a criação de layouts que se adaptam a diferentes tamanhos de tela sem esforço adicional.
Exemplo: Layout de Página Básica
HTML:
<div class="container">
<header class="header">Cabeçalho</header>
<nav class="sidebar">Menu Lateral</nav>
<main class="content">Conteúdo Principal</main>
<footer class="footer">Rodapé</footer>
</div>
CSS:
.container {
display: flex;
flex-direction: column;
min-height: 100vh;
}
.header, .footer {
background-color: #333;
color: white;
padding: 20px;
}
.content {
flex: 1;
padding: 20px;
}
@media (min-width: 768px) {
.container {
flex-direction: row;
}
.sidebar {
flex: 0 0 200px;
background-color: #f4f4f4;
padding: 20px;
}
.content {
flex: 1;
}
}
Comparação com Outros Métodos de Layout
Flexbox vs. CSS Grid
- Flexbox: Melhor para layouts unidimensionais (linha ou coluna). Excelente para alinhamento e distribuição de espaço entre itens.
- CSS Grid: Ideal para layouts bidimensionais (linhas e colunas). Oferece controle mais detalhado sobre o posicionamento de itens em uma grade.
Quando Usar Cada Um?
- Use Flexbox para componentes como menus, barras de navegação, galerias simples.
- Use CSS Grid para estruturas de página complexas, onde o posicionamento em duas dimensões é necessário.
Melhores Práticas
- Mantenha o HTML Semântico: Utilize tags apropriadas para melhorar a acessibilidade.
- Teste em Diferentes Navegadores: Verifique a compatibilidade, especialmente em navegadores mais antigos.
- Combine com Media Queries: Aprimore a responsividade ajustando o layout em diferentes pontos de quebra.
- Evite Excesso de Aninhamento: Simplifique a estrutura do DOM para melhor desempenho.
Recursos Adicionais
- Ferramentas Online:
- Flexbox Froggy – Jogo interativo para aprender Flexbox.
- CSS Tricks – Guia Completo do Flexbox
- Documentação Oficial:
- MDN Web Docs – Flexbox
Conclusão
O CSS Flexbox é uma ferramenta essencial para desenvolvedores web modernos. Sua capacidade de simplificar layouts complexos e torná-los responsivos sem esforço adicional o torna indispensável no desenvolvimento front-end.
Pronto para colocar em prática? Experimente aplicar o Flexbox em seus projetos e veja a diferença!