Posicionamento - Display Flex

Programação/Desenvolvimeto Web Responsivo • Prof. Me. William Tenório

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:

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:

Problema:

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:

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:

O Flexbox trabalha com a ideia de:

Ativando o Flexbox

Para ativar o Flexbox, basta definir a propriedade display: flex no elemento pai (container).

.container {
    display: flex;
}

Ao fazer isso:

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.

Item 1
Item 2
Item 3

Principais vantagens do Flexbox

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>
1
2
3
4

flex;

container transformado em flexbox, mudando o comportamento do fluxo normal.

.container {
	display: flex;
}
1
2
3
4

flex;

Itens do flexbox crescem conforme o conteúdo

Teste 1
Teste 2
Teste 3
Teste 4

flex;

Itens do flexbox se adaptam para tentar caber no espaço, mas não quebram linha; as vezes da errado

Teste 1
Teste 2
Teste 3
Teste 4
Teste 5
Teste 6
Teste 7

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;
}
Teste 1
Teste 2
Teste 3
Teste 4
Teste 5
Teste 6
Teste 7

flex; justify-content: flex-end;

Alinha os itens flex; alinha ao final do container

.container {
	display: flex;
	justify-content: flex-end;
}
Teste 1
Teste 2
Teste 3

flex; justify-content: flex-center;

Alinha os itens flex; alinha no centro do container

.container {
	display: flex;
	justify-content: center;
}
Teste 1
Teste 2
Teste 3

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;
}
1
2
3
4

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;
}
1*******
2
3
4

grow 1 + basis 0

.container {
	display: flex;
}
.item{
	flex-grow: 1;
	flex-basis: 0;
}
1*******
2
3
4

flex; flex-grow diferentes;

É possível ter itens flex com valores diferentes

.container {
	display: flex;
}
#item1{
	flex-grow: 1;
}
#item2{
	flex-grow: 2;
}
1
2

Exercício

Ver arquivo "Exercício aula prática 7" na seção "Materiais".