Da sempre CSS integra un meccanismo per servire fogli di stili differenti a seconda del dispositivo utilizzato dal visitatore (nella nostra guida base ai CSS abbiamo affrontato lโargomento nella lezione dedicata allโattributo media). Con CSS3 questo meccanismo รจ stato evoluto ed ampliato notevolmente mediante lโintroduzione di un nuovo sistema che prende il nome di media query o media queries, attraverso il quale non solo รจ possibile distinguere in base al tipo, ma anche in base alle caratteristiche del dispositivo (come, ad esempio, la dimensione dello schermo, lโorientamento, ecc.).
Media query: cosโรจ e a cosa serve
Tralasciando le definizioni, una media query รจ un insieme di direttive CSS che dovranno applicarsi ad un dispositivo (media) di un certo tipo e/o avente determinate caratteristiche.
Dichiarare una media query
Una media query puรฒ essere dichiarata in tre modi differenti. Vediamoli di seguito prima di approfondire la sintassi di questo potente strumento introdotto da CSS3.
1) mediante lโinclusione di un foglio di stile esterno attraverso un tag <link>:
<link rel="stylesheet" media="print" href="stampa.css">
2) allโinterno di un foglio di stile, importando un secondo foglio di stile mediante la direttiva @import:
@import url(stampa.css) print;
3) allโinterno di un foglio di stile, direttamente mediante la direttiva @media:
@media print {
...
}
Nei tre esempi visti qui sopra non abbiamo fatto altro che specificare regole CSS specifiche per la stampa (il nostro media รจ print) ma, ovviamente, la potenza delle media queries non ri risolve in questo.
Per motivi espositivi, nel proseguo di questa lezione, faremo riferimento solo alla direttiva @media, fermo restando che le tre tecniche sono tra loro equivalenti.
Sintassi delle media queries di CSS3
Lโelemento caratterizzante delle media queries di CSS3 รจ dato dalla possibilitร di selezionarie il dispositivo in modo molto preciso, non solo in base al tipo (come avveniva nella precedente versione di CSS) ma anche in base ad altre sue caratteristiche, eventualmente combinate tra loro.
Lโoperatore and
Vediamo subito un esempio:
@media screen and (max-width: 900px) {
...
}
Nel nostro esempio abbiamo selezionato dei dispositivi ben precisi in base a due fattori:
- la tipologia: solamente i dispositivi dotati di uno schermo (screen), ad esempio, computer, tablet e smartphone;
- le dimensioni dello schermo: solamente i dispositivi aventi uno schermo con risoluzione non superiore a 900 px di larghezza (max-width: 900px).
La sintassi di base, come avrete capito, รจ la seguente:
@media tipo and (caratteristica)
Dopo la direttiva @media va specificato il tipo di dispositivo e/o la sua caratteristica discriminante. Se รจ specificato il tipo, la caratteristica รจ preceduta dallโoperatore and. In ogni caso la caratteristica va specificata tra parentesi. facciamo qualche esempio:
/* SOLO IL TIPO */
@media screen {
...
}
/* SOLO LA CARATTERISTICA */
@media (max-width: 900px) {
...
}
/* SIA IL TIPO CHE LA CARATTERISTICA */
@media screen and (max-width: 900px) {
...
}
Eโ anche possibile specificare piรน di una caratteristica, in questo modo:
@media tipo and (caratteristica n.1) and (caratteristica n.2)
Facciamo un esempio:
@media screen and (max-width: 900px) and (max-height: 600px) {
...
}
In qusto caso le regole CSS andranno ad applicarsi agli schermi con una risoluzione non superiore a 900 in larghezza e 600 in altezza. Le regole CSS saranno applicate quando entrambe le caratteristiche saranno soddisfatte.
Lโoperatore virgola
Volendo, perรฒ, รจ anche possibile creare delle regole sulla base di caratteristiche alternative, in questo modo:
@media tipo and (caratteristica n.1), tipo and (caratteristica n.2)
Facciamo un esempio:
@media screen and (max-width: 900px), screen and (max-height: 600px) {
...
}
In questo caso le regole CSS andranno ad applicarsi sia agli schermi aventi una risoluzione in larghezza non superiore a 900 pixel, che a quelli aventi una risuluzione in altezza non superiore a 600 pixel (le due caratteristiche non devono necessariamente essere soddisfatte simultaneamente).
Lโoperatore not
Nella costruzione della query di selezione del dispositivo รจ anche possibile anteporre la keyword not per impostare delle negazioni, ad esempio:
@media not screen and (max-width: 900px)
Il risultato ottenuto sarร lโesatto opposto di quello visto in precedenza, cioรจ le regole CSS verranno applicate sempre tranne che per gli schermi aventi una risoluzione in larghezza pari o inferiore 900 pixel.
I tipi di media
CSS3 ha ridotto notevolmente lโelenco dei tipi supportati rispetto a CSS 2.1. Ad oggi i tipi supportati sono solamente quattro:
- all โ tutti i dispositivi;
- print โ dispositivi di stampa;
- screen โ dispositivi dotati di monitor (computer, tablet, smarphone, smart TV, ecc.);
- speech โ dispositivi che effettuano la sintesi vocale del contenuto della pagina (cd. screenreaders).
Caratteristiche utilizzare nelle query di selezione
Ben piรน ampia la lista delle caratteristiche definite e riconosciute da CSS3. Le piรน importanti sono:
- Altezza dello schermo:
- device-width โ larghezza dello schermo
- max-device-width โ larghezza massima dello schermo
- min-device-width โ larghezza minima dello schermo
- Larghezza dello schermo:
- device-height โ altezza dello schermo
- max-device-height โ altezza massima dello schermo
- min-device-height โ altezza minima dello schermo
- Altezza della viewport:
- width โ larghezza della viewport
- max-width โ larghezza massima della viewport
- min-width โ larghezza minima della viewport
- Larghezza della vewport:
- height โ altezza della viewport
- max-height โ altezza massima della viewport
- min-height โ altezza minima della viewport
- Risoluzione:
- resolution โ risoluzione del dispositivo (dpi o dpcm)
- max-resolution โ risoluzione massima del dispositivo (dpi o dpcm)
- min-resolution โ risoluzione minima del dispositivo (dpi o dpcm)
- Colori:
- color โ numero di bit per ciascuna componente di colore (0 indica che il dispositivo non supporta i colori)
- monochrome โ numero di bit per "colore" su un dispositivo monocromatico (in scala di grigi)
- Altre caratteristiche dello schermo:
- aspect-ratio โ rapporto tra la larghezza e lโaltezza della viewport
- orientation โ orientamento della viewport (nei dispositivi mobili indica la modalitร orizzontale โ landscape o verticale โ portrait)
Differenza tra *-width e *-device-width
Le caratteristiche relative alla dimensione dello schermo possono essere facilmente confuse: min-width
e min-device-width
, ad esempio, vengono spesso utilizzate come se fossero la stessa cosaโฆ in realtร non รจ cosรฌ: min-width รจ basato sulla dimensione della finestra del browser mentre min-device-width prende come riferimento la dimensione del display che non necessariamente corrisponde a quella dellโarea di visualizzazione.
Se un utente dovesse ridimensionare la finestra del browser, quindi, le media query che utilizzano *-device-width non produrrebbero alcuna modifica!
Media Queries e design responsivo
Uno dei meriti principali delle media queries รจ quello di aver dato vita alla cosiddetta tecnica del design responsivo grazie alla quale, senza alterare la struttura HTML di una pagina web, รจ possibile adattarne lโaspetto a seconda delle dimensioni del device utilizzato.
Per raggiungere un simile obiettivo si fa ricorso, appunto, alle media queries grazie alle quali si andranno a definire specifiche regole di stile al fine di adattare lโaspetto di ciascun elemento in base alle dimensioni della viewport.
In questo contesto risultano particolarmente utili le proprietร min-width
, max-width
e orientation
di CSS.
Facciamo un semplice esempio, supponendo di avere una pagina web con un layout a due colonne:
.sidebar {
float: left;
width: 30%;
}
.main {
float: left;
width: 70%;
}
Ora prevediamo, allโinterno del nostro foglio di stile, una media query per i dispositvi con schermo piccolo. Nello specifico andremo a ridisegnare il layout del sito facendo in modo che i due elementi (sidebar e main) non siano piรน affiancati ma vengano visualizzati lโuno sotto allโaltro:
@media (max-width: 600px) {
.sidebar, .main {
float: none;
width: 100%;
}
}
Prova il codiceLo stesso risultato, piรน correttamente, si sarebbe potuto raggiungere cosรฌ:
.sidebar .main {
width: 100%;
}
@media (min-width: 600px) {
.sidebar, .main {
float: left;
}
.sidebar {
width: 30%;
}
.main {
width: 70%;
}
}
Quello che abbiamo appena visto รจ un esempio di design responsivo: lโHTML della pagina non cambia ma cambia il suo aspetto in base alle dimensioni del device utilizzato dallโutente.
In questโultimo esempio gli emeneti "sidebar" e "main" saranno incolonnati a meno che lo schermo non superi le dimensioni in larghezza di 600 pixel.
Negli esempi visti sopra abbiamo utilizzato esclusivamente le caratteristiche legate alla larghezza dello schermo, tuttavia nella definizione di un design responsivo puรฒ rivelarsi utilie utilizzare, in combinazione con queste, nahce la rilevazione dellโorientamento del device. Ad esempio si supponga di voler definire due stili differenti per iPad a seconda che questo sia utilizzato in modalitร landscape (panoramica) o portrait (ritratto):
/* iPad (landscape) */
@media only screen
and (min-device-width : 768px)
and (max-device-width : 1024px)
and (orientation : landscape) {
/* ... stile ... */
}
/* iPad (portrait) */
@media only screen
and (min-device-width : 768px)
and (max-device-width : 1024px)
and (orientation : portrait) {
/* ... stile ... */
}
Media query e Javascript (cenni)
Attraverso CSS abbiamo visto come realizzare un design responsivo. Nella maggior parte dei casi, tuttavia, per lo sviluppo di un sito adattivo รจ necessario utilizzare anche Javascript. A tal fine puรฒ rivelarsi molto utile il metodo matchMedia dellโoggetto window, grazie al quale potremo utilizzare le media query anche per creare modifiche sofisticate dellโinterfaccia utente mediante la manipolazione del DOM e/o lโattivazione/disattivazione di funzionalitร .
Di seguito un semplice esempio di implementazione:
var mql = window.matchMedia('@media all and (min-width: 600px)');
if (mql.matches) {
// istruzioni per larghezze pari o superiori ai 600px
} else {
// istruzioni per larghezze fino a 599px
}
Alla base del costrutto condizionale vi รจ, appunto, il metodo matchMedia
che restituisce un oggetto con cui rappresentare il risultato di un parsing a carico di una media query; tale oggetto verrร passato al metodo matches() che lo utilizzerร come valore di confronto nella condizione introdotta tramite il costrutto if/else.