Considere o eixo principal e o eixo transversal de um contêiner flexível:
Fonte: W3C
Para alinhar itens flexíveis ao longo do eixo principal, existe uma propriedade:
Para alinhar itens flexíveis ao longo do eixo transversal, existem três propriedades:
Na imagem acima, o eixo principal é horizontal e o eixo transversal é vertical. Essas são as direções padrão de um contêiner flexível.
No entanto, essas instruções podem ser facilmente trocadas com a flex-direction
propriedade.
/* main axis is horizontal, cross axis is vertical */
flex-direction: row;
flex-direction: row-reverse;
/* main axis is vertical, cross axis is horizontal */
flex-direction: column;
flex-direction: column-reverse;
(O eixo transversal é sempre perpendicular ao eixo principal.)
Meu argumento ao descrever como os eixos funcionam é que não parece haver nada de especial em nenhuma das direções. Eixo principal, eixo transversal, ambos são iguais em termos de importância e flex-direction
facilitam a alternância.
Então, por que o eixo transversal obtém duas propriedades de alinhamento adicionais?
Por que align-content
e são align-items
consolidados em uma propriedade para o eixo principal?
Por que o eixo principal não obtém uma justify-self
propriedade?
Cenários em que essas propriedades seriam úteis:
colocando um item flexível no canto do contêiner flexível
#box3 { align-self: flex-end; justify-self: flex-end; }
alinhando um grupo de itens flexíveis à direita (
justify-content: flex-end
), mas com o primeiro item alinhado à esquerda (justify-self: flex-start
)Considere uma seção de cabeçalho com um grupo de itens de navegação e um logotipo. Com
justify-self
o logotipo pode ser alinhado à esquerda, enquanto os itens de navegação ficam à direita, e tudo se ajusta suavemente ("flexiona") para diferentes tamanhos de tela.em uma linha de três itens flexíveis, afixe o item do meio ao centro do contêiner (
justify-content: center
) e alinhe os itens adjacentes às bordas do contêiner (justify-self: flex-start
ejustify-self: flex-end
).Observe que os valores
space-around
espace-between
ajustify-content
propriedade não manterão o item do meio centralizado sobre o contêiner se os itens adjacentes tiverem larguras diferentes.
No momento da redação deste documento, não há menção justify-self
ou justify-items
na especificação do flexbox .
No entanto, no Módulo de alinhamento de caixas CSS , que é a proposta inacabada do W3C de estabelecer um conjunto comum de propriedades de alinhamento para uso em todos os modelos de caixas, existe o seguinte:
Fonte: W3C
Você notará isso justify-self
e justify-items
está sendo considerado ... mas não para o flexbox .
Terminarei reiterando a questão principal:
Por que não existem propriedades "justify-items" e "justify-self"?
justify-content: flex-start
, para que os itens estão lotados no início como | abcd | O que você espera que ele faça, se você colocar. justify-self: [anything]
Do item 'b' lá?)
justify-self
trabalhar para um item flexível? Eu diria que não tão diferente do que as auto
margens já funcionam em itens flex. No seu segundo exemplo, o justify-self: flex-end
item d o moveria para a extremidade. Isso por si só seria um ótimo recurso, que as auto
margens já podem fazer. Postei uma resposta com uma demonstração.
justify-content
e justify-self
são especificados, para que casos com conflitos (como os cenários perguntei sobre) são definidos de forma clara e sensata. Como observei na minha resposta aqui, {justify|align}-self
trata-se de alinhar itens dentro de uma caixa maior, dimensionada independentemente do {justify|align}-self
valor - e não existe essa caixa, no eixo principal, para alinhar um item flexível.
justify-self
e justify-content
interage, nos casos em que elas conflitam (como os cenários apresentados). As margens automáticas simplesmente não interagem justify-content
- elas roubam todo o espaço da embalagem antes que você justify-content
possa usá-lo. Portanto, as margens automáticas não são realmente um bom análogo de como isso funcionaria.
justify-self
trabalhar para um item flexível? Suponha que você tenha os itens a, b, c, d com espaço extra para distribuir em torno deles, e o contêiner flex tenhajustify-content: space-between
, portanto eles acabam como | abcd |. O que significaria adicionar, por exemplo,justify-self: center
ou 'justificar-se: flex-end', apenas ao item 'b' lá? Para onde você esperaria que fosse? (Eu vejo algumas demos em uma das respostas aqui, mas eu não vejo uma forma clara que ele iria trabalhar em geral.)