Flexbox e il suo funzionamento

Tabella dei contenuti

Introduzione

Il modello di layout flex è stato introdotto per aggiungere una funzionalità adattabile alle nuove esigenze responsive delle applicazioni web. Fino alla sua introduzione esistevano quattro principali modelli di layout:

Il modello flex possiede delle caretteristiche in grado di riposizionare gli elementi a seconda delle dimensioni del contenitore e si rapporta a due assi: il main axis (orizzontale - x) e il cross axis (verticale - y).

flex-direction-terms.svg

L'immagine precedente è presa dalla sezione del W3C che tratta direttamente l'argomento flex box ed esemplifica in maniera chiara il funzionamento del modello.

Impostazioni iniziali

Per esemplificare il funzionamento delle varie proprietà del modello flex, utilizziamo dei semplici parametri iniziali.

Il contenitore ha uno sfondo blu, mentre gli elementi, numerati, sono di colore arancio con bordo bianco. In realtà il bordo bianco lo otteniamo tramite box-shadow inset per mantenere gli esempi compatibili con Internet Explorer, il quale calcola il bordo come un'aggiunta alle dimensioni degli elementi.

Impostiamo inoltre una dimensione semi-fissa per il contenitore (w100% * h200px) ed una dimensione relativa per gli elementi (25% * 25%), in modo da avere una visione più omogenea dell'esempio.

flex-direction

Regola la scelta dell'asse lungo il quale il contenitore allinea gli elementi e la loro direzione.

nessuno stile
1
2
3
row
1
2
3
row-reverse
1
2
3
column
1
2
3
column-reverse
1
2
3

flex-wrap

definisce se gli elementi devono essere distribuiti lungo l'asse oppure no. Definisce inoltre la direzione di distribuzione.

nowrap
1
2
3
4
5
6
7
8
wrap
1
2
3
4
5
6
7
8
wrap-reverse
1
2
3
4
5
6
7
8

justify-content

Definisce la gestione dello spazio residuo tra gli elementi lungo il main axis.

flex-start
1
2
3
flex-end
1
2
3
center
1
2
3
space-between
1
2
3
space-around
1
2
3

per le colonne

flex-start
1
2
3
flex-end
1
2
3
center
1
2
3
space-between
1
2
3
space-around
1
2
3

align-items

Definisce la distribuzione dello spazio residuo tra gli elementi lungo il cross axis.

flex-start
1
2
3
flex-end
1
2
3
center
1
2
3
stretch
1
2
3
baseline
1
2
3

align-content

Funziona esattamente come justify-content, ma si applica al cross axis.

flex-start
1
2
3
4
5
6
7
8
flex-end
1
2
3
4
5
6
7
8
center
1
2
3
4
5
6
7
8
space-between
1
2
3
4
5
6
7
8
space-around
1
2
3
4
5
6
7
8

Proprietà degli elementi

Gli elementi hanno delle proprietà che ci permettono di attribuire loro comportamenti collettivi o indipendenti.

Nell'esempio seguente ho indicato il valore corrispondente all'interno dei vari elementi.

order
1
2
3 3
4
5
6
7 2
8
9
flex-grow
1
2
3 2
4
5 3
6
flex-shrink
1
2
3 2
4
5 3
6
flex-basis
1 25%
2 25%
3 25%
4 25%
5 25%
6 25%
7 25%
8 25%
9 25%
align-self
1
2 center
3 flex-end
4
5
6

Proprietà non supportate

Proprio per le sue caratteristiche di allineamento e distribuzione automatiche degli elementi, il modello flex box ignora altera il funzionamento di alcune proprietà.

Supporto browser

Il supporto browser rimane al momento limitate alle ultime versioni dei principali browser. Di seguito una tabella riassuntiva. Per i dati mi sono basato sulla tabella di caniuse.com, al momento aggiornata al 12 agosto 2014.

chrome
firefox
iexplorer
safari
opera
27+
30+
11
-
23+
27 -webkit-
-
10 -ms-
6.1+ -webkit-
-
ios safari
opera mini
android browser
chrome for android
-
-
4.4+
37
7.1+
-
2.3+ -webkit-
-

Conclusione

Come abbiamo potuto vedere, il modello flexbox ci fornisce degli ottimi strumenti per costruire layout complessi e per controllarne facilmente il comportamento in base alle differenti viewport. Questa caratteristica risulta molto efficace nel responsive webdesign, ma non solo. È in grado di rendere più semplice anche la progettazione di applicazioni web dinamiche, nelle quali, ad esempio, vogliamo ridimensionare e riordinare alcuni elementi in base ad un comportamento dell'utente. Diventa sufficiente impostare alcune proprietà ed il modello flexbox esegue i calcoli al nostro posto.

L'unica nota dolente rimane il supporto browser che confina l'utilizzo di questa tecnica alle ultime versioni. Non credo che il supporto a flexbox verrà esteso alle vecchie versioni, di conseguenza l'unica pratica possibile rimane quella di progettare delle solide applicazioni web utilizzando tecniche standard ed arricchirle nella visualizzazione sui browser di ultima generazione con tecniche più moderne, come consigliato da Dave Methvin e Rey Bango nel loro articolo Cross Browser Development Standards & Interoperability Best Practices | Modern.IE.