justify-content e align-items in una frase ciascuno
In un contenitore flex, justify-content distribuisce gli elementi lungo l'asse principale (lungo la riga) e align-items li allinea sull'asse trasversale (in alto e in basso nella riga). Entrambe vanno sul contenitore:
Il riquadro è centrato in entrambe le direzioni: stessa distanza dal bordo iniziale e da quello finale, e dall'alto e dal basso. Togli height: 140px e align-items: center non ha più niente da fare, perché il contenitore si restringe all'altezza dell'elemento.
Tutti i valori di justify-content, misurati
Ogni riga qui sotto contiene gli stessi tre elementi con un justify-content diverso. I numeri nell'etichetta sopra ogni riga sono gli spazi lasciati dal browser: prima del primo elemento, tra gli elementi e dopo l'ultimo.
Il contenitore è di 420px e gli elementi occupano 180px, quindi ci sono 240px di spazio libero. Dove va a finire:
| Valore | Lo spazio libero va | Spazi nella demo |
|---|---|---|
flex-start (e start) | tutto dopo gli elementi | 0 / 0 / 0 / 240 |
center | metà prima, metà dopo | 120 / 0 / 0 / 120 |
flex-end (e end) | tutto prima degli elementi | 240 / 0 / 0 / 0 |
space-between | solo tra gli elementi | 0 / 120 / 120 / 0 |
space-around | uguale su entrambi i lati di ogni elemento, quindi i bordi ne ricevono metà | 40 / 80 / 80 / 40 |
space-evenly | tutti gli spazi uguali, bordi compresi | 60 / 60 / 60 / 60 |
flex-start segue la direzione flex e start segue la direzione di scrittura. Differiscono solo con row-reverse o column-reverse, dove flex-start sta all'estremità invertita.
Tutti i valori di align-items
align-items agisce trasversalmente alla riga. Gli elementi qui sotto hanno altezze diverse, così puoi vedere cosa fa ogni valore:
| Valore | Cosa succede sull'asse trasversale |
|---|---|
stretch (il predefinito) | Gli elementi senza un'altezza impostata crescono fino a riempire il contenitore |
flex-start (e start) | Gli elementi stanno in alto, con la loro altezza |
center | Gli elementi sono centrati, con la loro altezza |
flex-end (e end) | Gli elementi stanno in basso |
baseline | Gli elementi si spostano in modo che le prime righe di testo condividano la stessa linea di base |
Nel riquadro baseline le tre etichette "Ag" stanno sulla stessa linea anche se la prima è più grande e la seconda ha del padding sopra. È il valore giusto per una riga che mescola un titolo grande con testo piccolo, o un'etichetta con un input.
Clicca per allineare
Fai clic su una cella qualsiasi della griglia 3 per 3. Il riquadro si sposta lì, e sotto viene stampato il CSS che lo mette in quella posizione:
Le righe del selettore cambiano align-items e le colonne cambiano justify-content. La cella centrale è il classico "centrare un div".
In una colonna i due si scambiano
justify-content segue sempre l'asse principale. Con flex-direction: column l'asse principale è verticale, quindi justify-content sposta gli elementi in alto e in basso e align-items li sposta in orizzontale:
Se li confondi, scambia le due proprietà invece di riscrivere il layout.
align-self e margini auto: un solo elemento
align-self su un elemento sovrascrive align-items per quell'elemento. In flexbox non esiste justify-self; per spostare un elemento lungo l'asse principale, dagli un margine auto, che prende tutto lo spazio libero da quel lato:
L'elemento verde scende da solo in basso, e quello ambra viene spinto all'estremità opposta della riga mentre gli altri restano all'inizio.
Quando ci sono più linee: align-content
align-items allinea gli elementi dentro la loro linea. Quando un contenitore va a capo su più linee, align-content distribuisce le linee stesse e accetta gli stessi valori di justify-content. Non fa niente in un contenitore nowrap, la cui unica linea riempie sempre l'altezza del contenitore. La pagina su flex-wrap lo mostra.
Errori comuni
- Confondere gli assi.
justify-contentè la direzione del flusso,align-itemsè quella trasversale. In una colonna, il centraggio verticale èjustify-content: center. - Niente spazio libero. Un elemento con
flex: 1prende tutto lo spazio, quindijustify-contentnon ha niente da distribuire. Lo stesso succede quando il contenitore èinline-flexe largo esattamente quanto i suoi elementi. - Nessuna altezza per
align-items. Un contenitore alto quanto il suo contenuto non lascia niente da allineare. Imposta unheighto unmin-height. - Cercare
justify-selfin flexbox. Lì viene ignorato. Usamargin-inline-start: auto(omargin-left: auto) sull'elemento. align-items: stretchche non allunga. Un elemento con un suoheightlo mantiene. Togli l'altezza (usamin-heightse serve un minimo).- Mettere le proprietà sugli elementi. Entrambe vanno sul contenitore flex. Solo
align-selfva su un elemento.
Domande frequenti
Qual è la differenza tra justify-content e align-items?
justify-content distribuisce gli elementi lungo l'asse principale, la direzione in cui scorrono (orizzontale con flex-direction: row). align-items li posiziona lungo l'asse trasversale (verticale per una riga). In una colonna i due si scambiano: justify-content diventa verticale.
Qual è la differenza tra space-between, space-around e space-evenly?
space-between non mette spazio prima del primo elemento né dopo l'ultimo e divide il resto tra gli elementi. space-around dà a ogni elemento lo stesso spazio su entrambi i lati, quindi ai bordi arriva mezzo spazio. space-evenly rende uguali tutti gli spazi, bordi compresi.
Perché justify-content non funziona?
Di solito non c'è spazio libero da distribuire: un elemento ha flex-grow o flex: 1, oppure il contenitore è largo solo quanto i suoi elementi (per esempio con display: inline-flex o un contenitore flottante). Controlla anche che display: flex sia sul genitore, non sugli elementi.
Perché align-items center non centra verticalmente?
Probabilmente il contenitore è alto esattamente quanto il suo contenuto, quindi non c'è niente in cui centrare. Dai al contenitore flex un'altezza o un min-height, e gli elementi si sposteranno al centro.
Cosa fa align-self?
align-self sovrascrive l'align-items del contenitore per un solo elemento. Per esempio align-self: flex-end su un figlio sposta solo quel figlio alla fine dell'asse trasversale, mentre gli altri restano dove li ha messi align-items.
Esiste justify-self in flexbox?
No. Flexbox ignora justify-self, perché l'asse principale è condiviso da tutti gli elementi. Per spingere un elemento lungo l'asse principale, usa un margine auto, come margin-inline-start: auto. justify-self funziona in grid.