Limitações dos layouts tradicionais
Antes do Flexbox, organizar elementos em uma página era mais limitado e, muitas vezes, trabalhoso. Os principais comportamentos usados eram:
Elementos block
Elementos com display: block ocupam toda a largura disponível da página.
Exemplos: <div>, <p>, <section>
Características:
- Quebram linha automaticamente.
- Ficam um abaixo do outro.
- Permitem definir width e height.
Problema: Colocar elementos lado a lado exigia técnicas extras, como float, inline-block ou cálculos manuais de largura.
Elementos inline
Elementos com display: inline ficam na mesma linha, lado a lado.
Exemplos: <a>, <span>, <strong>, <img>
Características:
- Não quebram linha automaticamente.
- Ficam um ao lado do outro.
- Não permitem definir width e height.
Problema:
- Não é possível definir largura e altura para elementos inline.
- O alinhamento vertical e espaçamento costumavam gerar dificuldades.
Uso de position
Elementos com position: relative, absolute ou fixed permitem um controle mais preciso sobre a posição dos elementos na página.
Problema:
- O posicionamento ficava “manual”.
- Elementos podiam sobrepor outros.
- O layout perdia flexibilidade e adaptação a diferentes tamanhos de tela.
- Tornava layouts responsivos mais complexos.
Flexbox - Display Flex
O Flexbox é um modelo de layout do CSS que permite criar layouts flexíveis e responsivos de forma mais simples e intuitiva.
Com ele, é possível:
- alinhar elementos horizontalmente e verticalmente;
- distribuir espaços automaticamente;
- criar layouts responsivos com menos código;
- controlar facilmente espaçamentos e tamanhos.
O Flexbox trabalha com a ideia de:
- container flex → elemento pai;
- itens flex → elementos filhos.
Ativando o Flexbox
Para ativar o Flexbox, basta definir a propriedade display: flex no elemento pai (container).
.container {
display: flex;
}
Ao fazer isso:
- os elementos filhos passam a se comportar como itens flex;
- o alinhamento e distribuição passam a ser controlados pelo Flexbox.
Exemplo
HTML:
<div class="container">
<div class="item">Item 1</div>
<div class="item">Item 2</div>
<div class="item">Item 3</div>
</div>
CSS:
.container {
display: flex;
}
.item {
height: 100px;
background-color: lightblue;
border: 1px solid #333;
}
Resultado: Os itens ficam lado a lado, ocupando apenas o espaço necessário, e podem ser facilmente alinhados e espaçados usando as propriedades do Flexbox.
Principais vantagens do Flexbox
- Centralização simplificada.
- Distribuição automática de espaço.
- Facilidade para alinhar elementos.
- Melhor adaptação para telas diferentes.
- Código mais limpo e moderno.
- Redução do uso de float e posicionamentos complexos.
Propriedades do Flexbox
block;
div é um elemento block-level no fluxo normal; ocupam 100% do espaço e sempre em nova linha
<div class="container">
<div class="item" id="item1">1</div>
<div class="item" id="item2">2</div>
<div class="item" id="item3">3</div>
<div class="item" id="item4">4</div>
</div>
flex;
container transformado em flexbox, mudando o comportamento do fluxo normal.
.container {
display: flex;
}
flex;
Itens do flexbox crescem conforme o conteúdo
flex;
Itens do flexbox se adaptam para tentar caber no espaço, mas não quebram linha; as vezes da errado
flex; flex-wrap;
Define se os itens devem ou não quebrar a linha. flex-wrap: wrap, indica que haverá quebra de linha quando um dos itens flex não puder mais ser compactado.
.container {
display: flex;
flex-wrap: wrap;
}
flex; justify-content: flex-end;
Alinha os itens flex; alinha ao final do container
.container {
display: flex;
justify-content: flex-end;
}
flex; justify-content: flex-center;
Alinha os itens flex; alinha no centro do container
.container {
display: flex;
justify-content: center;
}
flex; flex-grow: 1;
Distribui o espaço livre. Ao definir grow como 1 para todos os itens flex, eles tentarão se distribuir igualmente para ocupar 100% do container, mas depende do conteúdo.
.container {
display: flex;
}
.item{
flex-grow: 1;
}
flex; flex-basis: 0;
Define o tamanho inicial do flex item. Ao definir basis como 0 para todos os itens flex, eles tentarão ter a mesma largura, independente do conteúdo.
Só com grow 1
.container {
display: flex;
}
.item{
flex-grow: 1;
}
grow 1 + basis 0
.container {
display: flex;
}
.item{
flex-grow: 1;
flex-basis: 0;
}
flex; flex-grow diferentes;
É possível ter itens flex com valores diferentes
.container {
display: flex;
}
#item1{
flex-grow: 1;
}
#item2{
flex-grow: 2;
}
Exercício
Ver arquivo "Exercício aula prática 7" na seção "Materiais".