CSS FLEXBOX

Con i flexbox (o più precisamente CSS Flexible Box Layout) funziona in modo intelligente e dinamico: il layout si adatta in modo flessibile al display utilizzato (Responsive Design). Lo spazio viene riempito o gli elementi vengono accostati tra loro in modo che tutto sia chiaramente visibile. Per fare questo lavoro, senza compromettere il layout desiderato, Flexbox lavora con due assi: l’asse orizzontale e l’asse verticale. Utilizzando questi assi gli elementi possono essere disposti in relazione tra loro all’interno del box. In questo modo vengono dunque ripartiti tutti gli elementi. CSS Flexbox assicura così che lo spazio di questi elementi sia riempito in modo adeguato.

Flexbox si basa su un container (flex container) che a sua volta contiene diversi elementi (flex items).

 

Il container assegna le sue proprietà agli elementi ivi contenuti, ciò vuol dire che gli elementi sono i flexbox effettivi.

I due assi hanno ciascuno una direzione: in genere l’asse orizzontale va da sinistra a destra, mentre l’asse verticale va dall’alto verso il basso. Nei flexbox gli elementi possono essere disposti in righe o in colonne. Non è prevista una combinazione. Per esempio, se si sceglie la disposizione in riga (che è anche lo standard), CSS Flexbox cercherà di organizzare tutti gli elementi in una riga.

Vediamo un esempio. Creiamo il contentitore con i 3 elementi con HTML:

Elementi nel container:
<div class="flex-container">  
   <div class="flex-item">Box 1</div>  
   <div class="flex-item">Box 2</div>  
   <div class="flex-item">Box 3</div>
</div>

Utilizzando i CSS distribuiamo i singoli Items lungo l’asse principale orizzontale (flex-direction:row) partendo da sinistra (justify-content:flex-start) verso  destra.

Elementi nel container:

<style>
.grigio { background-color: grey; }
.grafica { 
    background-color: white;
    line-height: 100px;
    width: 200px;
    margin: 10px;
    text-align: center;
    font-size: 50px;
}

.flex-container {
  display: flex;
  flex-direction: row;
}
.flex-item { justify-content:flex-start; }
</style>
Vediamo ora in dettaglio le istruzioni CSS abbinate al container.

Proprietà per il flex container

flex-direction (https://developer.mozilla.org/en-US/docs/Web/CSS/flex-direction)
Esistono 4 diverse possibilità che possono essere utilizzate con la proprietà flex-direction:

justify-content (https://developer.mozilla.org/en-US/docs/Web/CSS/justify-content)
Specifica la distribuzione degli items lungo l'asse fissato dall'istruzione flex-direction. Qualora nel container vi sia almeno un box con flex-grow diverso da zero questa proprietà non comporta alcun effetto. I valori principali che che possono essere assegnati all'istruzione justify-content sono (solo flex-start, flex-end e center sono supportati da tutti i browser):

flex-wrap (https://developer.mozilla.org/en-US/docs/Web/CSS/flex-wrap)
Con flex-wrap si possono distribuire gli elementi in modo ordinato su più linee.

flex-flow (https://developer.mozilla.org/en-US/docs/Web/CSS/flex-flow)
Il comando flex-flow è un'abbreviazione di flex-direction e flex-wrap. Ad esempio flex-flow:row wrap; equivale a: flex-direction:row; flex-wrap:wrap;.

align-content (https://developer.mozilla.org/en-US/docs/Web/CSS/align-content)
Questa proprietà funziona solo se il wrap è attivo (con flex-wrap:wrap o flex-wrap:wrap-reverse). Specifica la distribuzione all'interno del contenitore degli items mandati a capo per effetto del wrap. I valori ammessi per la seguente proprietà sono:

align-items (https://developer.mozilla.org/en-US/docs/Web/CSS/align-items)
Questa proprietà funziona solo se il wrap non è attivo (con flex-wrap:nowrap). Specifica la posizione della sequenza degli items rispetto all'asse opposto a quello definito con la proprietà flex-direction . I valori ammessi per la seguente proprietà sono:

Proprietà per i flex item

order (https://developer.mozilla.org/en-US/docs/Web/CSS/order)
 Il valore predefinito (se non specificato) è 0. Il valore dell’ordine aggiunge l’oggetto ad un gruppo astratto. Tutti gli elementi che abbiamo creato finora appartengono allo stesso gruppo perché hanno tutti il valore 0. Partendo da questo valore è ora possibile spostare singoli oggetti in avanti (-1) o indietro (1).
Quindi, se si lasciano tutti gli elementi tranne uno sul valore zero e si dà all’oggetto selezionato il valore 1, questo verrà visualizzato solo dopo gli altri elementi. Questo procedimento può essere proseguito assegnando anche altri valori (più alti o più bassi). Si tratta di una rappresentazione puramente visiva: la sequenza logica secondo il documento HTML non viene modificata.

flex-grow (https://developer.mozilla.org/en-US/docs/Web/CSS/flex-grow)
Questa proprietà definisce la capacità di un item di espandersi se necessario. Se tutti gli elementi sono posti a 1 lo spazio libero verrà distribuito in modo uguale tra tutti gli item che si espanderanno di conseguenza lungo l'asse indicato da flex-direction. Se un item ha la proprietà flex-grow pari a 2 mentre tutti i restanti hanno il valore 1 allora la sua espansione sarà doppia rispetto agli altri (purchè questo sia possibile!). Il valore 0 lascia inalterata la dimensione dell'item lungo l'asse fissato da flex-direction. Non sono ammessi valori negativi.

flex-shrink (https://developer.mozilla.org/en-US/docs/Web/CSS/flex-shrink)
Questa proprietà definisce se l'item può essere ristretto quando necessario. Se il valore è posto a 0 la dimensione del box lungo l'asse indicato da flex-direction non potrà essere ridotta e si manterrà ampia come definito nella proprietà flex-basis. Gli item che presentano un valore in flex-shrink maggiore rispetto agli altri verranno ridotti maggiormente rispetto a quegli elementi che presentano un valore inferiore.

flex-basis (https://developer.mozilla.org/en-US/docs/Web/CSS/flex-basis)
Questa  proprietà definisce la dimensione predefinita dell'elemento quando esiste ancora spazio libero nel contenitore lungo l'asse definito con flex-direction. Può essere una lunghezza (20%, 120px, etc.) o una parla chiave. Se impostato al valore auto verrà utilizata la proprietà height (o width a seconda dell'asse utilizzato). Se invece viene impostata a content l'item verrà ridimensionato in base al suo contenuto. Questa parola chiave non è ancora ben supportata.

flex (https://developer.mozilla.org/en-US/docs/Web/CSS/flex)
La proprietà flex è un'abbreviazione della combinazione flex-growflex-shrink. e flex-basis. E' preferibile utilizzare questa scorciatoia piuttosto che settare le singole proprietà. La proprietà flow imposta le singole proprietà in modo più intelligente. Il suo default è 1 0 auto ma è possibile settarlo solo con un singolo valore (esempio 1, 0, etc.)

align-self (https://developer.mozilla.org/en-US/docs/Web/CSS/align-self)
La proprietà align-self èpermette di posizionare il singolo item indipendentemente dalle impostazioni definite nel container. I valori ammessi per la seguente proprietà sono:

Esempio dinamico sui FlexBox

Properties for flex container






Properties for flex items

#flex-growflex-shrinkflex-basis min-width min-height Orderalign-self
Box 1
Box 2
Box 3