Un'introduzione al modulo CSS Flexbox

Il CSS, nonostante il suo livello di competenza percepito relativamente basso, sembra sempre avere un killer nella manica. Ricorda come le query multimediali hanno reso possibili layout reattivi e hanno rivoluzionato lo sviluppo front-end? Bene, oggi parleremo di una nuova modalità di layout, chiamata flexbox, nuova in CSS3. Sono sicuro che stai andando di rado! Iniziamo dopo il salto.

Modifiche successive alle tecniche e al software

Alcuni aspetti delle applicazioni o delle tecniche utilizzate in questo tutorial sono cambiati da quando è stato originariamente pubblicato. Questo potrebbe rendere un po 'difficile da seguire. Ti consigliamo di guardare questi tutorial più recenti sullo stesso argomento:

  • Modifiche Flexbox
  • Problema di Github

Supporto CSS Flexbox

Attualmente, la specifica CSS Flexbox è una bozza di lavoro e le cose cambieranno! Gli esempi di questo tutorial potrebbero potenzialmente non riuscire a funzionare in futuro, dal momento che i browser modificano la loro implementazione in flexbox per adattarsi alle specifiche. Lo scopo di questo tutorial è fornire una conoscenza di base della CSSbox CSS e dimostrare come utilizzarla nelle tue pagine web.

Si prega di notare che questo tutorial userà esempi prefissati per webkit / non-vendor per brevità. Dai un'occhiata a caniuse.com per un elenco di browser che supportano il modulo flexbox e fai riferimento ai prefissi necessari nei tuoi progetti, di conseguenza.


Sfondo sulle modalità di layout

CSS Flexbox è essenzialmente una modalità di layout. Esistono le modalità di layout esistenti nei CSS e sono lì da molto tempo. È un esempio di una modalità di layout bloccare (ad esempio display: block). I layout di blocco sono un ottimo modo per stilare interi documenti, molti elementi sono trattati dal browser come livello di blocco, per impostazione predefinita; questi includono elementi comuni, come paragrafi e divS.

Occasionalmente, quando un elemento non è un blocco, è probabile che lo sia in linea. Gli elementi di livello inline includono il tag di ancoraggio, il tag di input e il tag forte. Gli strumenti di sviluppo di Chrome consentono effettivamente di visualizzare lo "stile calcolato" di un elemento, che è un ottimo modo per determinare quali proprietà e valori CSS sono stati applicati a elementi che non sono stati impostati esplicitamente dallo sviluppatore.

Ecco un suggerimento per accedere allo stile calcolato di un elemento utilizzando il metodo window.getComputedStyle di JavaScript.

 var elem = document.querySelector ('h1 # someId'); window.getComputedStyle (elem) .display; //bloccare

Blocchi e modalità di layout in linea a parte, il CSS ha anche presentato e posizionato le modalità di layout. Il motivo per cui le modalità di layout vengono referenziate è perché flexbox è una nuova modalità di layout, che consente una maggiore flessibilità durante la creazione di pagine Web.

Il layout della flexbox ci fornisce semplici tecniche per dettare facilmente il modo in cui gli articoli devono essere disposti.


Come puoi usare Flexbox?

Per forzare un elemento a usare il layout della flexbox, aggiungiamo il FlexBox valore alla proprietà display.

 #container display: flexbox; 

Per impostazione predefinita, un flexbox è un elemento a livello di blocco; possiamo definire un elemento a livello di riga in questo modo:

 #container display: inline-flexbox; 

Simile all'esempio sopra, ti consigliamo di applicare il layout della flexbox al genitore dei bambini di cui desideri controllare il posizionamento. Diamo un'occhiata al semplice esempio dal vivo.

 
  • Un oggetto
  • Un altro oggetto
  • L'ultimo oggetto
 ul / * Old Syntax * / display: -webkit-box; / * Nuova sintassi * / display: -webkit-flexbox; 

Noterai che gli elementi dell'elemento della lista ora stanno scorrendo orizzontalmente, in modo simile a come potrebbero essere visualizzati, se li avessimo usati float: a sinistra. Gli elementi dell'elemento della lista possono ora essere indicati come articoli di flexbox.

Nota: un discendente diretto di un flexbox, che è assolutamente posizionato, ad es. utilizzando posizione: assoluta, non può essere un elemento di flexbox, in quanto interrompe il flusso normale.

Si può notare che gli elementi (gli elementi dell'elenco) hanno assunto un flusso orizzontale (la direzione del flusso è anche nota come asse principale). Fortunatamente, siamo in grado di controllare questo flusso (e quindi quello che è considerato l'asse principale) ed evitare l'uso di galleggianti!


Esplorando flex-direzione

Possiamo applicare il flex-direzione proprietà e specificare la direzione in cui desideriamo che i nostri articoli flexbox siano disposti. La proprietà accetta riga, riga-indietro, colonna e colonna-indietro come valori. Il valore predefinito è riga.

Usando il markup simile all'esempio precedente, possiamo aggiungere un'altra proprietà CSS: coppia di valori: (flex-direction: column)

 ul -webkit-flex-direction: column; 

Se stai lavorando, vai avanti e prova a cambiare colonna valore sul flex-direzione proprietà a Colonna-reverse, e vedere come gli elementi della flexbox sono visualizzati in un layout con colonne, ma nell'ordine inverso.


Confezione con flex-wrap

Per impostazione predefinita, una flexbox è a linea singola. Uno che non può contenere i suoi figli può traboccare usando il flex-wrap proprietà; possiamo istruire la flexbox affinché diventi multi-linea, nel qual caso gli articoli della flexbox possono essere avvolti. flex-wrap accetta i valori, nowrap (il valore predefinito), avvolgere & wrap-inversa.

Notate come, nella demo, gli oggetti si "avvolgono", poiché non possono essere contenuti all'interno del loro piccolo 100px genitore. Utilizzando gli strumenti di sviluppo, prova a cambiare il overflow: nascosto e -webkit-flex-wrap bit. Senza il flex-wrap e straripamento proprietà, gli oggetti superano i loro genitori.

C'è una utile proprietà di stenografia per flex-direzione e flex-wrap, come mostrato di seguito:

 direzione della flessione: riga; flex-wrap: nowrap; // Usando i due valori sopra con la stenografia flex-flow otteniamo: flew-flow: row nowrap; // flex-direction: column; flex-wrap: wrap; flex-flow: colonna wrap;

Un esempio di Quickie

Mentre certamente non è il più bello che ci sia, questo menu di esempio dimostra alcuni usi per la flexbox.

  • Una larghezza di 300px è stato impostato sulla Flexbox, a sua volta, per dimostrare il wrapping.
  • Un'idea generale per un menu potrebbe essere quella di utilizzare le query multimediali per servire un menu mobile friendly, dove direzione della flessione: colonna potrebbe avere senso.

Sarebbe bello istruire gli elementi della flexbox per diffondersi e utilizzare lo spazio che hanno a loro disposizione - qualcosa del genere. Ecco a cosa serve la proprietà flex.


Flessione

Flettere è la capacità del contenitore di modificare la sua larghezza o altezza per riempire lo spazio disponibile. "

Il flettere la proprietà è una bella caratteristica; offre qualcosa di nuovo che sarebbe stato difficile da raggiungere in passato.

Con questa proprietà, possiamo impostare una dimensione preferita per i nostri articoli. Tieni presente che la proprietà flex viene applicata sugli elementi della flexbox, non sulla stessa. Il browser tenterà di impostare la dimensione degli elementi della flexbox su a base per riga. Quindi tenterà di distribuire equamente lo spazio libero rimanente sugli articoli. Se guardiamo all'esempio del menu e usiamo gli strumenti di sviluppo per scoprire la larghezza calcolata degli elementi della flexbox, vedremo che è 78px. Analizziamo ulteriormente ...

Probabilmente ti starai chiedendo, "In che modo gli oggetti della flexbox hanno guadagnato il loro spazio in più quando abbiamo impostato la larghezza preferita su 60px?"

  • Nella prima riga, ci sono tre elementi, che dovrebbero essere in giro 60pxflex proprietà (che è un totale di 180px).
  • La larghezza di tutta la flexbox è 300px. Quello, meno 180px (la dimensione totale preferita degli articoli), è 120px. Tuttavia, non sembra che effettivamente abbiamo 120px di spazio libero.
  • Ogni articolo di flexbox ha un margin-right di 10px; questo è un totale di 30px per tre articoli, lasciandoci con 90px di spazio libero.
  • Ma aspetta, ogni oggetto ha anche il padding: 5px - quello è 5px di imbottitura in alto, a destra, in basso ea sinistra. Quindi, simile al margin-right proprietà, ogni voce consuma 10px di imbottitura in relazione alla sua larghezza. Siamo rimasti con 60px di spazio libero - beh quasi.
  • Ogni oggetto ha bordo: 1px solido nero - 1px sui lati sinistro e destro. Un totale di due pixel per articolo, quindi, per tre elementi, che arriva a 6px. Ora siamo rimasti con 54px di spazio libero.
  • Con 54px di spazio libero, possiamo distribuirlo allo stesso modo dei tre elementi sulla prima riga - questo è 18px, per articolo, che ora ha senso perché, quando impostiamo una preferenza per 60px, la larghezza calcolata trasformata in 78px.

Come avrai intuito, l'ultima riga (contenente l'elemento "Contattaci") si flette per tutta la larghezza della flexbox.

Gli oggetti di Flexbox possono avere diverse larghezze; un oggetto con a flettere di 2 si dice che sia due volte più flessibile come un oggetto con a flettere di 1. Quindi, quando si tratta di distribuire spazio libero tra i due oggetti, l'oggetto con a flettere di 1 verrà dato metà dello spazio che l'elemento con a flettere di 2 riceve.


ordinazione

Flexbox ci offre un modo semplice per ordinare determinati articoli tramite CSS, indipendentemente dall'ordine in cui appaiono nel documento. Ecco un rapido esempio.

Dato il seguente markup:

 
  • Articolo 1
  • Articolo 2
  • Articolo 3
 ul display: -webkit-flexbox;  ul li: nth-child (1) -webkit-flex-order: 2; 

Possiamo scegliere come target il primo elemento dell'elemento di elenco utilizzando la pseudo classe nth-child e quindi applicare il flex-ordine proprietà ad esso. Gli elementi di Flexbox sono, per impostazione predefinita, all'ordine 0. Inserendo il primo elemento della lista in ordine 2, il browser visualizzerà prima gli articoli 2 e 3, che saranno seguiti dall'articolo 1.


Allineamento

Siamo in grado di allineare gli elementi della flexbox sull'asse principale usando il flex-pack proprietà. Questa proprietà accetta i seguenti valori come:

  • inizio
  • fine
  • centro
  • giustificare
  • distribuire

La demo di questo tutorial fornisce alcuni esempi dei diversi tipi di allineamento. Osservando l'esempio jsbin, possiamo vedere che gli oggetti sono stati centrati solo su un asse: l'asse principale. Questo è essenzialmente l'asse su cui sono posizionati gli oggetti della flexbox.

Possiamo cambiare l'asse regolando il flex-direzione proprietà. Impostandolo a colonna, diventa evidente che l'asse principale è cambiato. Per poter influire sull'allineamento dell'asse trasversale, (l'asse perpendicolare all'asse principale) possiamo usare flex-align.

Centrare un oggetto

 

Dovrei essere centrato

 .flexbox display: -webkit-flexbox; -webkit-flex-pack: center; -webkit-flex-align: center; larghezza: 50%; altezza: 100 px; sfondo: arancione;  .flexbox p border: 1px verde fisso; imbottitura: 5px; 

Sicuramente dai un'occhiata alla demo live se sei confuso.


Ulteriori letture

  • flexiejs offre il supporto cross browser per il flexbox.
  • Modernizr può rilevare il supporto per la flexbox.
  • html5rocks contiene un tutorial su flexbox
  • Alex Russell, che lavora su Google Chrome, ha un interessante set di classi CSS per l'utilizzo di flexbox.
  • insertthtml ha un divertente tutorial sulle specifiche della flexbox, include un grande set di immagini che possono aiutare a comprendere certi concetti.
  • Il libro Stunning CSS3 ha una sezione su flexbox.

Grazie per la lettura, e assicuratevi di fare riferimento a caniuse.com per un elenco di browser che supportano il modulo flexbox, nonché a quali prefissi dei produttori dovrebbe essere fatto riferimento.