DEV Community

Cover image for Align e Justify no Flexbox e no Grid pra você nunca mais confundir
Camilo Micheletto
Camilo Micheletto

Posted on

Align e Justify no Flexbox e no Grid pra você nunca mais confundir

Você já percebeu como justify- e align- funcionam um pouco diferente no Flexbox e no Grid? Os comandos "invertendo" quando você muda o flex-direction, o grid se comportando diferente do esperado quando você usa place-content ao invés de place-items. O tweet abaixo resume bem:

 

Mas serasse não tem padronização mesmo? ....


Os eixos

Primeiro: Não pensem em justify- e align- (content e items) como propriedades de flexbox ou grid, elas são propriedades de layout baseadas em eixos.

flex e grid são duas propriedades de display que ordenam elementos através de seus eixos (axis).

📝 Pra lembrar!
O Flexbox tem o main-axis e o cross-axis. O main-axis dita a direção em que os elementos vão se enfileirar, o cross-axis dita a direção que eles vão se empilhar quando o flex-wrap for wrap.

 

A imagem abaixo feita pela Samantha Ming demonstra bem o conceito. O artigo também é ótimo.


Na imagem, os eixos do flexbox. Quando o flex-direction é de coluna, o cross-axis vem de cima pra baixo e o main-axis da esquerda pra direita. Já na coluna o main-axis vem de cima pra baixo e o cross-axis da esquerda pra direita. Com reverse, o mesmo, mas com a direção dos eixos invertida.

 

Esses eixos servem de guias pra que o flex saiba pra onde enfileirar e empilhar os itens quando você usa o flex-wrap: wrap e muda a orientação do eixo usando column / reverse.

Os eixos no grid funcionam de forma diferente.

No grid temos o column-axis e o row-axis, que são respectivamente colunas e linhas - só isso.

O grid não precisa de uma lógica de mudança de fluxo de eixos (como flex-direction) pois o container pai, aquele que você aplica o grid, que tem controle do layout, não os seus filhos.

Na imagem, o block-axis é o eixo da coluna e o inline axis é o eixo das linhas


Imagem da MDN.


Justify

Justify Content

Ele define como o navegador distribui o espaço entre e ao redor dos elementos.

🔹 No flex ele usa o main-axis
Ou seja, o eixo que ele enfileira, seja column ou row.

🔹 No grid-ele usa o inline-axis
Ele usa sempre a linha, a grid-row.

Na imagem abaixo, os elementos estão empilhados verticalmente. Quando em coluna, o main-axis vem de cima pra baixo, fazendo os elementos empilharem. Como o justify segue o eixo do main-axis, ele vai espaçar os elementos verticalmente.


Imagens do cheatsheet de Flexbox do site Origamid

 

Na imagem abaixo, o container tá com flex-direction: row, seu main-axis está na horizontal, logo, o justify-content distribui os itens horizontalmente. Pelo cross-axis vir de cima pra baixo, quando aplicado flex-wrap: wrap, os itens excedentes vão quebrar pra linha de baixo.


Imagens do cheatsheet de Flexbox do site Origamid

 

Justify Items

Ele aplica a propriedade justify-self em todos os filhos, dessa forma cada item é alinhado individualmente seguindo seu eixo.

🔹 No flexbox ele é ignorado.

🔹 No grid-ele alinha o elemento dentro de sua grid-area no eixo inline (horizontalmente).

❓ Mas porque ele é ignorado?
No flexbox essa propriedade é ignorada pois o flexbox é unidimensional, diferente do grid. Ao invés de usar align-items e justify-items no flex, basta usar o align-items e mudar a direção do eixo via flex-direction.


Align

Align Items
Ele aplica a propriedade align-self em todos os filhos, fazendo cada um deles se alinhar pra mesma direção do cross-axis.

🔹 No flexbox ele alinha os filhos no cross-axis.

🔹 No grid-ele alinha o elemento dentro de sua grid-area no eixo block (mais conhecido como coluna, ou eixo y).

Na imagem abaixo vemos que definir o align-items: flex-start alinha os elementos do lado oposto da direção do cross-axis. flex-end seria o contrário, por exemplo.

Row e align-items: flex-start Column e align-items: flex-start

Imagens do cheatsheet de Flexbox do site Origamid

 

Align Content
Ele define como o navegador distribui o espaço entre e ao redor dos elementos (que nem o justify).

🔹No flex ele usa o cross-axis
Ou seja, o eixo que ele empilha

🔹No grid-ele usa o column-axis
Ele usa sempre a coluna, a grid-column.


Pra fechar

Facilitou pra mim tentar entender um padrão das nomenclaturas align e justify, na minha opinião, é algo assim:

🔹 Justify / Align
Define qual eixo vai ser distribuído ou orientado.

🔹 -items
Alinha os itens à partir do eixo.

🔹 -content
Alinha os eixos.


Babado extra

Notaram essa parte do xweet?

Se até uma pessoa que trabalha há anos com CSS se confunde com essa falta de padronização as vezes, não é atoa que Tailwind só cresce...

Vocês tem opiniões sobre essa afirmação? Conta ai pra mim, quem sabe não escrevo sobre e a gente discute, né?

Top comments (7)

Collapse
 
szaranct profile image
Sara Aniceto

Esse é um comentário de uma completa iniciante. Seu artigo esclareceu muito, essa imagem inicial ilustrando os eixos fez TODA a diferença pra mim. Obrigada por trazê-la, acho que essa informação não foi dada tanta importância em outros materiais que acessei.

Collapse
 
lixeletto profile image
Camilo Micheletto

Fico muito feliz de ler isso, e triste ao mesmo tempo pois na minha pesquisa eu tive que ser bem específico pra achar explicações mais completas sobre isso. Espero que isso mude com o tempo, pq é uma tecnologia incrível.

Collapse
 
demenezes profile image
deMenezes

Engraçado que sempre dá pra aprender algo a mais sobre flexbox.

O capítulo "Pra fechar" foi sensacional, se a gente entender aquilo ali, podemos nos guiar no dia a dia por conta própria.

Sobre o comentário final do tweet, não entendi muito bem a relação com o Tailwind, já que ele usa comandos do próprio CSS no nome das classes. Ainda não estudei ele, mas já ouvi muito que para ficar melhor em Tailwind, basta estudar CSS.

Collapse
 
antoniorws profile image
Antonio Serra

Ótimo artigo!

Collapse
 
jilherme profile image
jilherme

very pika article, cousin

Collapse
 
lixeletto profile image
Camilo Micheletto

Thanks cousin

Collapse
 
nathancomh profile image
Nathancomh

po mestre muito obg, em poucas linhas entendi um conceito que até então estava meio nublado na minha cabeça.