Menu

flex-wrap e flex-direction in CSS: righe, colonne, a capo

flex-wrap decide se gli elementi flex si stringono su una sola riga o passano alla successiva, e flex-direction decide se scorrono in riga o in colonna. Impara entrambi con esempi dal vivo, la forma abbreviata flex-flow, align-content e una fila di schede responsive senza media query.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

flex-wrap: una riga, o tutte quelle che servono

Per impostazione predefinita un contenitore flex tiene tutti i suoi elementi su una riga (flex-wrap: nowrap) e li restringe per farceli stare. flex-wrap: wrap invece lascia loro la propria dimensione e li fa passare alla riga successiva:

Ogni elemento chiede 100px, cinque elementi in un box da 340px. Cinque elementi e quattro spazi da 8px richiedono 532px, quindi senza andare a capo ogni elemento viene stretto a circa 62px, perché gli elementi flex si restringono per impostazione predefinita. Con wrap restano da 100px: tre stanno sulla prima riga e gli altri due passano a una seconda riga.

Valori di flex-wrap

ValoreCosa succede
nowrap (predefinito)Una riga. Gli elementi si restringono, ed escono dal contenitore quando non possono restringersi ancora
wrapGli elementi che non ci stanno iniziano una nuova riga sotto
wrap-reverseLo stesso, ma le nuove righe si impilano verso l'alto: la prima riga è in basso

Guarda gli elementi andare a capo

Trascina il cursore per cambiare la larghezza del contenitore. Il riquadro di lettura conta le righe e dice quanti elementi ci sono su ognuna:

A 400px, quattro elementi da 90px e tre spazi da 8px (384px) stanno su una riga, quindi ottieni 4 + 2. Trascina verso 620px e tutti e sei stanno su una riga; trascina verso 120px e ogni elemento ha una riga tutta sua.

flex-direction: riga o colonna

flex-direction imposta la direzione in cui scorrono gli elementi, cioè l'asse principale:

ValoreGli elementi scorronoPrimo elemento
row (predefinito)uno accanto all'altro, nella direzione di scritturaall'inizio della riga
row-reverseuno accanto all'altro, al contrarioalla fine della riga
columnimpilati, dall'alto in bassoin alto
column-reverseimpilati, dal basso in altoin basso

Nei due box row gli elementi si allungano fino a tutta l'altezza del box, perché align-items: stretch agisce trasversalmente alla riga. Nei box column si allungano invece fino a tutta la larghezza, per lo stesso motivo. Gli assi hanno ruotato, e ogni proprietà di allineamento ha ruotato con loro (la pagina su justify-content lo mostra nel dettaglio).

flex-flow: entrambi in una riga

flex-flow è la forma abbreviata per flex-direction seguito da flex-wrap:

.cards { flex-flow: row wrap; }      /* flex-direction: row; flex-wrap: wrap; */
.stack { flex-flow: column nowrap; } /* flex-direction: column; flex-wrap: nowrap; */

Schede responsive con wrap e nessuna media query

Dai a ogni elemento una dimensione di partenza con flex: 1 1 180px e lascia che la riga vada a capo. Ogni elemento cresce fino a riempire la sua riga, e quando una riga non può contenere un altro elemento da 180px, il successivo va a capo:

In un'anteprima larga circa 800px, tre schede stanno sulla prima riga (circa 253px ciascuna) e le ultime due si dividono la seconda riga, dove ognuna cresce fino a circa 386px. Flexbox funziona così: ogni riga distribuisce il proprio spazio, quindi le schede su un'ultima riga corta finiscono per essere più larghe di quelle sopra. Se vuoi che l'ultima scheda resti larga come le altre, usa invece grid con repeat(auto-fill, minmax(180px, 1fr)) (vedi la pagina su grid).

align-content: spaziare le righe

Quando un contenitore va a capo ed è più alto delle sue righe, align-content decide dove vanno le righe. Accetta gli stessi valori di justify-content, più stretch:

Nel primo box entrambe le righe stanno in alto. Nel secondo la prima riga è in alto e la seconda in basso, con tutta l'altezza libera in mezzo.

Ordine invertito e accessibilità

row-reverse, column-reverse e wrap-reverse cambiano solo dove vengono disegnati gli elementi. Gli screen reader e il tasto Tab seguono comunque l'ordine dell'HTML, quindi chi usa la tastiera attraversa gli elementi nella direzione opposta a quella che vede. Inverti solo per un effetto visivo; quando l'ordine ha un significato, cambialo nell'HTML.

Errori comuni

  • Elementi che si restringono invece di andare a capo. Gli elementi con flex: 1 partono da un flex-basis di 0 e si stringono su una sola riga. Dagli una base reale, come flex: 1 1 200px.
  • Mettere flex-wrap sugli elementi. Va sul contenitore flex.
  • Usare align-items per spaziare le righe andate a capo. Allinea gli elementi dentro ogni riga; le righe stesse si spostano con align-content.
  • Un ultimo elemento solitario allungato su tutta la riga. È flex-grow su una riga con un solo elemento. Usa grid se ogni scheda deve avere la stessa larghezza.
  • Aspettarsi che flex-direction: column riempia un'altezza. Un contenitore a colonna è alto solo quanto il suo contenuto, a meno che tu non gli dia un height, quindi justify-content non ha spazio su cui lavorare.

Domande frequenti

Cosa fa flex-wrap: wrap?

Permette agli elementi flex di passare su una nuova riga quando non ci stanno in una sola. Con il valore predefinito nowrap, gli elementi restano su una riga e si restringono, oppure escono dal contenitore se non possono restringersi ancora.

Perché flex-wrap non funziona?

L'andata a capo avviene solo quando le dimensioni di partenza degli elementi superano, sommate, quella del contenitore. Gli elementi con flex: 1 partono da un flex-basis di 0, quindi non vanno mai a capo; dagli una vera dimensione di partenza (flex: 1 1 200px o width: 200px). Controlla anche che flex-wrap sia sul contenitore flex, non sugli elementi.

Che differenza c'è tra flex-direction row e column?

row (il valore predefinito) mette gli elementi uno accanto all'altro nella direzione di scrittura, e column li impila dall'alto in basso. L'asse principale ruota di conseguenza, quindi in una colonna justify-content lavora in verticale e align-items in orizzontale.

Cos'è flex-flow?

Una forma abbreviata per flex-direction e flex-wrap in una sola dichiarazione: flex-flow: row wrap; equivale a flex-direction: row; flex-wrap: wrap;.

Che differenza c'è tra align-items e align-content?

align-items posiziona gli elementi dentro la loro riga. align-content posiziona le righe stesse dentro il contenitore, quindi conta solo quando il contenitore ha flex-wrap: wrap ed è più alto delle sue righe.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA