# CSS Grid: il layout con funzioni intelligenti

Quando si crea un sito web gran parte del lavoro va nella collocazione dei singoli elementi. Il layout dovrebbe avere un aspetto interessante, ma allo stesso tempo essere intuitivamente comprensibile e chiaro. I cosiddetti [Cascading Style Sheets](https://www.ionos.it/digitalguide/siti-web/web-design/come-imparare-il-css-una-guida-semplice/ "Come imparare il CSS: una guida semplice") (CSS), fogli di stile a cascata, forniscono lo strumento per rendere i siti web accattivanti. Mentre l’[HTML](https://www.ionos.it/digitalguide/siti-web/programmazione-del-sito-web/imparare-lhtml-lampio-tutorial-per-principianti/ "Imparare l’HTML: l’ampio tutorial per principianti") è impiegato per strutturare contenuti in maniera rudimentale, i web designer usano il CSS per i progetti più complessi. La tecnologia web è in continuo sviluppo. Con il CSS3, sono state aggiunte nuove tecnologie che rendono il linguaggio di markup utilizzabile anche per l'Internet mobile e il design responsive.

## A cosa serve il layout CSS Grid?

L'Internet mobile rappresenta una grande sfida per i web designer: a causa della moltitudine di dispositivi mobili, non è possibile sapere **quale sia il formato del display** su cui il sito web deve essere mostrato. Per questo motivo è importante che i singoli oggetti (caselle di testo, grafici, elementi interattivi) siano disposti in modo indipendente e allo stesso tempo chiaro, con particolare attenzione alle rispettive condizioni di spazio date dal display.

In passato ci si doveva accontentare dei cosiddetti float. Ma lavorare con questa tecnica era complesso e soggetto a errori. Nel frattempo, ci sono due metodi per realizzare un **layout dinamico**: oltre a CSS Grid, per esempio, si può anche usare molto bene [flexbox](https://www.ionos.it/digitalguide/siti-web/creare-siti/css-flexbox/ "CSS Flexbox") per implementare un design intelligente. Ma le due tecniche differiscono per alcuni aspetti. Flexbox è unidimensionale. In linea di principio, gli elementi vengono spostati su un solo asse. Un layout CSS Grid offre al web designer due dimensioni per il posizionamento degli oggetti. Invece che su un solo asse, CSS Grid consente di utilizzare 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ù importanti per iniziare.

---

### N.B.

Il tutorial funziona con un unico file: il codice CSS è scritto direttamente nell'intestazione 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 differenti unità: **container e item**. Il container è il livello più elevato in cui sono stabilite le caratteristiche che saranno poi trasmesse agli item. Un item è quindi posizionato (dal punto di vista gerarchico) all’interno di un container. Parallelamente è comunque indispensabile 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.

```none

<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>
<div class="hash d-none" hidden>hash_b4f2ee4bee375468b1e68bf9926098b058720976</div><script data-shy-copy-guard>(function(){var C=[0x00AD,0x200B,0x200C,0x200D,0x2060,0xFEFF];var s=function(t){for(var i=0;i<C.length;i++){t=t.split(String.fromCharCode(C[i])).join("");}return t;};document.addEventListener("copy",function(e){var sel=document.getSelection();if(!sel||sel.isCollapsed||!e.clipboardData){return;}e.clipboardData.setData("text/plain",s(sel.toString()));try{var d=document.createElement("div");d.appendChild(sel.getRangeAt(0).cloneContents());e.clipboardData.setData("text/html",s(d.innerHTML));}catch(x){}e.preventDefault();});})();</script></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 è necessario avviare la funzione nel contenitore con "display: grid". Finora, però, il codice genera solo 6 numeri che appaiono uno sotto l'altro. Una volta creati, questi elementi possono essere posizionati in modo relativamente 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 all'interno della griglia. Questo grid può o deve essere selezionato liberamente: sarà l'utente stesso a decidere le dimensioni delle righe e delle colonne. Per fare questo, vanno aggiunte due dichiarazioni al contenitore.

```none
.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 dimensione di **ogni riga e colonna può essere regolata individualmente**. Le voci vengono semplicemente inserite una dopo l'altra (separate da uno spazio). 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.

Inoltre con il comando "grid-gap" create uno **spazio intermedio**.

```none
.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 dall'altra. Se non si desidera una spaziatura uniforme, è possibile utilizzare anche "grid-column-gap" e "grid-row-gap" per progettare gli spazi intermedi in modo più individuale.

Le **fraction** sono una caratteristica speciale. Con questa unità di misura lo schermo può essere diviso individualmente in modo simile alle percentuali. Diciamo che vogliamo dividere l'area in 7 unità orizzontali. Ma una singola colonna dovrebbe essere il doppio delle altre. Ciò può essere implementato utilizzando il seguente codice:

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

[![Immagine: Utilizzo di fraction in un CSS Grid](https://www.ionos.it/digitalguide/fileadmin/_processed_/e/7/csm_css-grid-1_961d5f6512.webp "Utilizzo di fraction in un CSS Grid")](https://www.ionos.it/digitalguide/fileadmin/DigitalGuide/Screenshots_2020/css-grid-1.png) Le colonne (o anche le righe) non devono essere tutte della stessa dimensione nel CSS Grid.     Il vantaggio di lavorare con dimensioni relative anziché con specifiche statiche è il seguente: la griglia può adattarsi **automaticamente alle dimensioni 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 dimensione dello schermo, semplicemente le si assegnerà un valore statico.

### Posizionare elementi

Dopo aver definito la griglia, è possibile posizionare i diversi oggetti. Per fare questo, è necessario **creare gli items** e specificarne i valori iniziali e finali. Ma non tutti gli elementi devono necessariamente occupare una sola cella all'interno della griglia.

```none

<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>
<div class="hash d-none" hidden>hash_b4f2ee4bee375468b1e68bf9926098b058720976</div><script data-shy-copy-guard>(function(){var C=[0x00AD,0x200B,0x200C,0x200D,0x2060,0xFEFF];var s=function(t){for(var i=0;i<C.length;i++){t=t.split(String.fromCharCode(C[i])).join("");}return t;};document.addEventListener("copy",function(e){var sel=document.getSelection();if(!sel||sel.isCollapsed||!e.clipboardData){return;}e.clipboardData.setData("text/plain",s(sel.toString()));try{var d=document.createElement("div");d.appendChild(sel.getRangeAt(0).cloneContents());e.clipboardData.setData("text/html",s(d.innerHTML));}catch(x){}e.preventDefault();});})();</script></body>
</html>
```

[![Immagine: CSS Grid con items di diverse dimensioni](https://www.ionos.it/digitalguide/fileadmin/_processed_/2/f/csm_css-grid-2_b93dc9c075.webp "CSS Grid con items di diverse dimensioni")](https://www.ionos.it/digitalguide/fileadmin/DigitalGuide/Screenshots_2020/css-grid-2.png) Il primo item occupa quattro righe e due colonne.     Abbiamo ora introdotto **due tipi di item**. Mentre gli ultimi sei elementi hanno automaticamente 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'ulteriore progettazione visiva. Tuttavia, la colorazione, i frame e la centratura del testo non sono in realtà determinati dal CSS Grid.)

I valori per l'inizio e la fine degli oggetti si riferiscono solo indirettamente a righe e colonne. In realtà, si fa riferimento alla rispettiva **linea della griglia**. Nell'esempio la quarta colonna termina con la quinta riga. Tuttavia, ci sono diversi modi per specificare le larghezze.

- **Numerazione**: si contano le linee da sinistra a destra e dall'alto verso il basso.
- **Nomi**: all'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.
- **Spanne**: Con "span" si specifica quante celle deve contenere l'oggetto nella direzione corrispondente.

Invece di definire i punti di inizio e fine in un'unica dichiarazione, i web designer possono combinarli entrambi sotto un unico comando. Il codice seguente porta allo stesso risultato dell'esempio precedente.

```none
<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 rinominarle. Ciò facilita notevolmente la suddivisione dei singoli elementi all’interno della griglia. L’impostazione va adottata nel container. A tal fine si utilizza l’indicazione "grid-template-areas" e 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.

```none
.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 differenti aree. Una cella è rimasta libera. Se si definiscono gli items non servono i valori “da-a” ma basta rimandare all’areale corrispondente.

```none
.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;
}
```

[![Immagine: CSS Grid con aree](https://www.ionos.it/digitalguide/fileadmin/_processed_/d/e/csm_css-grid-3_a6c4e2e46a.webp "CSS Grid con aree")](https://www.ionos.it/digitalguide/fileadmin/DigitalGuide/Screenshots_2020/css-grid-3.png) Utilizzando le aree per l’assegnazione di oggetti il lavoro si semplifica notevolmente.       ###  Adattare l’allineamento

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

I web designer hanno la possibilità di stabilire l’allineamento di tutti gli item **a livello** **globale tramite il container** oppure di dare un allineamento personalizzato a oggetti selezionati. Per la variante globale si utilizza "justify-items" e "align-items". Il primo regola l’allineamento orizzontale, l’ultimo quello verticale. Se si desidera allineare un solo item, si utilizzano le indicazioni "justify-self" e "align-self". In ogni caso tutti i comandi contengono le stesse opzioni.

- **stretch**: la dimensione dell’oggetto si adatta alla dimensione delle celle selezionate.
- **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.

```none
.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;
}
```

[![Immagine: Differenti allineamenti con CSS Grid](https://www.ionos.it/digitalguide/fileadmin/_processed_/a/b/csm_css-grid-4_48b74a6f95.webp "Differenti allineamenti con CSS Grid")](https://www.ionos.it/digitalguide/fileadmin/DigitalGuide/Screenshots_2020/css-grid-4.png) Con CSS Grid si modifica l’allineamento globale o individuale.     Le **indicazioni possono anche essere abbreviate** utilizzando "place-items" o "place-self". Entrambe le informazioni (verticale e orizzontale) possono essere inserite in una sola cella: place-items: &lt;align-items&gt; / justify-items&gt;.

```none
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 specifiche di dimensioni statiche per il CSS Grid, la griglia potrebbe non avere le stesse dimensioni 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 possibilità di allineamento:

- **start**: a sinistra o in alto
- **end**: a destra o in basso
- **center**: al centro
- **stretch**: griglia estesa
- **space-around**: distribuzione omogenea dello spazio attorno alle celle
- **space-between**: distribuzione omogenea dello spazio tra le celle
- **space-evenly**: distribuzione omogenea dello spazio attorno alle celle incluso il contorno

```none
.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;
}
```

[![Immagine: Allineamento della griglia nel container con CSS Grid](https://www.ionos.it/digitalguide/fileadmin/_processed_/8/f/csm_css-grid-5_c6669ac6ff.webp "Allineamento della griglia nel container con CSS Grid")](https://www.ionos.it/digitalguide/fileadmin/DigitalGuide/Screenshots_2020/css-grid-5.png) All’interno del container non si possono allineare solo singoli elementi, ma anche intere griglie.     Anche in questo caso esiste una versione breve: place-content: &lt;align-content&gt; / &lt;justify-content&gt;.

```none
place-content: center / space-evenly;
```

### Adattamenti automatici per design responsive

Un notevole vantaggio del CSS Grid è la flessibilità della griglia. Si può impostare il CSS Grid in modo tale che si adatti automaticamente. Gli **automatismi** migliorano la trasposizione su diversi dispositivi ma servono anche a facilitare il lavoro con il CSS.

Una funzione utile si chiama "repeat()". Al posto di definire ogni riga o colonna singolarmente, si può alternativamente impostare una specifica di dimensione e stabilire **la frequenza di ripetizione dello schema**. È ancora più semplice in combinazione 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 inutilizzato. L’opzione "auto-fit", invece, regola le singole celle in modo tale che lo spazio venga utilizzato fino al bordo.

```none
.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 istruzioni si ha **più libertà nella creazione degli item**. Se, per esempio, una griglia avesse le dimensioni di 4 x 4 celle e ora si creasse un elemento che dovrebbe iniziare solo nella quinta colonna, causerebbe problemi. Tali problemi possono essere evitati creando automaticamente un numero sufficiente di righe e colonne.

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

Anche se le dimensioni di griglia e oggetti dovrebbero adattarsi alle dimensioni 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.

```none
.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 presentate, potete **creare con facilità un design responsive**.

```none

<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>
<div class="hash d-none" hidden>hash_b4f2ee4bee375468b1e68bf9926098b058720976</div><script data-shy-copy-guard>(function(){var C=[0x00AD,0x200B,0x200C,0x200D,0x2060,0xFEFF];var s=function(t){for(var i=0;i<C.length;i++){t=t.split(String.fromCharCode(C[i])).join("");}return t;};document.addEventListener("copy",function(e){var sel=document.getSelection();if(!sel||sel.isCollapsed||!e.clipboardData){return;}e.clipboardData.setData("text/plain",s(sel.toString()));try{var d=document.createElement("div");d.appendChild(sel.getRangeAt(0).cloneContents());e.clipboardData.setData("text/html",s(d.innerHTML));}catch(x){}e.preventDefault();});})();</script></body>
</html>
```

[![Immagine: CSS Grid in uno schermo di dimensioni medie](https://www.ionos.it/digitalguide/fileadmin/_processed_/e/6/csm_css-grid-6_794786c3dd.webp "CSS Grid in uno schermo di dimensioni medie")](https://www.ionos.it/digitalguide/fileadmin/DigitalGuide/Screenshots_2020/css-grid-6.png) Se si configura CSS Grid correttamente, si può creare un design responsive con mezzi semplici.    [![Immagine: CSS Grid su uno schermo di dimensioni più ampie](https://www.ionos.it/digitalguide/fileadmin/_processed_/d/3/csm_css-grid-7_d8cd18404f.webp "CSS Grid su uno schermo di dimensioni più ampie")](https://www.ionos.it/digitalguide/fileadmin/DigitalGuide/Screenshots_2020/css-grid-7.png) Se si ingrandisce l’area di visualizzazione, si possono posizionare più items in una riga.    [![Immagine: CSS Grid in uno schermo di dimensioni più sottili](https://www.ionos.it/digitalguide/fileadmin/_processed_/d/3/csm_css-grid-8_db06168b92.webp "CSS Grid in uno schermo di dimensioni più sottili")](https://www.ionos.it/digitalguide/fileadmin/DigitalGuide/Screenshots_2020/css-grid-8.png) Anche su display piccoli si vedono bene tutti i contenuti grazie al CSS Grid.       ---

### In sintesi

CSS Grid dà la possibilità ai web designer di creare layout accattivanti senza troppo sforzo. Grazie alla griglia si ha sempre il controllo sul posizionamento degli oggetti, anche in un design responsive.

---


This is a markdown version of: [https://www.ionos.it/digitalguide/siti-web/creare-siti/css-grid/](https://www.ionos.it/digitalguide/siti-web/creare-siti/css-grid/) for AI/LLM consumption.