Flexbox - Display Flex do CSS em 3 passos

O que é?

Flexbox é uma ferramenta do CSS3 que serve para dispor os elementos dentro de um determinado container em linhas ou colunas.

É bastante flexível e permite que você arranje os elementos horizontal ou verticalmente, com ou sem espaços entre eles, de tamanhos iguais ou diferentes. Dá para criar grades, carróseis, cards e mais uma infinidade de coisas.

Passo 1 - O Flex Container

Primeiramente, você precisa especificar o container. Um container é simplesmente alguma div, section, article, aside, ou um outro elemento de caixa que deve conter todos os elementos que você pretende dispor/posicionar em linhas ou colunas.

Assim que você atribuir a propriedade de CSS display: flex ao container, ele passará a ser o que chamamos de flex container e todos seus filhos diretos, por sua vez, serão os flex-itens.

Nota: Clique nas abas HTML ou CSS do painel abaixo para ver o respectivo código.

See the Pen PoqKxPd by Agilso Oliveira (@agilso) on CodePen.

A div.my-flex-container é o flex container ao passo que todo div.my-flex-item é um flex-item.

Note que a única propriedade relacionada ao flebox que usamos foi o display: flex no container. Essa única linha fez com que seus filhos ficassem posicionados lado a lado, ao invés de um embaixo do outro como seriam normalmente no fluxo do documento.

Outra coisa a se reparar é que, por padrão, os flex-itens ocupam somente o espaço que precisam, ao invés de tomar todo o espaço do container.

Para fazer que os flex-itens tomem todo o espaço disponível do container, vamos adicionar a propriedade flex: 1 a eles.

See the Pen CSS Flex - P1.1 by Agilso Oliveira (@agilso) on CodePen.

Logo falaremos mais sobre o flex: 1 e as outras propriedades disponíveis para customizar os flex itens.

Outra coisa se reparar é que, se inserirmos outras tags div.my-flex-item, seus tamanhos serão ajustados para caber dentro do container.

See the Pen CSS Flex - P1.2 by Agilso Oliveira (@agilso) on CodePen.

Repare que com isso, já sabemos como fazer uma grade (grid) para nossa página. ;)

Passo 2 - Configurando o container

Há algumas opções interessantes que podemos colocar no container para modificar a disposição dos flex-itens.

Flex Direction

A propriedade flex-direction, como o nome sugere, vai definir o eixo do container e a direção dos flex-itens. Há 4 possíveis valores, veja a tabela abaixo.

flex-direction Comportamento
row valor padrão, dispõe em linhas
row-reverse dispõe em linhas, mas inverte a ordem.
column dispõe em colunas
column-reverse dispõe em colunas e inverte ordem.

Por exemplo, se aplicarmos flex-direction: column-reverse no nosso container, o resultado fica assim:

Fique a vontade para testar os outros valores e ver o que acontece.

Flex-wrap

A propriedade flex-wrap diz respeito a como os flex-itens vão se comportar caso não caibam dentro de uma única linha (ou coluna) do container.

flex-wrap Comportamento
nowrap valor padrão, põe todo mundo na mesma linha, não importa a quantidade de flex-itens.
wrap quebra a linha quando não cabe mais.
wrap-reverse quebra a linha, mas põe o elemento em cima ao invés de embaixo.

Flex Flow

A propriedade flex-flow é somente syntax sugar para as propriedades flex-wrap e flex-direction, permitindo uni-las numa única linha.

.my-flex-container {
  flex-flow: row wrap-reverse;

  # flex-flow: valor-flex-direction valor-flex-wrap;
}

Align-content

A propriedade align-content estabelece como os flex-itens ficarão alinhados segundo o eixo do container. O eixo do container é simplesmente a direção escolhida. Em outras palavras,

Flex-direction Influência do align-content
row alinha segundo o eixo horizontal
column alinha segundo o eixo vertical

Align-items

A propriedade align-items define como os flex-itens serão postos segundo o eixo contrário ao do container. Eixo contrário?

O eixo contrário é o eixo perpendicular a direção escolhida para o container. Em outras palavras, dependendo de qual for o flow-direction do container, o align-items alinha os items verticalmente ou horizontalmente.

Flex-direction Influência do align-items
row alinha segundo o eixo vertical
column alinha segundo o eixo horizontal

É a mesma coisa que o align-content, mas para o eixo contrário.

Justify Content

Passo 3 - Configurando os flex itens

Já posso usar em produção?

Sim. Flexbox é um feature que já pode ser usado em produção. Estima-se que mais de 95% dos usuários da internet já possuem browsers compatíveis com essa funcionalidade (segundo o caniuse.com/flexbox).

Outra indicação é que vários frameworks de CSS, como o Bulma , Milligram e outros, adotaram o flexbox em suas grades.