📐 Capítulo 09: Layout Unidimensional com Flexbox no CSS3
Módulo 04: HTML5 e CSS3 Moderno • Bloco 3: Layouts Modernos: Flexbox & CSS Grid
🗺️ Mapa Conceitual do Capítulo
flowchart TD
subgraph FLEX_AXES["A Geometria dos Dois Eixos Ortogonais"]
DIR["flex-direction: row | column\n(Define a orientação do Eixo Principal)"]
MAIN_AXIS["Eixo Principal (Main Axis)\nAlinhamento via justify-content"]
CROSS_AXIS["Eixo Transversal (Cross Axis)\nAlinhamento via align-items & align-content"]
DIR --> MAIN_AXIS
DIR --> CROSS_AXIS
end
subgraph CONTAINER_CONTROLS["Diretivas do Flex Container"]
JUSTIFY["justify-content: start · center · space-between · space-evenly"]
ALIGN_I["align-items: stretch · center · baseline"]
WRAP_GAP["flex-wrap: wrap & gap (row-gap / column-gap)"]
end
subgraph ITEM_ALGORITHM["O Algoritmo de Dimensionamento dos Itens"]
GROW["flex-grow (Absorção de Espaço Livre Positivo)"]
SHRINK["flex-shrink (Ponderação de Compressão de Espaço Negativo)"]
BASIS["flex-basis (Tamanho Inicial Ideal antes da Distribuição)"]
SHORTHAND["Shorthand Canônico: flex: 1 1 0%"]
GROW --> SHORTHAND
SHRINK --> SHORTHAND
BASIS --> SHORTHAND
end
FLEX_AXES --> CONTAINER_CONTROLS
CONTAINER_CONTROLS --> ITEM_ALGORITHM
📐 1. O Modelo Unidimensional e os Eixos Ortogonais
O módulo CSS Flexible Box Layout (Flexbox) foi concebido para calcular a distribuição espacial e o alinhamento de elementos ao longo de uma única dimensão por vez (seja uma linha horizontal ou uma coluna vertical).
Ao declarar display: flex em um contêiner, o navegador estabelece instantaneamente dois eixos geométricos coordenados:
- Eixo Principal (Main Axis):
- Definido pela propriedade
flex-direction. - Determina a direção em que os flex items são empilhados em sequência.
- Possui dois pontos de ancoragem fundamentais: main-start (início do fluxo) e main-end (final do fluxo).
- Definido pela propriedade
- Eixo Transversal (Cross Axis):
- Corre sempre em um ângulo de $90^\circ$ perpendicular ao eixo principal.
- Seus limites são denominados cross-start e cross-end.
Valor de flex-direction |
Orientação do Eixo Principal | Orientação do Eixo Transversal | Ponto Inicial do Fluxo (main-start) |
|---|---|---|---|
row (Padrão) |
Horizontal (Esquerda $\to$ Direita) | Vertical (Cima $\downarrow$ Baixo) | Borda Esquerda |
row-reverse |
Horizontal (Direita $\to$ Esquerda) | Vertical (Cima $\downarrow$ Baixo) | Borda Direita |
column |
Vertical (Cima $\downarrow$ Baixo) | Horizontal (Esquerda $\to$ Direita) | Borda Superior |
column-reverse |
Vertical (Baixo $\uparrow$ Cima) | Horizontal (Esquerda $\to$ Direita) | Borda Inferior |
[!NOTE] A Regra de Ouro do Flexbox: Sempre que você alterar
flex-direction: column, todas as propriedades que antes governavam a largura e o alinhamento horizontal passam a governar a altura e o alinhamento vertical!
🎛️ 2. Diretivas de Controle do Flex Container
O contêiner pai gerencia a distribuição do espaço vago e o empacotamento dos nós filhos:
Alinhamento no Eixo Principal com justify-content:
Governa como o navegador distribui o excesso de espaço livre (positive free space) no eixo principal:
flex-start/start: Agrupa os itens no início do eixo principal.flex-end/end: Agrupa os itens no final do eixo.center: Centraliza o conjunto de itens.space-between: Fixa o primeiro item emmain-start, o último emmain-ende distribui espaçamento matematicamente idêntico entre os itens intermediários.space-around: Distribui espaço igual em ambos os lados de cada item (resultando em espaçamentos duplos entre itens internos e espaçamento simples nas bordas).space-evenly: Distribui espaço estritamente uniforme entre as bordas do contêiner e todos os itens.
Alinhamento no Eixo Transversal (align-items vs align-content):
align-items: Alinha itens individuais dentro de uma única linha flexível. Valores comuns:stretch(padrão, estica para igualar a maior altura),center,flex-start,flex-end,baseline(alinha as linhas de base tipográficas dos textos internos).align-content: Tem efeito exclusivamente quandoflex-wrap: wrapestá ativo e existem múltiplas linhas. Ele dita como as linhas inteiras são distribuídas verticalmente no contêiner quando sobra espaço.- A Propriedade
gap: Substitui os antigos hacks demarginnegativo. Define a distância entre itens (row-gapecolumn-gap) sem aplicar espaçamentos indesejados nas bordas externas.
📦 3. O Algoritmo de Dimensionamento dos Flex Items: flex-grow, flex-shrink e flex-basis
A verdadeira engenharia do Flexbox reside na tríade de propriedades que definem a flexibilidade matemática de cada item:
\[\text{Shorthand Canônico: } \texttt{flex: <flex-grow> <flex-shrink> <flex-basis>;}\]1. flex-basis (O Ponto de Partida):
Define o tamanho intrínseco inicial do item antes de qualquer redistribuição de espaço vago. Pode assumir unidades de comprimento (px, rem, %) ou a palavra-chave auto (que consulta o width ou o conteúdo).
2. flex-grow (Absorção de Espaço Livre Positivo):
Se a soma dos flex-basis de todos os itens for menor que a largura total do contêiner, surge o espaço livre positivo. O flex-grow determina a proporção desse espaço que cada item deve absorver:
\(\Delta W_{\text{item}} = \text{Espaço Livre} \times \left(\frac{\text{flex-grow}_{\text{item}}}{\sum \text{flex-grow}}\right)\)
3. flex-shrink (Absorção de Espaço Negativo na Compressão):
Se a soma dos itens for maior que a largura do contêiner e flex-wrap: nowrap, ocorre overflow. O flex-shrink determina como os itens encolhem para caber, ponderando tanto o fator de encolhimento quanto o tamanho do item.
/* Perfis Comuns de Shorthand */
.item-fluido {
flex: 1; /* Equivalente a: flex: 1 1 0%; Item cresce e encolhe igualmente a partir do zero */
}
.item-estatico {
flex: 0 0 280px; /* Não cresce, não encolhe, largura travada em 280px */
}
.item-auto {
flex: auto; /* Equivalente a: flex: 1 1 auto; Respeita o conteúdo inicial mas flexibiliza */
}
🚀 4. O Poder Oculto de margin: auto no Flexbox
Um dos comportamentos mais elegantes e subestimados da especificação W3C do Flexbox é a absorção total de espaço livre por margens automáticas:
/* Barra de Navegação Elegante sem Divs Vazias */
.navbar {
display: flex;
align-items: center;
gap: 1.5rem;
}
.navbar-logo {
font-weight: bold;
}
.navbar-user-profile {
margin-left: auto; /* Absorve TODO o espaço restante à esquerda e cola o perfil no final! */
}
/* Centralização Absoluta Perfeita em Ambos os Eixos com 2 Linhas */
.fullscreen-center {
display: flex;
min-height: 100vh;
}
.fullscreen-center > .modal-box {
margin: auto; /* Centraliza perfeitamente tanto no eixo horizontal quanto no vertical */
}
🛡️ 5. Boas Práticas e Prevenção do Bug min-width: auto
[!WARNING] A Armadilha do Overflow com Textos Longos em Flex Items: Por padrão, a especificação define que flex items possuem
min-width: auto(emin-height: autoem colunas). Se um filho do flex item contiver um texto muito longo comtext-overflow: ellipsis, uma URL contínua ou uma imagem grande, o item se recusa a encolher e vaza para fora da tela.A Solução: Adicione sempre
min-width: 0;no item flexível para permitir que ele encolha abaixo do seu conteúdo intrínseco:.flex-column-content { flex: 1; min-width: 0; /* Essencial para permitir que ellipsis ou imagens encolham corretamente */ overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }