Menu

Meta viewport HTML: width=device-width spiegato

Il meta tag viewport dice ai telefoni di impaginare la pagina alla larghezza dello schermo invece che a una larghezza da desktop. Scopri il tag standard, cosa fa ogni valore, perché il CSS responsive dipende da lui e quali valori evitare.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

Il tag da usare

Metti questa riga nell'<head> di ogni pagina:

<meta name="viewport" content="width=device-width, initial-scale=1">

width=device-width rende il layout largo quanto lo schermo, e initial-scale=1 apre la pagina con lo zoom al 100%. È tutto ciò che serve alla maggior parte dei siti. Una pagina completa con il tag al suo posto:

Lo script legge il tag e la larghezza del layout. I browser desktop ignorano il tag viewport, quindi in questa anteprima la larghezza è semplicemente quella del riquadro dell'anteprima. Su un telefono, lo stesso file riporta la larghezza del telefono (di solito da 360 a 430 pixel CSS) grazie al tag.

Cosa fanno i telefoni senza il tag

Un browser mobile che non trova un tag viewport presume che la pagina sia stata fatta per il desktop. La impagina larga circa 980 pixel, poi rimpicciolisce tutto per farlo stare nello schermo. I due telefoni simulati qui sotto caricano la stessa pagina, uno impaginato a 980px e l'altro alla larghezza di un telefono, entrambi ridimensionati alla stessa grandezza:

Sul primo telefono il testo a 16px diventa minuscolo e il lettore deve allargare con le dita. Sul secondo resta leggibile, e le colonne si impilano perché la regola @media (max-width: 600px) è soddisfatta. Ecco il secondo compito del tag: le media query vedono la larghezza del layout, quindi senza il tag un telefono dichiara 980px e i tuoi stili per mobile non si applicano mai. Cambia 375 in 980 in show('with', 375) e i due telefoni diventano uguali.

Il tag è solo metà del lavoro

Il tag viewport ti dà un layout stretto; il tuo CSS ci deve stare dentro. Un solo elemento con una larghezza fissa più grande dello schermo fa scorrere di lato l'intera pagina:

Il primo riquadro scorre di lato; il secondo si restringe per starci. Dai alle immagini e agli altri elementi larghi max-width: 100%, e preferisci larghezze flessibili (percentuali, fr, flexbox) alle larghezze fisse in pixel.

Valori del viewport

ValoreEsempioCosa fa
widthwidth=device-widthLarghezza del layout. device-width è la larghezza dello schermo in pixel CSS; è ammesso anche un numero, ma raramente è una buona idea.
initial-scaleinitial-scale=1Livello di zoom all'apertura della pagina.
minimum-scale / maximum-scalemaximum-scale=5Limiti allo zoom. Un massimo basso blocca lo zoom, quindi lascia fuori maximum-scale.
user-scalableuser-scalable=yesSe lo zoom con le dita è permesso. Lascialo fuori.
viewport-fitviewport-fit=coverPermette alla pagina di estendersi sotto un notch o gli angoli arrotondati, insieme a un padding con env(safe-area-inset-*).
interactive-widgetinteractive-widget=resizes-contentCome la tastiera sullo schermo influisce sul layout. Supportato da Chrome su Android.

I valori sono separati da virgole. Una pagina che riempie tutto lo schermo sui telefoni con il notch si presenta così:

<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<style>
  body {
    padding-top: env(safe-area-inset-top);
    padding-bottom: env(safe-area-inset-bottom);
  }
</style>

Non bloccare lo zoom

Nei template più vecchi troverai questo tag:

<!-- Avoid: stops people from zooming -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">

Impedisce lo zoom con le dita, su cui contano le persone ipovedenti, e i controlli di accessibilità come Lighthouse lo segnalano. Safari su iOS ignora user-scalable=no, quindi il tag non funziona nemmeno in modo coerente. Se un campo di un modulo fa zoom quando lo tocchi su iPhone, la causa è una dimensione del font sotto i 16px nell'input; imposta il font-size dell'input ad almeno 16px invece di disattivare lo zoom.

Errori comuni

  • Dimenticare il tag. Senza, un foglio di stile responsive non fa niente sui telefoni, perché le media query vedono un layout di 980px. Mettilo accanto al tag title nel template della pagina.
  • Punti e virgola tra i valori. Usa le virgole: width=device-width, initial-scale=1.
  • Fissare una larghezza come width=375. Gli schermi variano; usa device-width.
  • Disattivare lo zoom con user-scalable=no o maximum-scale=1.
  • Dare la colpa al tag per lo scorrimento laterale. Trova l'elemento più largo dello schermo e dagli una larghezza flessibile.

Domande frequenti

Cosa fa il meta tag viewport?

Dice ai browser mobili quanto deve essere largo il layout. Senza, la maggior parte dei telefoni impagina la pagina a circa 980 pixel CSS e la rimpicciolisce per farla stare nello schermo. Con width=device-width il layout corrisponde alla larghezza dello schermo, quindi il testo è leggibile e le media query funzionano.

Qual è il meta tag viewport standard?

<meta name="viewport" content="width=device-width, initial-scale=1">, messo in <head>. È la scelta giusta per quasi tutte le pagine responsive.

Perché il mio meta viewport non funziona?

Controlla che il tag sia in <head>, che name sia viewport e che i valori siano separati da virgole. Se la pagina scorre ancora di lato, qualche elemento è più largo dello schermo, come una larghezza fissa, un'immagine grande o una parola lunga; il tag non può correggere un CSS più largo del dispositivo.

Devo usare user-scalable=no o maximum-scale=1?

No. Entrambi impediscono lo zoom, su cui contano molti utenti ipovedenti, e non passano i controlli di accessibilità. Safari su iOS ignora comunque user-scalable=no.

Il meta tag viewport ha effetto sui browser desktop?

No. I browser desktop lo ignorano; lì la larghezza del layout è semplicemente quella della finestra. Il tag conta su telefoni e tablet.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA