02Lezione

CSS Grid

Layout bidimensionali con grid-template, aree nominate e auto-placement. La soluzione moderna per costruire interfacce complesse.

Introduzione

CSS Grid è il sistema di layout bidimensionale di CSS. A differenza di Flexbox — che gestisce una sola direzione alla volta — Grid gestisce contemporaneamente righe e colonne, rendendolo ideale per layout di pagina completi, dashboard e gallerie.

Grid vs Flexbox

Usa Grid per strutture bidimensionali (righe + colonne insieme). Usa Flexbox per allineamenti su un asse solo — navbar, liste, bottoni. Spesso si usano insieme: Grid per il layout della pagina, Flexbox per i componenti interni.

Terminologia

Prima di scrivere codice Grid è utile conoscere il vocabolario della specifica CSS. Questi concetti torneranno in ogni proprietà che incontrerai.

Grid Container

L'elemento sul quale si applica display: grid. Diventa il contesto della griglia e rende tutti i suoi figli diretti dei grid items.

123456grid containergrid items (figli diretti)
Il grid container (bordo tratteggiato) e i suoi 6 grid items

Grid Items

I figli diretti del grid container. Gli elementi più in profondità (nipoti, ecc.) non sono grid items — a meno che non abbiano anch'essi display: grid.

html
<div class="container">    <!-- grid container -->
  <div>Item 1</div>         <!-- grid item ✓ -->
  <div>                     <!-- grid item ✓ -->
    <p>Testo annidato</p>   <!-- NON è un grid item ✗ -->
  </div>
  <div>Item 3</div>         <!-- grid item ✓ -->
</div>

Grid Lines

Le linee verticali e orizzontali che formano la struttura della griglia. Sono numerate a partire da 1. Le column lines (blu) scorrono verticalmente; le row lines (verde) orizzontalmente.

column lines1234row lines123
Column lines (blu, 1–4) e row lines (verde, 1–3) — numerate da sinistra e dall'alto

Grid Tracks

Lo spazio tra due linee di griglia adiacenti. Una track corrisponde a una colonna o a una riga della griglia.

grid track
La column track tra col line 2 e col line 3 (in giallo)

Grid Cell

La più piccola unità della griglia: lo spazio racchiuso tra 4 linee adiacenti (due di colonna e due di riga).

grid cell
La grid cell tra col lines 2–3 e row lines 1–2 (in giallo)

Grid Area

Uno spazio rettangolare delimitato da 4 linee di griglia. Può occupare una o più celle ed è il target della proprietà grid-area.

grid area (2×2)
Una grid area che copre 4 celle (col lines 1–3, row lines 1–3)

Il Contenitore Grid

Si applica display: grid all'elemento padre. Tutti i figli diretti diventano automaticamente grid items senza classi aggiuntive.

css
/* Crea il contesto grid */
.container {
  display: grid;
}

Il primo gruppo non ha display: grid — gli elementi si impilano in verticale. Prova ad aggiungerlo nel CSS e osserva la differenza immediata.

Colonne e Righe

grid-template-columns definisce quante colonne ci sono e quanto sono larghe. grid-template-rows fa lo stesso per le righe.repeat(N, value) evita di ripetere lo stesso valore N volte.

css
/* 3 colonne uguali */
grid-template-columns: repeat(3, 1fr);

/* 3 colonne con misure diverse */
grid-template-columns: 100px 1fr 2fr;

/* Altezze delle righe fisse */
grid-template-rows: 80px 60px;

Prova a modificare grid-template-columns e grid-template-rowse osserva come cambiano le celle.

Il Gap

gap aggiunge spazio tra le celle — mai attorno all'intera griglia. È la scorciatoia per row-gap e column-gap.

css
gap: 16px;        /* uguale in tutte le direzioni */
gap: 8px 24px;    /* righe | colonne */
row-gap: 8px;
column-gap: 24px;

Prova i valori suggeriti nel commento: gap: 4px, gap: 40px, oppure gap: 8px 32px per spaziatura asimmetrica.

L'Unità fr

fr (fraction) rappresenta una frazione dello spazio disponibiledopo aver assegnato le misure fisse. 1fr 1fr crea due colonne uguali.1fr 3fr crea una sidebar piccola e un contenuto tre volte più largo.

css
grid-template-columns: 1fr 1fr 1fr; /* colonne uguali */
grid-template-columns: 1fr 3fr;     /* sidebar + main */
grid-template-columns: 200px 1fr;   /* fisso + flessibile */

fr viene calcolato dopo lo spazio fisso e il gap. In 200px 1fr 1fr le due colonne fr si dividono solo lo spazio rimanente.

Modifica i valori nelle tre griglie e osserva come si ridistribuisce lo spazio.

Grid Areas

grid-template-areas permette di disegnare il layout con del testo: ogni stringa è una riga, ogni parola è una cella. Poi ogni elemento dichiara la propria area con grid-area.

css
.page {
  grid-template-areas:
    "header  header"
    "sidebar main"
    "footer  footer";
}

.page-header  { grid-area: header; }
.page-sidebar { grid-area: sidebar; }
.page-main    { grid-area: main; }
.page-footer  { grid-area: footer; }

Prova a spostare la sidebar a destra cambiando le aree in "header header" "main sidebar" "footer footer".

Posizionare gli Elementi

Ogni item può occupare più celle con grid-column e grid-row. Si indica la linea di partenza e quella di arrivo, oppure si usa span Nper occupare N celle.

css
grid-column: 1 / 3;    /* dalla linea 1 alla linea 3 */
grid-column: span 2;   /* occupa 2 colonne */
grid-column: 1 / -1;   /* dall'inizio alla fine della griglia */
grid-row: span 2;      /* occupa 2 righe */

Sperimenta modificando i valori di span e grid-columndegli elementi colorati.

auto-fill e auto-fit

Con repeat(auto-fit, minmax(...)) il browser calcola automaticamente quante colonne ci stanno — senza media query. È il pattern più usato per griglie responsive.

css
/* le colonne esistenti crescono per riempire lo spazio */
grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));

/* mantiene lo spazio riservato per colonne vuote */
grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
La differenza in pratica

Con pochi elementi, auto-fit espande le card per occupare tutto lo spazio.auto-fill mantiene le colonne alla dimensione minima e lascia spazio vuoto. Per la maggior parte dei casi, auto-fit dà il risultato più naturale.

Prova a cambiare il valore di minmax — più è grande, meno colonne entrano.

Esercizi

✏️Metti in pratica

Esercizio A — Base

Layout a 3 Colonne

Crea un container con 3 colonne di larghezza uguale (suggerimento: usa repeat()) e un po' di spazio tra i box. Aggiungi 6 elementi e osserva come vengono distribuiti automaticamente sulle righe.

Risultato atteso

Esercizio B — Intermedio

Layout di Pagina con Areas

Implementa un layout completo: header (full-width), sidebar (240px), contenuto principale (1fr) e footer (full-width) usandogrid-template-areas. La sidebar deve essere a destra.

Risultato atteso

Esercizio C — Avanzato

Griglia Responsive Senza Media Query

Crea una galleria di card che si adatta automaticamente alla larghezza disponibile: le card devono avere una larghezza minima di 250px e crescere per riempire lo spazio (suggerimento: auto-fit e minmax()). Ogni card ha un'immagine placeholder, un titolo e una descrizione.

Risultato atteso