CSS Flexbox vs Grid: quale sistema di layout dovresti usare?
Sia Flexbox che CSS Grid possono produrre risultati simili, motivo per cui gli sviluppatori scelgono quello sbagliato metà delle volte. La differenza sta in una dimensione contro due — e sapere con cosa stai lavorando rende la scelta ovvia.
La regola della singola frase
Usa Flexbox quando stai disponendo elementi in una sola direzione (una riga o una colonna). Usa CSS Grid quando hai bisogno di controllare il layout in due direzioni contemporaneamente (righe e colonne simultaneamente).
Questa è l'intera decisione. Tutto il resto è un approfondimento sul perché questa regola funzioni nella pratica.
In cosa Flexbox è realmente bravo
Flexbox è stato progettato per la distribuzione dello spazio lungo un singolo asse. La sua funzione principale è che gli elementi possono crescere, ridursi e avvolgersi naturalmente senza che tu debba specificare dimensioni esatte per ognuno.
Questi sono i casi in cui Flexbox è la scelta giusta:
- Barre di navigazione — una riga di link dove vuoi che alcuni elementi vengano spinti a destra (
margin-left: auto) o spaziati uniformemente (justify-content: space-between>) - Righe di schede (cards) dove ogni scheda ha la stessa altezza indipendentemente dalla lunghezza del contenuto (
align-items: stretchgestisce questo automaticamente) - Centrare un elemento orizzontalmente e verticalmente all'interno di un contenitore — tre righe di CSS:
display: flex; justify-content: center; align-items: center - Gruppi di pulsanti, combinazioni icona + etichetta e qualsiasi componente in cui i figli devono stare affiancati con una certa spaziatura
- Liste a incastro (wrapping) dove vuoi che gli elementi si spostino alla riga successiva quando non c'è più spazio (
flex-wrap: wrap>)
.navbar {
display: flex;
align-items: center;
gap: 1rem;
}
.navbar .logo { margin-right: auto; }
/* logo rimane a sinistra, i link a destra */
In cosa CSS Grid è realmente bravo
Grid è stato progettato per layout bidimensionali — definisci sia righe che colonne, e puoi posizionare gli elementi precisamente in celle, coprire più righe o colonne e creare spazi in entrambe le direzioni.
Questi sono i casi in cui Grid è la scelta giusta:
- Layout di pagina — header, sidebar, contenuto principale, footer tutti posizionati l'uno rispetto all'altro
- Layout di riviste o dashboard dove elementi diversi occupano quantità diverse di spazio
- Gallerie di immagini con una struttura a griglia coerente indipendentemente dalla dimensione delle immagini
- Layout di moduli (forms) dove le etichette e gli input devono essere allineati sia orizzontalmente che verticalmente
- Qualsiasi layout in cui stai pensando alle righe E alle colonne contemporaneamente
.page {
display: grid;
grid-template-columns: 250px 1fr;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
min-height: 100dvh;
}
Esempio affiancato: Una griglia di schede
È qui che nasce la confusione. Entrambi i sistemi possono creare una riga di schede:
.card-row {
display: flex;
gap: 1rem;
flex-wrap: wrap;
}
.card { flex: 1 1 280px; }
Con Grid:**
.card-row {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 1rem;
}
Entrambi funzionano. La versione Grid è solitamente preferita qui perché auto-fill con minmax ti dà un comportamento delle colonne più prevedibile — ogni colonna ha esattamente la stessa larghezza e la griglia si riorganizza in modo pulito. La versione Flexbox è migliore quando le schede possono avere larghezze variabili e vuoi che utilizzino lo spazio disponibile in modo più fluido.
La differenza di allineamento
In Flexbox, allinei gli elementi lungo l'asse principale (la direzione che hai scelto) e l'asse trasversale (perpendicolare ad esso). Non puoi controllare indipendentemente la posizione di una cella all'interno di una griglia invisibile di righe e colonne.
In Grid, ogni elemento vive in una cella con una posizione sia di riga che di colonna. Puoi posizionare un elemento esattamente alla riga 2, colonna 3, o lasciare che il browser lo posizioni automaticamente. Flexbox non ha il concetto di celle — gli elementi scorrono semplicemente nella direzione specificata.
Errori comuni
Usare Grid per il semplice centraggio:** display: flex; align-items: center; justify-content: center è più veloce che impostare una griglia per un singolo elemento. Flexbox vince nelle attività a asse singolo.
Usare Flexbox per layout di intere pagine:** Una volta che hai più di due componenti che devono relazionarsi posizionalmente (header + sidebar + contenuto + footer), la mancanza di un secondo asse in Flexbox diventa un problema. Grid gestisce questo con le aree nominate.
Usare la colonna di Flexbox come sostituto delle righe di Grid:** flex-direction: column permette agli elementi di impilarsi verticalmente, ma perdi la capacità di allineare il contenuto attraverso più colonne simultaneamente. Se stai pensando alle colonne, passa a Grid.
Usare entrambi insieme
Grid e Flexbox non si escludono a vicenda. Il modello più comune nel mondo reale è Grid per il layout a livello di pagina, Flexbox all'interno di ogni sezione:
- Grid posiziona la sidebar, l'header e l'area del contenuto principale
- All'interno della navigazione (che si trova nell'area dell'header), Flexbox gestisce la riga logo + link + pulsante CTA
- All'interno dell'area del contenuto principale, una griglia di schede usa Grid per la struttura delle colonne
- All'interno di ogni scheda, Flexbox gestisce il layout icona + testo + pulsante
Questo schema di composizione — Grid per la struttura, Flexbox per i componenti — è il modo in cui funzionano internamente la maggior parte dei framework CSS moderni (Tailwind, Bootstrap).
Riferimento rapido delle proprietà
| Cosa vuoi ottenere | Flexbox | Grid |
|---|---|---|
| Impostare la direzione del layout | flex-direction | grid-template-columns/rows |
| Spazio tra gli elementi | gap o justify-content | gap |
| Allineare sull'asse trasversale | align-items | align-items |
| Posizionare un elemento specificamente | Non possibile direttamente | grid-column / grid-row |
| Rendere gli elementi della stessa altezza | align-items: stretch | Comportamento predefinito |
| Responsive senza media queries | flex-wrap: wrap + flex-basis | auto-fill + minmax() |
Crea layout Flexbox visivamente
Usa il nostro generatore visivo di CSS Flexbox per creare contenitori flex, regolare l'allineamento e copiare il CSS generato in pochi secondi.