"Sono stato bocciato a parecchi esami. Un mio amico invece, li ha passati tutti a pieni voti. Ora è ingegnere e lavora in Microsoft. Io sono il proprietario."  - Bill Gates  •  "Se riesco a fare qualcosa in 10 minuti, è perché ho passato anni a studiarlo."  - Bill Gates  •  "Il vostro lavoro riempirà gran parte della vostra vita, e l'unico modo per essere veramente soddisfatti è fare ciò che ritenete sia un grande lavoro."  - Steve Jobs  •  "Siate affamati. Siate folli."  - Steve Jobs  •  

cinque 

ZERO

{CSS} CSS Grid Layout

home / css /

Lucio Asciolla

Full Stack Developer

Indice

Risorse sul web
https://www.w3schools.com/css/css_grid.asp
https://www.ionos.it/digitalguide/siti-web/creare-siti/css-grid/

Cos'è CSS Grid Layout

Il modulo CSS Grid Layout, indubbiamente il più utilizzato, offre un sistema di layout basato su griglia, con righe e colonne, che semplifica la progettazione di pagine Web.
Doversamente dal Felxbox layout, siamo di fronte ad un layout bidimensionale, ovvero, che gestisce due dimensioni contemporaneamente (colonne e righe).

Il funzionamento è sempre lo stesso; avremo proprietà da applicare al container (box contenitore) e proprietà da applicare ai singoli elementi (elementi contenuti).

Elementi di una griglia

  • Colonne (column)
    Le righe verticali degli elementi della griglia sono chiamate colonne.
  • Righe (row)
    Le righe orizzontali degli elementi della griglia sono chiamate righe.
  • Spazi (gap)
    Gli spazi tra ogni colonna/riga sono chiamati spazi vuoti .
  • Linee (line)
    Le righe tra le colonne sono chiamate righe di colonna, mentre, le righe tra le righe sono chiamate righe di riga .
CODICE HTML
<div class="grid-container">
  <div class="grid-item1">1</div>
  <div class="grid-item2">2</div>
  <div class="grid-item3">3</div>
  <div class="grid-item4">4</div>
  <div class="grid-item5">5</div>
  <div class="grid-item6">6</div>
  <div class="grid-item7">7</div>
  <div class="grid-item8">8</div>
  <div class="grid-item9">9</div>
</div>

Proprietà per il box contenitore

Di seguito raggruppiamo tutte le proprietà per il conteiner:

displaycon valore "grid" attiva il Grid layout
grid-template-rowscon valori multipli imposta dimensioni e numero di righe da visualizzare
grid-template-columnscon valori multipli imposta dimensioni e numero di colonne da visualizzare
grid-gapimposta una spaziatura uniforme tra righe e colonne
grid-column-gapimposta spaziatura unicamente tra le colonne
grid-row-gapimposta spaziatura unicamente tra le righe
grid-template-rowssuddivide e raggruppa le celle di una griglia in aree
justify-itemsregola globalmente l’allineamento orizzontale per tutti gli elementi
align-itemsregola globalmente l’allineamento verticale per tutti gli elementi
palce-itemsshorthano per indicare i valori di justify-items e align-items

display

Con la proprietà display attribuendole il valore "grid" attiviamo il CSS Grid Layout. Anche in questo caso i valori possibili sono due: grid e inline-grid.

.grid-container{
display: grid;
}

grid-template-columns

Con la proprietà grid-template-columns definiamo contemporaneamente il numero e le dimensioni delle dimensioni da visualizzare nella griglia.

.grid-container{
display: grid;
grid-template-columns: 150px 100px 100px 150px;
}

Abbiamo definito 4 colonne, indicando 4 valori, la prima e l'ultima larghe 150px mentre le due in mezzo larghe 100px.
Oltre alle specifiche esatte dei pixel, è possibile utilizzare anche una percentuale o altre dimensioni comuni nei CSS. Con le specifiche "max-content" e "min-content" la griglia può essere creata anche in relazione al contenuto.

grid-template-rows

Questa proprietà è identica alla precedente con l'unica differenza che anziché definire colonne, con questa proprietà definiamo numero e dimensioni delle righe.

.grid-container{
display: grid;
grid-template-columns: 150px 100px 100px 150px;
grid-template-rows: 100px 100px;
}

Le fraction

Le fraction sono un'unità di misura con una caratteristica speciale.

.grid-container {
  display: grid;
  grid-template-columns: 1fr 2fr 1fr 1fr 1fr;
  grid-template-rows: 100px 100px;
}

Con questa unità di misura divisiamo lo schermo in modo simile alle percentuali.
Stiamo dicendo di dividere l'area in 5 unità orizzontali (colonne) con una colonna (la seconda) che sarà il doppio delle altre.
Il vantaggio di lavorare con dimensioni relative è che la griglia può adattarsi automaticamente alle dimensioni dello schermo

grid-gap

Con la proprietà grid-gap indichiamo una spaziatura generale attorno a righe e colonne.

.grid-container{
display: grid;
grid-template-columns: 150px 100px 100px 150px;
grid-template-rows: 100px 100px;
grid-gap: 5px;
}

grid-column-gap

grid-row-gap

In altermativa con queste due proprietà possiamo specificare distintamente le spaziature per righe e colonne.

.grid-container{
display: grid;
grid-template-columns: 150px 100px 100px 150px;
grid-template-rows: 100px 100px;
grid-column-gap: 10px;
grid-row-gap: 5px;
}

grid-templete-areas

Con CSS Grid Layout è possibile riunire celle in aree e denominarle.
E' utile per delimitare delle aree all'interno della nostra templete-grid per poterla associare ad un elemento specifico.
Per prima cosa dovremo comunque procederre con la costruzione della griglia con le proprietà grid-templete-column e grid-templete-row:

.grid-container{
grid-templete-column: 100px 100px 100px 100px 100px;
grid-templete-row: 50px 50px 50px;
grid-gap: 10px;
}

Abbiamo creato un templete di 5 colonne e 3 righe per un totale di 15 celle;
Possiamo ora procedere con la suddivisione in aree:

.grid-container{
grid-templete-column: 100px 100px 100px 100px 100px;
grid-templete-row: 50px 50px 50px;
grid-gap: 10px;
grid-template-areas:
  "area1 area1 area1 area1 area1"
  "area2 area2 . area3 area3"
  "area2 area2 area4 area4 area4";
}

Si scrivono cella per cella i nomi delle aree desiderate. Se non si desidera assegnare una cella ma lasciarla vuota, basta inserire un punto.
Ogni riga va aperta e chiusa con le virgolette.

Possiamo ora procedere con l'assegnazione delle aree:

Note: per comprendere questo punto è opportuno conoscere già le proprietà da associale ai singoli elementi.
.grid-item1 {
  grid-area: area1;
}
.grid-item2 {
  grid-area: area2;
}
.grid-item3 {
  grid-area: area3;
}
.grid-item4 {
  grid-area: area4;
}

justify-items

La proprietà justfy-items, proprietà per il container, regola globalmente l'allineamento in senso orizzontale di tutti gli elementi della griglia.

Note: più avanti vedremo proprietà per i singoli elementi in grado di regolare singolarmente le visualizzazioni.
.grid-container {
justify-items: center;
}

align-items

La proprietà align-items, anch'essa proprietà per il container, regola globalmente l'allineamento in senso verticale di tutti gli elementi della griglia.

.grid-container {
justify-items: start;
}

Tutti i valori possibili:

startin senso orizzontale: da sinistra; in senso veriticale: dall'alto;
endin senso orizzontale: da destra; in senso veriticale: dal basso;
centeral centro
stretchdistendi/espandi

palce-items

La proprietà place-items è una shorthand per la sintassi abbreviate; ci consente di indicare contemporaneamente, in ordine, i valori di justify-items e align-items.

.grid-container{
place-items: start / center;
}

Proprietà per elementi contenuti

CODICE HTML
    <div class="grid-container">
        <p class="grid-item1">1</p>
        <p class="grid-item2">2</p>
        <p class="grid-item3">3</p>
        <p class="grid-item4">4</p>
        <p class="grid-item5">5</p>
        <p class="grid-item6">6</p>
        <p class="grid-item7">7</p>
        <p class="grid-item8">8</p>
        <p class="grid-item9">9</p>
        <p class="grid-item10">10</p>
      </div>
CODICE CSS
.grid-container{
display: grid;
grid-template-columns: 100px 100px 100px 100px 100px;
grid-template-rows: 100px 100px 100px 100px 100px;
grid-gap: 5px;
}

Griglia formata da 5 colonne e 5 righe con una spaziatura uniforme di 5px. Layout totale di 25 celle.
Totale di 10 elementi <p> da distribuire sulla griglia.

Con le seguenti proprietà è possibile posizionare i diversi oggetti all'interno della griglia. Le proprietà vanno attribuite singolaremente ad ogni elemento contenuto.

grid-column-startvalore numerico che indica da quale posizione/colonna inizia un elemento
grid-column-endvalore numerico che indica fino a quale posizione/colonna si estende un elemento
grid-row-startvalore numerico che indica da quale posizione/riga inizia un elemento
grid-row-endvalore numerico che indica fino a quale posizione/riga si estende un elemento
grid-columnshorthand per indicare le colonne da occupare
grid-rowshorthand per indicare le righe da occupare
grid-areaassocia e posiziona gli elementi nelle aree create nel templete container
justify-selfimposta allineamento orizzontale per il singolo elemento
align-selfimposta allineamento verticale per il singolo elemento
place-selfshorthand per justify-self align-self

grid-column-start & grid-column-end

grid-row-start & grid-row-end

.grid-item1 {
  grid-column-start: 1;
  grid-column-end: 6;
  grid-row-start: 1;
  grid-row-end: 3;
}

Le seguenti proprietà faranno in modo che l'elemento con classe .grid-item1 occuperà uno spazio nella griglia di 5 colonne per 2 righe.
I numeri indicanti non fanno riferimento alle celle bensi alle linee.

Tutti i modi per indicare lo spazio da occupare all'interno delle proprietà

valori numericiindicano le linee per le colonne da sinistra a destra e dall'alto verso il basso per le righe
spancon "span" si specifica quante celle bisogna includere nella direzione indicata (column o row)
nomi delle righeall'interno di "grid-template-rows" e "grid-template-columns" è possibile dare un nome alle righe (tra parentesi quadre) e poi fare riferimento a questi nomi
Valori numerici

Come visto nell'esempio qui sopra possiamo indicano le linee numericamente; per le colonne i numeri faranno riferimento alle linee da sinistra a destra e per le righe, i numeri faranno riferimento alle linee dall'alto verso il basso.

grid-column & grid-row

Le proprietà grid-column e grid-row sono delle shorthand; ci permettono di scrivere i valori start ed end di column e row in un'unica proprietà.
E' possibile utilizzarle valorizzandole mediante le paroli chiave span e i line-name.

Span

Con la parola chiave "span" si specifica quante celle bisogna includere nella direzione indicata.

.grid-item1 {
  grid-column: 1 / span 6;
  grid-row: 1 / span 3;
}

Le proprietà grid-column e grid-row sono delle shorthand

Nomi delle righe

All'interno delle proprietà grid-template-rows e grid-template-columns per il container, che utilizziamo per definire il template della griglia, è possibile includere tra i valori, i nomi delle linee; tali nomi sono da indicare tra parentesi quadre; successivamente sarà possibile utilizzarli come riferimento all'interno delle shorthand grid-column e grid-row.

.grid-container{
grid-template-column: 100px [col-linea1] 100px [col-linea2] 100px [col-linea3];
grid-template-column: 100px [row-linea1] 100px [row-linea2] 100px [row-linea3];
}
.grid-item1{
grid-column: col-linea1  col-linea2;
grid-row: row-linea1 row-linea3;
}

grid-area

La proprietà è utilizzate negli elementi contenuti per associare le aree create con la proprietà per il container container grid-templete-areas trattata più sopra.

.grid-item1{
grid-area: area1;
}

justify-self

La proprietà justify-selft, simile a justify-items per il container, è utile per indicare l'allineamento orizzontale del singolo elemento.

.grid-item1{
justify-self: start;
}

align-self

La proprietà align-selft, simile a align-items per il container, è utile per indicare l'allineamento verticale del singolo elemento.

.grid-item1{
align-self: center;
}

place-seft

La proprietà place-seft, simile a place-items per il container, è una shorthand di sintassi abbreviata che ci permette di indicare contemporaneamente i valori, in ordine, di justify-self e align-self.

.grid-item1{
place-self: start / center;
}

Valori possibili

I valori possibili sono i medesimi delle proprietà similari dedicate al container.

Funzioni e proprietà per template auto-responsive

Funzioni

Con le seguenti proprietà e funzioni, che ci consentono di creare degli automatismi, è possibile impostare un template per una griglia che si adatti automaticamente ai diversi dispositivi.
Le seguenti istruzioni si applicano sempre al box-container.

repeat()imposta specifica dimensione e frequenza di ripetizione
minmax()imposta specifiche dimensioni minime e massime

repeat()

Con funzione repeat() si può impostare una specifica di dimensione e stabilire la frequenza di ripetizione dello schema.
La funzione va applicata all'interno delle proprietà grid-template-column e grid-template-rows e prevede due paramenti: il primo è il comportamento il secondo è la dimensione specifica.

.grid-container{
grid-template-columns: repeat(auto-fit, 100px);
grid-template-rows: repeat(auto-fit, 100px);
}

Valori possibili di comportamento

auto-fitregola le singole celle in modo tale che lo spazio venga utilizzato fino al bordo
auto-fillaggiunge il maggior numero possibile di celle senza rompere il confine del container può lasciare spazio inutilizzato
minmax()

Con la funzione minmax() è possibile impostare valori minimi e massimi e fare in modo che un item non diventi troppo piccolo o troppo grande.
Anche in questo caso sono previsti due paramentri; in ordine, la misura minima e la misura massima.
All'interno delle proprietà grid-template-columns e grid-template-rows vanno utilizzate in combinata con la funzione repeat() ed al posto del campo desinato alla misura specifica.

.grid-container{
grid-template-columns: repeat(auto-fit, minmax(50px, 150px));
grid-template-rows: repeat(auto-fit, minmax(50px, 150px));
}

Proprietà

Le proprietà grid-auto-columns e grid-auto-rows sono proprietà che incorporano già la funzione repeat().
Possono essere utilizzate con o senza la funzione minmax().

grid-auto-columnsindicando la dimensione della colonna, suddivide la griglia in tante colonne quante quelle possibili
grid-auto-rowsindicando la dimensione della riga, suddivide la griglia in tante colonne quante quelle possibili
.grid-container{
grid-auto-columns: 100px;
grid-auto-rows: 100px;
}
.grid-container{
grid-auto-columns: minmax(50px, 150px);
grid-auto-rows: minmax(50px, 150px);
}
Argomenti collegati