CSS Flexbox
Il modello di layout monodimensionale per distribuire e allineare elementi lungo un asse. Fondamentale per navbar, card, centraggi e qualsiasi layout a riga o colonna.
Introduzione
CSS Flexible Box Layout, o Flexbox, è un metodo di layout monodimensionale: permette di disporre gli elementi lungo un unico asse — orizzontale o verticale.
Gli elementi possono espandersi (flex) per riempire lo spazio disponibile, oppure contrarsi per adattarsi a spazi più piccoli. È lo strumento ideale per navbar, gruppi di pulsanti, card allineate e centraggi.
Usa Flexbox per layout monodimensionali (una riga o una colonna alla volta). Usa CSS Grid per layout bidimensionali (righee colonne allo stesso tempo). Spesso si usano insieme.
Terminologia
Prima di scrivere codice è importante conoscere i quattro concetti chiave:
- Flex container — l'elemento su cui si imposta
display: flex. Gestisce la distribuzione dei figli. - Flex items — i figli diretti del flex container. Solo i figli diretti diventano flex items.
- Main axis — l'asse principale su cui gli elementi vengono disposti. Determinato da
flex-direction. - Cross axis — l'asse perpendicolare al main axis.
/* Il flex container attiva il contesto flex */
.container {
display: flex; /* o inline-flex */
}
/* I figli diretti diventano automaticamente flex items */
/* I discendenti più profondi NON sono flex items */Il Flex Container
Basta aggiungere display: flex a un elemento per trasformarlo in flex container. I suoi figli diretti si dispongono automaticamente in riga, invece di impillarsi come i normali elementi block.
flex-direction
La proprietà flex-direction definisce l'asse principale e la direzione in cui gli elementi vengono disposti.
/* Quattro valori possibili */
.container {
flex-direction: row; /* → da sinistra a destra (default) */
flex-direction: row-reverse; /* ← da destra a sinistra */
flex-direction: column; /* ↓ dall'alto in basso */
flex-direction: column-reverse; /* ↑ dal basso in alto */
}Con flex-direction: row, il main axis è orizzontale e il cross axis è verticale. Con column è il contrario. Questo influenza il comportamento di justify-content e align-items.
flex-wrap
Di default, tutti i flex items cercano di stare su una sola riga, comprimendosi se necessario. Con flex-wrap: wrap possono andare a capo su più righe.
/* Tre valori possibili */
.container {
flex-wrap: nowrap; /* tutto su una riga (default) */
flex-wrap: wrap; /* va a capo su più righe */
flex-wrap: wrap-reverse; /* va a capo in senso inverso */
}flex-flow
flex-flow è la forma abbreviata (shorthand) per scrivereflex-direction e flex-wrap in una sola riga. Il valore predefinito è row nowrap.
/* Forma estesa */
.container {
flex-direction: row;
flex-wrap: wrap;
}
/* Forma abbreviata equivalente */
.container {
flex-flow: row wrap;
}Dimensioni con flex
La proprietà flex controlla quanto spazio un item occupa lungo il main axis. È uno shorthand per tre proprietà:
flex-grow— quanto l'item cresce rispetto agli altriflex-shrink— quanto si riduce se lo spazio è insufficienteflex-basis— la dimensione iniziale prima della distribuzione
/* Forma abbreviata — raccomandata */
.item { flex: 1; } /* tutti uguali */
.item { flex: 2; } /* doppio dello spazio */
.item { flex: 1 100px; } /* almeno 100px, poi distribuisce */
/* Forma estesa equivalente */
.item {
flex-grow: 1;
flex-shrink: 1;
flex-basis: 0;
}Si consiglia di usare sempre flex invece delle singole proprietà: la shorthand imposta automaticamente i valori di default in modo corretto (es. flex: 1 equivale a flex: 1 1 0, non a flex-grow: 1 da solo).
justify-content
justify-content distribuisce gli elementi lungo il main axis. Se flex-direction è row, agisce in orizzontale; se è column, agisce in verticale.
/* Valori principali */
.container {
justify-content: flex-start; /* → inizio (default) */
justify-content: flex-end; /* → fine */
justify-content: center; /* → centro */
justify-content: space-between; /* primo all'inizio, ultimo alla fine */
justify-content: space-around; /* spazio uguale attorno a ogni item */
justify-content: space-evenly; /* spazio identico tra tutti */
}align-items
align-items allinea gli elementi lungo il cross axis(l'asse perpendicolare). Con flex-direction: row, agisce in verticale.
/* Valori principali */
.container {
align-items: stretch; /* si allungano per riempire il container (default) */
align-items: flex-start; /* allineati in alto */
align-items: flex-end; /* allineati in basso */
align-items: center; /* centrati verticalmente */
align-items: baseline; /* allineati alla linea di base del testo */
}Ordinare con order
La proprietà order permette di cambiare l'ordine visivo degli elementi senza toccare l'HTML. Il valore predefinito è 0; valori più alti appaiono dopo, valori negativi appaiono prima.
/* Regole di order */
.item { order: 0; } /* posizione normale (default) */
.item { order: 1; } /* appare dopo quelli con order: 0 */
.item { order: -1; } /* appare prima di quelli con order: 0 */
/* Esempio pratico: spostare un elemento in cima */
.featured {
order: -1;
}order cambia solo l'ordine visivo. Gli screen reader e la navigazione da tastiera seguono ancora l'ordine del DOM. Per cambiare l'ordine logico modifica direttamente l'HTML.
Esercizi
✏️Metti in pratica
Esercizio A — Base
Navbar orizzontale
Crea una navbar con Flexbox che abbia:
- Logo a sinistra
- Voci di menu al centro
- Pulsante login a destra
- Altezza fissa
56pxcon elementi centrati verticalmente
Esercizio B — Intermedio
Card con layout interno
Crea una serie di card con Flexbox:
- Le card si dispongono in riga e vanno a capo se non c'è spazio
- Ogni card ha una larghezza minima di
280pxe cresce per riempire lo spazio - Il contenuto di ogni card è disposto in colonna
- Il bottone è sempre in fondo alla card, indipendentemente dall'altezza del testo
Esercizio C — Avanzato
Layout a due colonne
Realizza un layout pagina con sidebar e contenuto principale:
- Sidebar con larghezza fissa di
240px, non si restringe né si allarga - Il contenuto principale occupa tutto lo spazio rimanente
- I due blocchi si allineano in cima, non si allungano per riempire l'altezza