Sviluppo web
Container queries vs media queries: chi decide il layout
Le media query guardano lo schermo, le container query guardano lo spazio del componente. La differenza decide se una card si adatta a ogni contesto o a un breakpoint.
In sintesi
- Media query: reazione alla viewport. Container query: reazione allo spazio disponibile per il componente.
- `container-type: inline-size` aggiunge containment sull'asse orizzontale e può cambiare la larghezza intrinseca.
- Un container non può stilizzare se stesso con la propria query: serve un elemento interno.
Le media query misurano la viewport; le container query misurano lo spazio del componente che le contiene. Un componente riusabile vuole la seconda, perché la stessa card finisce in una sidebar da 280 px e in un main da 900 px.
Lo stesso componente in due contesti
.card-list {
container-type: inline-size;
container-name: cards;
}
.card {
display: grid;
grid-template-columns: 1fr;
gap: 0.75rem;
}
@container cards (min-width: 30rem) {
.card {
grid-template-columns: 8rem 1fr;
align-items: center;
}
}
La card passa a due colonne quando il suo contenitore supera 30rem, non quando lo schermo supera 768 px. Nella sidebar resta in colonna singola e nel main passa a due: stesso CSS, nessuna variante.
La stessa cosa con una media query
/* funziona finché la card vive in una sola colonna di pagina */
@media (min-width: 48rem) {
.card {
grid-template-columns: 8rem 1fr;
}
}
/* la variante che serve per la sidebar */
.sidebar .card {
grid-template-columns: 1fr;
}
La media query risponde alla larghezza dello schermo, quindi la card si allarga anche quando sta in una colonna da 300 px. La correzione è un selettore di contesto, e ogni nuovo contesto aggiunge una regola.
Chi decide cosa
| Decisione | Strumento | Perché |
|---|---|---|
| Numero di colonne della pagina | Media query | La pagina conosce la viewport |
| Card a una o due colonne interne | Container query | Dipende dallo spazio ricevuto |
| Sidebar che diventa drawer | Media query | È una scelta di navigazione globale |
| Testo che cambia misura | Container query | Dipende dalla larghezza del blocco |
Il record e il comando
Blocchi pensati per stare in contenitori di misura diversa: uploadthing-image-grid, la categoria card e le sezioni hero. Il catalogo conta 1.556 blocchi e 111.985 componenti da 1.472 librerie (1 novembre 2026).
# dove sono dichiarati i container nel progetto
grep -rn "container-type" --include="*.css" src/
# la card deve reggere anche a 320 px di viewport
npx playwright screenshot --viewport-size=320,800 http://localhost:3000 narrow.png
I tre limiti
- Un container non può stilizzare se stesso: la query vale per i discendenti, quindi serve un elemento interno.
container-type: inline-sizeaggiunge containment orizzontale: un figlio conwidth: 100%non allarga più il contenitore.container-type: sizerichiede un'altezza esplicita, altrimenti l'elemento collassa.
Limite noto: senza container-name la query colpisce il container antenato più vicino, e in un layout annidato quel container potrebbe non essere quello che immaginavi. Il nome esplicito costa una riga e toglie l'ambiguità.
Per la griglia che ospita i container vedi Flexbox o Grid, per le tracce condivise Subgrid. Le stesse query in versione utility sono in container queries con Tailwind.
Domande frequenti
Le container query sostituiscono le media query?
No. Le media query restano lo strumento per la struttura della pagina e per le scelte di navigazione; le container query servono ai componenti che vivono in spazi diversi.
Perché la card non cambia mai layout?
Quasi sempre il container non ha container-type, oppure il container è l'elemento stesso che vuoi stilizzare. La query guarda i discendenti, non il container.
Che differenza c'è tra inline-size e size?
inline-size misura solo l'asse orizzontale e non richiede altezza. size misura entrambi gli assi e richiede un'altezza esplicita, altrimenti il contenuto collassa.
Le container query hanno effetto sulla performance?
Il costo è contenuto perché il browser ricalcola solo il sottoalbero del container. Il rischio è il containment: un contenitore che non cresce più con i figli rompe i layout a misura di contenuto.
Come si testano?
Ridimensiona il contenitore, non la finestra: le DevTools permettono di selezionare un elemento e vedere le sue dimensioni. Un test visivo a 280 px di sidebar copre il caso che la viewport non mostra.