Considera l'asse principale e l'asse trasversale di un contenitore flessibile:
Fonte: W3C
Per allineare gli elementi flessibili lungo l'asse principale esiste una proprietà:
Per allineare gli elementi flessibili lungo l'asse trasversale ci sono tre proprietà:
Nell'immagine sopra, l'asse principale è orizzontale e l'asse trasversale è verticale. Queste sono le direzioni predefinite di un contenitore flessibile.
Tuttavia, queste direzioni possono essere facilmente scambiate con la flex-direction
proprietà.
/* 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;
(L'asse trasversale è sempre perpendicolare all'asse principale.)
Il mio punto nel descrivere come il lavoro degli assi è che non sembra esserci nulla di speciale in nessuna delle due direzioni. Asse principale, asse trasversale, sono entrambi uguali in termini di importanza e flex-direction
facilita il passaggio avanti e indietro.
Quindi perché l'asse trasversale ottiene due proprietà di allineamento aggiuntive?
Perché sono align-content
e align-items
consolidati in una proprietà per l'asse principale?
Perché l'asse principale non ottiene una justify-self
proprietà?
Scenari in cui queste proprietà sarebbero utili:
posizionando un oggetto flessibile nell'angolo del contenitore flessibile
#box3 { align-self: flex-end; justify-self: flex-end; }
facendo allineare un gruppo di elementi flessibili a destra (
justify-content: flex-end
) ma allineare il primo elemento a sinistra (justify-self: flex-start
)Considera una sezione di intestazione con un gruppo di elementi di navigazione e un logo. Con
justify-self
il logo potrebbe essere allineato a sinistra mentre gli elementi di navigazione rimangono all'estrema destra e il tutto si regola senza problemi ("si flette") a dimensioni dello schermo diverse.in una fila di tre oggetti flessibili, applicare l'elemento centrale al centro del contenitore (
justify-content: center
) e allineare gli oggetti adiacenti ai bordi del contenitore (justify-self: flex-start
ejustify-self: flex-end
).Si noti che i valori
space-around
espace-between
sullajustify-content
proprietà non manterranno l'elemento centrale centrato sul contenitore se gli elementi adiacenti hanno larghezze diverse.
Al momento della stesura di questo documento, non è menzionato justify-self
né justify-items
nelle specifiche del flexbox .
Tuttavia, nel CSS Box Alignment Module , che è la proposta incompiuta del W3C di stabilire un insieme comune di proprietà di allineamento da utilizzare su tutti i modelli di box, c'è questo:
Fonte: W3C
Lo noterai justify-self
e verraijustify-items
considerato ... ma non per Flexbox .
Finirò ripetendo la domanda principale:
Perché non ci sono proprietà "giustificare-elementi" e "giustificare-sé"?
justify-content: flex-start
, quindi all'inizio gli oggetti sono affollati come | abcd |. Cosa ti aspetteresti che faccia, se metti justify-self: [anything]
l'oggetto 'b' lì?)
justify-self
di lavorare per un oggetto flessibile? Direi non diversamente dai auto
margini che funzionano già su articoli flessibili. Nel tuo secondo esempio, justify-self: flex-end
sull'elemento d lo sposteresti sul bordo lontano. Questa di per sé sarebbe una grande caratteristica, che i auto
margini possono già fare. Ho pubblicato una risposta con una dimostrazione.
justify-content
e justify-self
specificato, in modo che i casi con conflitti (come gli scenari di cui ho chiesto) sono chiaramente e sensibilmente definiti. Come ho notato nella mia risposta qui, si {justify|align}-self
tratta di allineare gli oggetti all'interno di una scatola più grande che è dimensionata indipendentemente dal {justify|align}-self
valore - e non esiste una scatola simile, nell'asse principale, in cui un oggetto flessibile possa essere allineato.
justify-self
e come justify-content
interagiresti, nei casi in cui sono in conflitto (come gli scenari che ho definito). I margini automatici semplicemente non interagiscono justify-content
affatto: rubano tutto lo spazio di imballaggio prima che abbiano la justify-content
possibilità di usarlo. Quindi, i margini automatici non sono davvero un buon analogo per come funzionerebbe.
justify-self
di lavorare per un articolo flessibile? Supponiamo di avere oggetti a, b, c, d con spazio extra da distribuire attorno a loro, e il contenitore flessibile abbiajustify-content: space-between
, quindi finiscono come | abcd |. Cosa significherebbe aggiungere, ad esempio,justify-self: center
o 'giustificare-sé: fine flessibile' solo all'elemento 'b' lì? Dove ti aspetteresti che vada? (Vedo alcune demo in una delle risposte qui, ma non vedo un modo chiaro che funzionerebbe in generale.)