Quando si crea un sito web gran parte del lavoro va nella col­lo­ca­zio­ne dei singoli elementi. Il layout dovrebbe avere un aspetto in­te­res­san­te, ma allo stesso tempo essere in­tui­ti­va­men­te com­pren­si­bi­le e chiaro. I co­sid­det­ti Cascading Style Sheets (CSS), fogli di stile a cascata, for­ni­sco­no lo strumento per rendere i siti web ac­cat­ti­van­ti. Mentre l’HTML è impiegato per strut­tu­ra­re contenuti in maniera ru­di­men­ta­le, i web designer usano il CSS per i progetti più complessi. La tec­no­lo­gia web è in continuo sviluppo. Con il CSS3, sono state aggiunte nuove tec­no­lo­gie che rendono il lin­guag­gio di markup uti­liz­za­bi­le anche per l'In­ter­net mobile e il design re­spon­si­ve.

A cosa serve il layout CSS Grid?

L'In­ter­net mobile rap­pre­sen­ta una grande sfida per i web designer: a causa della mol­ti­tu­di­ne di di­spo­si­ti­vi mobili, non è possibile sapere quale sia il formato del display su cui il sito web deve essere mostrato. Per questo motivo è im­por­tan­te che i singoli oggetti (caselle di testo, grafici, elementi in­te­rat­ti­vi) siano disposti in modo in­di­pen­den­te e allo stesso tempo chiaro, con par­ti­co­la­re at­ten­zio­ne alle ri­spet­ti­ve con­di­zio­ni di spazio date dal display.

In passato ci si doveva ac­con­ten­ta­re dei co­sid­det­ti float. Ma lavorare con questa tecnica era complesso e soggetto a errori. Nel frattempo, ci sono due metodi per rea­liz­za­re un layout dinamico: oltre a CSS Grid, per esempio, si può anche usare molto bene flexbox per im­ple­men­ta­re un design in­tel­li­gen­te. Ma le due tecniche dif­fe­ri­sco­no per alcuni aspetti. Flexbox è uni­di­men­sio­na­le. In linea di principio, gli elementi vengono spostati su un solo asse. Un layout CSS Grid offre al web designer due di­men­sio­ni per il po­si­zio­na­men­to degli oggetti. Invece che su un solo asse, CSS Grid consente di uti­liz­za­re una griglia con righe e colonne.

CSS Grid: tutorial con esempi

Chi conosce i CSS non avrà problemi con Grid. Il seguente tutorial ne descrive le funzioni più im­por­tan­ti per iniziare.

N.B.

Il tutorial funziona con un unico file: il codice CSS è scritto di­ret­ta­men­te nel­l'in­te­sta­zio­ne del file HTML. È però anche possibile creare un foglio di stile separato e aprirlo solo nel file HTML.

Creare container e item

CSS Grid conosce due dif­fe­ren­ti unità: container e item. Il container è il livello più elevato in cui sono stabilite le ca­rat­te­ri­sti­che che saranno poi trasmesse agli item. Un item è quindi po­si­zio­na­to (dal punto di vista ge­rar­chi­co) all’interno di un container. Pa­ral­le­la­men­te è comunque in­di­spen­sa­bi­le usare l'HTML per il layout Grid. Nella parte HTML del codice sorgente sono creati i singoli oggetti (testo, grafica e così via), i quali sono poi prelevati all’interno del CSS Grid e portati nel giusto posto.

<!DOCTYPE html>
<html>
<head>
<style>
.grid-container {
    display: grid;
}
</style>
</head>
<body>
<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>
</body>
</html>

Ora abbiamo creato sei elementi, definito ognuno di essi come "grid-item" e li abbiamo spostati tutti nel "grid-container". Per attivare il CSS Grid, prima di tutto è ne­ces­sa­rio avviare la funzione nel con­te­ni­to­re con "display: grid". Finora, però, il codice genera solo 6 numeri che appaiono uno sotto l'altro. Una volta creati, questi elementi possono essere po­si­zio­na­ti in modo re­la­ti­va­men­te libero sullo schermo.

Grid, column e row

Con CSS Grid si lavora con righe e colonne e si crea quindi una griglia. I singoli oggetti possono essere disposti al­l'in­ter­no della griglia. Questo grid può o deve essere se­le­zio­na­to li­be­ra­men­te: sarà l'utente stesso a decidere le di­men­sio­ni delle righe e delle colonne. Per fare questo, vanno aggiunte due di­chia­ra­zio­ni al con­te­ni­to­re.

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

Con questi due comandi abbiamo creato una griglia 2 per 3. Come potete vedere, la di­men­sio­ne di ogni riga e colonna può essere regolata in­di­vi­dual­men­te. Le voci vengono sem­pli­ce­men­te inserite una dopo l'altra (separate da uno spazio). Oltre alle spe­ci­fi­che esatte dei pixel, è possibile uti­liz­za­re anche una per­cen­tua­le o altre di­men­sio­ni comuni nei CSS. Con le spe­ci­fi­che "max-content" e "min-content" la griglia può essere creata anche in relazione al contenuto.

Inoltre con il comando "grid-gap" create uno spazio in­ter­me­dio.

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

In questo modo le celle sono equamente separate l'una dal­l'al­tra. Se non si desidera una spa­zia­tu­ra uniforme, è possibile uti­liz­za­re anche "grid-column-gap" e "grid-row-gap" per pro­get­ta­re gli spazi intermedi in modo più in­di­vi­dua­le.

Le fraction sono una ca­rat­te­ri­sti­ca speciale. Con questa unità di misura lo schermo può essere diviso in­di­vi­dual­men­te in modo simile alle per­cen­tua­li. Diciamo che vogliamo dividere l'area in 7 unità oriz­zon­ta­li. Ma una singola colonna dovrebbe essere il doppio delle altre. Ciò può essere im­ple­men­ta­to uti­liz­zan­do il seguente codice:

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

Il vantaggio di lavorare con di­men­sio­ni relative anziché con spe­ci­fi­che statiche è il seguente: la griglia può adattarsi au­to­ma­ti­ca­men­te alle di­men­sio­ni dello schermo. Anche se le singole colonne devono diventare più piccole, la seconda colonna (nel nostro esempio) rimane sempre due volte più grande delle altre. Se si vuole fissare una linea, cioè non adattarla alla di­men­sio­ne dello schermo, sem­pli­ce­men­te le si assegnerà un valore statico.

Po­si­zio­na­re elementi

Dopo aver definito la griglia, è possibile po­si­zio­na­re i diversi oggetti. Per fare questo, è ne­ces­sa­rio creare gli items e spe­ci­fi­car­ne i valori iniziali e finali. Ma non tutti gli elementi devono ne­ces­sa­ria­men­te occupare una sola cella al­l'in­ter­no della griglia.

<!DOCTYPE html>
<html>
<head>
<style>
.grid-container {
    display: grid;
    grid-template-rows: 100px 100px 100px 100px;
    grid-template-columns: 100px 100px 100px 100px;
    grid-gap: 5px;
}
.grid-item1 {
    background: blue;
    text-align: center;
    border: black 5px solid;
    grid-column-start: 1;
    grid-column-end: 5;
    grid-row-start: 1;
    grid-row-end: 3;
}
.grid-item2 {
    background: grey;
    text-align: center;
    border: black 5px solid;
}
</style>
</head>
<body>
<div class="grid-container">
    <div class="grid-item1">1</div>
    <div class="grid-item2">2</div>
    <div class="grid-item2">3</div>
    <div class="grid-item2">4</div>
    <div class="grid-item2">5</div>
    <div class="grid-item2">6</div>
</div>
</body>
</html>

Abbiamo ora in­tro­dot­to due tipi di item. Mentre gli ultimi sei elementi hanno au­to­ma­ti­ca­men­te solo la larghezza di una cella, il primo oggetto si estende su quattro colonne e due righe. (Per una maggiore chiarezza, i nostri esempi includono anche un'ul­te­rio­re pro­get­ta­zio­ne visiva. Tuttavia, la co­lo­ra­zio­ne, i frame e la cen­tra­tu­ra del testo non sono in realtà de­ter­mi­na­ti dal CSS Grid.)

I valori per l'inizio e la fine degli oggetti si ri­fe­ri­sco­no solo in­di­ret­ta­men­te a righe e colonne. In realtà, si fa ri­fe­ri­men­to alla ri­spet­ti­va linea della griglia. Nel­l'e­sem­pio la quarta colonna termina con la quinta riga. Tuttavia, ci sono diversi modi per spe­ci­fi­ca­re le larghezze.

  • Nu­me­ra­zio­ne: si contano le linee da sinistra a destra e dall'alto verso il basso.
  • Nomi: al­l'in­ter­no di "grid-template-rows" e "grid-template-columns" è possibile dare un nome alle righe (tra parentesi quadre) e poi fare ri­fe­ri­men­to a questi nomi.
  • Spanne: Con "span" si specifica quante celle deve contenere l'oggetto nella direzione cor­ri­spon­den­te.

Invece di definire i punti di inizio e fine in un'unica di­chia­ra­zio­ne, i web designer possono com­bi­nar­li entrambi sotto un unico comando. Il codice seguente porta allo stesso risultato del­l'e­sem­pio pre­ce­den­te.

<style>
.grid-container {
    display: grid;
    grid-template-rows: 100px [Line1] 100px [Line2] 100px [Line3] 100px [Line4];
    grid-template-columns: 100px 100px 100px 100px;
    grid-gap: 5px;
}
.grid-item1 {
    background: blue;
    text-align: center;
    border: black 5px solid;
    grid-column: 1 / span 4;
    grid-row: 1 / Line2;
}
.grid-item2 {
    background: grey;
    text-align: center;
    border: black 5px solid;
}
</style>

Assegnare aree

Con CSS Grid è possibile riunire celle in aree e ri­no­mi­nar­le. Ciò facilita no­te­vol­men­te la sud­di­vi­sio­ne dei singoli elementi all’interno della griglia. L’im­po­sta­zio­ne va adottata nel container. A tal fine si utilizza l’in­di­ca­zio­ne "grid-template-areas" e si scrivono cella per cella i nomi delle aree de­si­de­ra­te. Se non si desidera assegnare una cella ma lasciarla vuota, basta inserire un punto. Ogni riga va aperta e chiusa con le vir­go­let­te.

.grid-container {
    display: grid;
    grid-template-rows: 100px 100px 100px;
    grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
    grid-gap: 5px;
    grid-template-areas:
    "area1 area1 area1 area1 area1"
    "area2 area2 . area3 area3"
    "area2 area2 area4 area4 area4";
}

In questo esempio di CSS Grid abbiamo stabilito 4 dif­fe­ren­ti aree. Una cella è rimasta libera. Se si de­fi­ni­sco­no gli items non servono i valori “da-a” ma basta rimandare all’areale cor­ri­spon­den­te.

.grid-item1 {
    background: blue;
    text-align: center;
    border: black 5px solid;
    grid-area: area1;
}
.grid-item2 {
    background: red;
    text-align: center;
    border: black 5px solid;
    grid-area: area2;
}
.grid-item3 {
    background: green;
    text-align: center;
    border: black 5px solid;
    grid-area: area3;
}
.grid-item4 {
    background: yellow;
    text-align: center;
    border: black 5px solid;
    grid-area: area4;
}

Adattare l’al­li­nea­men­to

Come si allineano i singoli elementi all’interno di un CSS Grid? Lo standard è che i singoli elementi siano talmente estesi da inserirsi per­fet­ta­men­te nella griglia. La di­men­sio­ne degli item non gioca quindi alcun ruolo, perciò non è stata nemmeno indicata negli esempi finora; invece, abbiamo indicato tramite quali celle si deve di­stri­bui­re l’oggetto. Tuttavia può essere che si assegni una di­men­sio­ne fissa all’item e che lo si voglia comunque integrare nella griglia.

I web designer hanno la pos­si­bi­li­tà di stabilire l’al­li­nea­men­to di tutti gli item a livello globale tramite il container oppure di dare un al­li­nea­men­to per­so­na­liz­za­to a oggetti se­le­zio­na­ti. Per la variante globale si utilizza "justify-items" e "align-items". Il primo regola l’al­li­nea­men­to oriz­zon­ta­le, l’ultimo quello verticale. Se si desidera allineare un solo item, si uti­liz­za­no le in­di­ca­zio­ni "justify-self" e "align-self". In ogni caso tutti i comandi con­ten­go­no le stesse opzioni.

  • stretch: la di­men­sio­ne dell’oggetto si adatta alla di­men­sio­ne delle celle se­le­zio­na­te.
  • start: l’oggetto si allinea a sinistra o in alto.
  • end: l’oggetto si allinea a destra o in basso.
  • center: l’oggetto si allinea al centro.
.grid-container {
    display: grid;
    grid-template-rows: 100px 100px 100px 100px;
    grid-template-columns: 100px 100px 100px 100px;
    grid-gap: 5px;
    justify-items: center;
    align-items: center;
}
.grid-item1 {
    background: grey;
    text-align: center;
    border: black 5px solid;
    width: 50px;
    height: 50px;
}
.grid-item2 {
    background: blue;
    text-align: center;
    border: black 5px solid;
    width: 50px;
    height: 50px;
    justify-self: start;
    align-self: start;
}

Le in­di­ca­zio­ni possono anche essere ab­bre­via­te uti­liz­zan­do "place-items" o "place-self". Entrambe le in­for­ma­zio­ni (verticale e oriz­zon­ta­le) possono essere inserite in una sola cella: place-items: <align-items> / justify-items>.

place-items: center / end;

È dunque possibile allineare oggetti all’interno della griglia. Tuttavia si può anche spostare l’intera griglia all’interno del container. Se lavorate con spe­ci­fi­che di di­men­sio­ni statiche per il CSS Grid, la griglia potrebbe non avere le stesse di­men­sio­ni del container completo. Allora è possibile allineare anche la griglia all’interno del container – e quindi del display – grazie a "justify-content" e "align-content". Anche in questo caso ci sono diverse pos­si­bi­li­tà di al­li­nea­men­to:

  • start: a sinistra o in alto
  • end: a destra o in basso
  • center: al centro
  • stretch: griglia estesa
  • space-around: di­stri­bu­zio­ne omogenea dello spazio attorno alle celle
  • space-between: di­stri­bu­zio­ne omogenea dello spazio tra le celle
  • space-evenly: di­stri­bu­zio­ne omogenea dello spazio attorno alle celle incluso il contorno
.grid-container {
    display: grid;
    width: 800px;
    height: 800px;
    background: yellow;
    grid-template-rows: 100px 100px 100px 100px;
    grid-template-columns: 100px 100px 100px 100px;
    grid-gap: 5px;
    justify-content: space-evenly;
    align-content: center;
}

Anche in questo caso esiste una versione breve: place-content: <align-content> / <justify-content>.

place-content: center / space-evenly;

Adat­ta­men­ti au­to­ma­ti­ci per design re­spon­si­ve

Un notevole vantaggio del CSS Grid è la fles­si­bi­li­tà della griglia. Si può impostare il CSS Grid in modo tale che si adatti au­to­ma­ti­ca­men­te. Gli au­to­ma­ti­smi mi­glio­ra­no la tra­spo­si­zio­ne su diversi di­spo­si­ti­vi ma servono anche a fa­ci­li­ta­re il lavoro con il CSS.

Una funzione utile si chiama "repeat()". Al posto di definire ogni riga o colonna sin­go­lar­men­te, si può al­ter­na­ti­va­men­te impostare una specifica di di­men­sio­ne e stabilire la frequenza di ri­pe­ti­zio­ne dello schema. È ancora più semplice in com­bi­na­zio­ne con le opzioni "auto-fill" e "auto-fit". In questo caso si lascia che sia il CSS Grid a creare righe e colonne. Con la prima opzione il CSS Grid aggiunge il maggior numero possibile di celle senza rompere il confine del container. Tuttavia può accadere che lo spazio rimanga inu­ti­liz­za­to. L’opzione "auto-fit", invece, regola le singole celle in modo tale che lo spazio venga uti­liz­za­to fino al bordo.

.grid-container {
    display: grid;
    width: 800px;
    height: 800px;
    grid-template-rows: repeat(auto-fit, 100px);
    grid-template-columns: repeat(auto-fit, 100px);
    grid-gap: 5px;
}

Anche le due funzioni "grid-auto-columns" e "grid-auto-rows" sono molto utili. Con queste due istru­zio­ni si ha più libertà nella creazione degli item. Se, per esempio, una griglia avesse le di­men­sio­ni di 4 x 4 celle e ora si creasse un elemento che dovrebbe iniziare solo nella quinta colonna, cau­se­reb­be problemi. Tali problemi possono essere evitati creando au­to­ma­ti­ca­men­te un numero suf­fi­cien­te di righe e colonne.

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

Anche se le di­men­sio­ni di griglia e oggetti do­vreb­be­ro adattarsi alle di­men­sio­ni del display, i web designer amano inserire valori minimi e massimi. Con la dicitura "minmax()" si può fare in modo che un item non diventi troppo piccolo o troppo grande. Inserite prima il valore più piccolo tra parentesi e poi il più grande.

.grid-container {
    display: grid;
    grid-template-rows: 100px 100px 100px;
    grid-auto-columns: minmax(50px, 150px);
    grid-gap: 5px;
}

Se ora combinate tra loro diverse delle funzioni pre­sen­ta­te, potete creare con facilità un design re­spon­si­ve.

<!DOCTYPE html>
<html>
<head>
<style>
.grid-container {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
    grid-gap: 5px;
    justify-items: center;
    align-items: center;
}
.grid-item1 {
    background: grey;
    text-align: center;
    border: black 5px solid;
    width: 100px;
    height: 100px;
}
</style>
</head>
<body>
<div class="grid-container">
    <div class="grid-item1">1</div>
    <div class="grid-item1">2</div>
    <div class="grid-item1">3</div>
    <div class="grid-item1">4</div>
    <div class="grid-item1">5</div>
    <div class="grid-item1">6</div>
    <div class="grid-item1">7</div>
    <div class="grid-item1">8</div>
    <div class="grid-item1">9</div>
    <div class="grid-item1">10</div>
</div>
</body>
</html>
In sintesi

CSS Grid dà la pos­si­bi­li­tà ai web designer di creare layout ac­cat­ti­van­ti senza troppo sforzo. Grazie alla griglia si ha sempre il controllo sul po­si­zio­na­men­to degli oggetti, anche in un design re­spon­si­ve.

Vai al menu prin­ci­pa­le