Guia completo de Flexbox

Lucas Batista
11 min readJun 24, 2021

Flex Container

É o elemento que possui a propriedade display: flex/inline-flex; assim tornando todos seus filhos diretos flex items

Display

Define o elemento como um container flex (inline ou block dependendo do valor passado) e estabelece um contexto de formatação flex para todos seus filhos diretos, ou seja, agora todos os filhos serão flex items.

display: flex;
Gera um flex container como elemento de bloco (ocupa todo o espaço da linha)

display: flex;

display: inline-flex;
Gera um flex container como elemento de linha (permite outros elementos na mesma linha)

display: inline-flex;

Flex Direction

Define o sentido do eixo principal, que é a direção em que os flex items serão inseridos no flex container

flex-direction: row; (padrão)
O eixo principal é definido como a linha (horizontal), logo os flex items são distribuidos de acordo e na ordem de leitura (esquerda para direita).

flex-direction: row;

flex-direction: row-reverse;
O eixo principal é definido como a linha (horizontal), porém com o sentido de distribuição invertido (direita para esquerda)

flex-direction: row-reverse;

flex-direction: column;
O eixo principal é definido como coluna (vertical), logo os flex items são distribuidos de acordo e na ordem padrão (cima para baixo).

flex-direction: column;

flex-direction: column-reverse;
O eixo principal é definido como coluna (vertical), porém com o sentido de distribuição invertido (baixo para cima)

flex-direction: column-reverse;

Flex Wrap

Define se ocorrerá ou não quebra de linha

flex-wrap: nowrap; (padrão)
Por padrão o flex container distribui os flex items tentando acomodar (reduzindo seu tamanho na médida no possível) todos em uma só linha, não sendo permitida a quebra de linha

flex-wrap: nowrap;

Observação: Os flex items tem seu tamanho reduzido para se acomodarem em uma só linha, essa redução é limitada pelo menor tamanho do seu conteúdo ou por propriedades como por exemplo min-width aplicadas no flex item.

flex-wrap: wrap;
O flex container irá distribuir os Flex Items para ocuparem o espaço necessário e se não for possível se acomodar em uma só linha, ocorrerá a quebra de linha.

flex-wrap: wrap;

flex-wrap: wrap-reverse;
O flex container irá distribuir os Flex Items para ocuparem o espaço necessário e se não for possível se acomodar em uma só linha, ocorrerá a quebra de linha de forma invertida, ou seja, os itens irão para cima dos anteriores.

flex-wrap: wrap-reverse;

Flex Flow

É um atalho para flex-direction e flex-wrap.

flex-flow: <flex-direction> <flex-wrap>Ex:
flex-flow: column wrap;

Justify Content

Alinha os flex items de acordo ao eixo principal

justify-content: flex-start; (padrão)
Os flex items são alinhados de acordo o começo do flex-direction (eixo principal)

flex-direction: row; & justify-content: flex-start;

justify-content: flex-end;
Os flex items são alinhados de acordo o fim do flex-direction (eixo principal)

flex-direction: row; & justify-content: flex-end;

justify-content: center;
Os flex items são alinhados de acordo ao centro do eixo principal

flex-direction: row & justify-content: center;

justify-content: space-between;
Os flex items são distribuidos com o espaço máximo entre eles, um espaço igual X entre todos em seu eixo principal

justify-content: space-between;

Observação: Caso só tenha dois flex items, eles serão dispostos um em cada extremidade, pois é a distância máxima possível

justify-content: space-between;

justify-content: space-around;
Os flex items são distribuidos com o espaço máximo ao lado deles, um espaço igual X em cada lado de cada flex item ao longo do eixo principal

justify-content: space-around;

justify-content: space-evenly;
Os flex items são distribuídos de forma que o espaçamento entre quaisquer dois itens (e o espaço para as bordas) seja igual.

justify-content: space-evenly;

Align Items

É responsável pelo alinhamento dos itens flex dentro da linha flex de acordo ao eixo cruzado.

Na prática, o align-items insere em todos os items flex a propriedade align-self respectiva
(Ex.: usar align-items: flex-start; aplica align-self: flex-start; a todos os elementos da linha)

align-items: stretch; (padrão)
Os flex items são esticados para preencher totalmente a linha flex no eixo cruzado, mas ainda respeita o min-width/max-width

align-items: stretch;

align-items: flex-start;
Os flex items são alinhados ao começo do eixo cruzado na linha flex, respeitando as definições do flex-direction

align-items: flex-start;

align-items: flex-end;
Os flex items são alinhados ao fim do eixo cruzado na linha flex, respeitando as definições do flex-direction

align-items: flex-end;

align-items: center;
Os flex items são alinhados ao centro da linha flex do eixo cruzado

align-items: center;

align-items: baseline;
Os flex items são alinhados de acordo a linha base dentro da linha flex no eixo cruzado

align-items: baseline;

Observação:
Quando existe mais de uma linha flex, graças ao flex-wrap: wrap; os flex items são alinhados de acordo a sua linha flex

Nesse exemplo os flex items possuem align-items: flex-start: e se alinham ao começo de sua linha flex

flex-wrap: wrap; & align-items: flex-start;

Align Content

É responsável pelo alinhamento das linhas flex em relação ao flex container de acordo ao eixo cruzado

align-content: normal; (padrão)
Atua como se nenhum comportamento tivesse sido definido, fazendo as linhas flex ocuparem todo o flex-container

align-content: normal; & align-items: flex-start;

align-content: flex-start;
Alinha as linhas flex ao começo do container de acordo ao eixo cruzado e respeitando o flex-direction

align-content: flex-start; & align-items: flex-start;

align-content: flex-end;
Alinha as linhas flex ao fim do container de acordo ao eixo cruzado e respeitando o flex-direction

align-content: flex-end; & align-items: flex-start;

align-content: center;
Alinha as linhas flex ao centro do container de acordo ao eixo cruzado e respeitando o flex-direction

align-content: center; & align-items: flex-start;

align-content: space-between;
Alinha as linhas flex com a distância máxima entre elas (x) de acordo ao eixo cruzado

align-content: space-between; & align-items: flex-start;

align-content: space-around;
Alinha as linhas flex com uma distância igual em cada lado (x) de acordo ao eixo cruzado

align-content: space-around; & align-items: flex-start;

align-content: space-evenly;
Alinha as linhas flex com uma distância igual entre elas (x) de acordo ao eixo cruzado

align-content: space-evenly; & align-items: flex-start;

align-content: stretch;
Estica as linhas flex para preencher todo o flex container

align-content: stretch; & align-items: flex-start;

Flex Item

São todos os elementos que possuem um pai com a propriedade display: flex/inline-flex;

Order

Por padrão, os flex items são dispostos na ordem de origem do HTML. No entanto, a propriedade order controla a ordem em que aparecem no flex container.

order: 0; (padrão)
Por padrão todos os flex items tem order: 0, ou seja, seguem a ordem de origem no código

order: <número>;
A ordem de aparição no flex container respeita o order

Flex-grow

Controla o crescimento do flex-item (além do conteúdo) para ocupar o espaço restante do flex container.

flex-grow: 0 (padrão)
Itens flex não crescem para ocupar o espaço restante do flex container. Sendo o limitador do menor tamanho flex de um flex-item o seu tamanho/conteúdo ou um flex-basis definido.

flex-grow: <número> (ex: 1, 2, 3…)
O item flex cresce (além de seu conteúdo) para ocupar o espaço restante do flex container, números maiores que 1 são usados para distribuir o crescimento proporcionalmente entre os itens flex. Por exemplo, um item flex com flex-grow: 2; cresce o dobro do que um com flex-grow: 1;

Flex-shrink

Controla a redução do flex-item quando necessária para exibir todos os itens flex sem estourar o flex container

flex-shrink: 1; (padrão)
O item flex se reduz para encaixar no flex container.

Os flex items se reduziram (quebrando linha de texto) para encaixar no flex container

flex-shrink: 0
Flex item não reduzirá seu tamanho, sendo o tamanho mínimo o flex-basis (quando definido) ou o tamanho do item (width definido ou conteúdo)

flex-shrink: número > 1 (ex.: 2, 3, 4…)
São usados para distribuir a quantidade de redução proporcionalmente entre os itens flex. Por exemplo, um item flex com flex-shrink: 10; reduz quando necessário 10 vezes mais do que um com flex-shrink: 1;

Flex-basis

Controla o tamanho base (inicial) de um item flex, sobrescreve o tamanho do item (definido por width, padding, etc.)

flex-basis: auto; (padrão)
O tamanho base do flex item é automático, logo será igual ao do item. Se o item não tiver tamanho especificado (definido pelo width, padding, etc.), o tamanho será conforme seu conteúdo.

flex-basis: auto;

flex-basis: número em px, %, em, etc. (ex.: 150px, 50%, etc.)
Define um tamanho base específico, mas flexível, para o flex item. Pode ser entendido como o tamanho mínimo aceitável do flex item.

Primeiro flex item com flex-basis: 200px;

Observação: Se precisar diminuir (com flex-shrinks: 1;), o valor do flex-basis não será o limitador do menor tamanho e sim o tamanho (width etc) ou o conteúdo do flex item

Primeiro flex item com flex-basis: 150px; mas reduzindo quando necessário

flex-basis: 0;
Define como tamanho base do item flex o menor valor possível conforme o tamanho do item (ex: width definido) ou seu conteúdo

Primeiro flex item com flex-basis: 0;

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

Flex Basis + Flex Grow

Flex items com conteúdos diferentes, mas com tamanhos iguais usando Flex Basis + Flex Grow

Antes
Depois

flex-basis: 0; + flex-grow: 1;

Quando essas duas propriedades são passadas juntas ocorre um fenômeno interessante e bastante útil.

Primeiro o flex-basis: 0; define que o tamanho base do item flex seja 0, ou seja, o menor possível, ignorando/sobrescrevendo o tamanho do conteúdo do item.

Todos os itens com: flex-basis: 0; e flex-grow: 0; (padrão)

Depois o flex-grow: 1; expande em igual proporção os dois itens (já que os dois possuem o mesmo valor de flex-grow)

Todos os itens com flex-basis: 0; e flex-grow: 1;

Resultando assim em algo interessante que são dois ou mais flex items com conteúdos diferentes, mas que possuem o mesmo tamanho flex

Isso só ocorreu graças ao flex-basis: 0; ter ignorado o tamanho do conteúdo (definindo ele como 0), assim o flex-grow adicionou o espaço extra depois de forma igual nos dois items flex, como o conteúdo dos dois era tamanho 0, o tamanho final dos items flex foi igual, assim como o acréscimo do flex-grow

Veja o que aconteceria caso não fosse usado flex-basis: 0; e o tamanho do conteúdo não fosse ignorado:

flex-grow: 1; & flex-basis: auto; (padrão)

É possível ver que o flex-grow deu aos dois acréscimos iguais, porém o tamanho final dos items flex difere e isso ocorreu devido à diferença de tamanho de seus conteúdos

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

Flex

É a forma resumida das três propriedades anteriores: flex-grow, flex-shrink e flex-basis

flex: <flex-grow>, <flex-shrink>, <flex-basis>;

Sendo por padrão (caso nenhuma das três propriedades sejam definidas):

flex: 0, 1, auto;

Align Self

Essa propriedade permite que o alinhamento de eixo cruzado padrão (aquele especificado pelo align-items no flex container) seja substituído e passado individualmente ao flex item.

align-self: stretch; (padrão, quando o align-items não for definido)
O flex item é esticados para preencher totalmente a linha flex no eixo cruzado, mas ainda respeita o min-width/max-width

align-self: stretch; & align-items: flex-start;

align-self: flex-start;
O flex item é alinhado ao começo do eixo cruzado na linha flex, respeitando as definições do flex-direction

align-self: flex-start; & align-items: flex-start;

align-self: flex-end;
O flex item é alinhado ao fim do eixo cruzado na linha flex, respeitando as definições do flex-direction

align-self: flex-end; & align-items: flex-start;

align-self: center;
O flex item é alinhado ao centro da linha flex do eixo cruzado

align-self: center; & align-items: flex-start;

Então é isso…

Se sentir necessidade de aprofundar em alguns dos pontos mais complexos do Flexbox sinta-se a vontade para ler os outros guias:

Flex Grow, Flex Basis, Flex Shrink e Flex
https://lucasbatiiista.medium.com/flex-grow-flex-basis-flex-shrink-e-flex-4f208d65dd38

Align Items vs Align Content
https://lucasbatiiista.medium.com/align-items-vs-align-content-fceb99dea277

Agora é só praticar

Você pode experimentar todas essas propriedades no CodePen usado para escrever esse texto:
https://codepen.io/lucasbatiiista/pen/QWpXJLe

--

--

Lucas Batista

Front-end developer with knowledge in HTML5 / CSS3, Javascript, React JS, Redux, SEO. Learning new concepts and improving my knowledge is what motivates me.