Menu

Balise meta viewport : width=device-width expliqué

La balise meta viewport indique aux téléphones de mettre la page en page à la largeur de l'écran plutôt qu'à une largeur d'ordinateur. Découvrez la balise standard, le rôle de chaque valeur, pourquoi le CSS responsive en dépend et quelles valeurs éviter.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

La balise à utiliser

Placez cette ligne dans le <head> de chaque page :

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

width=device-width rend la mise en page aussi large que l'écran, et initial-scale=1 ouvre la page à un zoom de 100 %. C'est tout ce dont la plupart des sites ont besoin. Une page complète avec la balise en place :

Le script lit la balise et la largeur de la mise en page. Les navigateurs de bureau ignorent la balise viewport, donc dans cet aperçu la largeur est simplement celle de la boîte d'aperçu. Sur un téléphone, le même fichier indique la largeur du téléphone (typiquement 360 à 430 pixels CSS) grâce à la balise.

Ce que font les téléphones sans elle

Un navigateur mobile qui ne trouve pas de balise viewport suppose que la page a été faite pour un ordinateur. Il met la page en page sur environ 980 pixels de large, puis réduit l'ensemble pour tenir à l'écran. Les deux téléphones factices ci-dessous chargent la même page, l'une mise en page à 980px et l'autre à une largeur de téléphone, toutes deux ramenées à la même taille :

Sur le premier téléphone, le texte de 16px devient minuscule et le lecteur doit pincer pour zoomer. Sur le second, il reste lisible, et les colonnes s'empilent car la règle @media (max-width: 600px) s'applique. C'est le second rôle de la balise : les media queries voient la largeur de la mise en page, donc sans la balise un téléphone annonce 980px et vos styles mobiles ne s'appliquent jamais. Remplacez 375 par 980 dans show('with', 375) et les deux téléphones se ressemblent.

La balise ne fait que la moitié du travail

La balise viewport vous donne une mise en page étroite ; votre CSS doit y tenir. Un seul élément de largeur fixe plus large que l'écran fait défiler toute la page horizontalement :

La première boîte défile horizontalement ; la seconde se réduit pour tenir. Donnez aux images et aux autres éléments larges max-width: 100%, et préférez des largeurs flexibles (pourcentages, fr, flexbox) aux largeurs fixes en pixels.

Les valeurs de viewport

ValeurExempleRôle
widthwidth=device-widthLargeur de la mise en page. device-width est la largeur de l'écran en pixels CSS ; un nombre est aussi autorisé mais c'est rarement une bonne idée.
initial-scaleinitial-scale=1Niveau de zoom à l'ouverture de la page.
minimum-scale / maximum-scalemaximum-scale=5Limites de zoom. Un maximum bas bloque le zoom, alors omettez maximum-scale.
user-scalableuser-scalable=yesAutorise ou non le zoom par pincement. Omettez-le.
viewport-fitviewport-fit=coverPermet à la page de s'étendre sous une encoche ou des coins arrondis, avec un padding env(safe-area-inset-*).
interactive-widgetinteractive-widget=resizes-contentComment le clavier à l'écran influence la mise en page. Pris en charge par Chrome sur Android.

Les valeurs sont séparées par des virgules. Une page qui remplit tout l'écran sur les téléphones à encoche ressemble à ceci :

<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>

Ne bloquez pas le zoom

Vous trouverez cette balise dans d'anciens templates :

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

Elle empêche le zoom par pincement, dont dépendent les personnes malvoyantes, et les outils de vérification d'accessibilité comme Lighthouse la signalent. Safari sur iOS ignore user-scalable=no, donc la balise ne fonctionne même pas de façon cohérente. Si un champ de formulaire zoome quand on le touche sur iPhone, la cause est une taille de police inférieure à 16px sur le champ ; donnez au champ une font-size d'au moins 16px au lieu de désactiver le zoom.

Erreurs fréquentes

  • Oublier la balise. Une feuille de style responsive ne fait rien sur les téléphones sans elle, car les media queries voient une mise en page de 980px. Placez-la à côté de la balise title dans votre template de page.
  • Des points-virgules entre les valeurs. Utilisez des virgules : width=device-width, initial-scale=1.
  • Coder une largeur en dur comme width=375. Les écrans varient ; utilisez device-width.
  • Désactiver le zoom avec user-scalable=no ou maximum-scale=1.
  • Accuser la balise du défilement horizontal. Trouvez l'élément plus large que l'écran et donnez-lui une largeur flexible.

Questions fréquentes

À quoi sert la balise meta viewport ?

Elle indique aux navigateurs mobiles quelle largeur donner à la mise en page. Sans elle, la plupart des téléphones mettent la page en page sur environ 980 pixels CSS puis la réduisent pour tenir à l'écran. Avec width=device-width, la mise en page correspond à la largeur de l'écran, donc le texte est lisible et les media queries fonctionnent.

Quelle est la balise meta viewport standard ?

<meta name="viewport" content="width=device-width, initial-scale=1">, placée dans <head>. C'est le bon choix pour presque toutes les pages responsives.

Pourquoi ma meta viewport ne fonctionne pas ?

Vérifiez que la balise est dans <head>, que name vaut viewport et que les valeurs sont séparées par des virgules. Si la page défile toujours horizontalement, un élément est plus large que l'écran, comme une largeur fixe, une grande image ou un mot long ; la balise ne peut pas corriger un CSS plus large que l'appareil.

Faut-il utiliser user-scalable=no ou maximum-scale=1 ?

Non. Les deux empêchent les gens de zoomer, ce dont dépendent beaucoup d'utilisateurs malvoyants, et ils échouent aux audits d'accessibilité. Safari sur iOS ignore de toute façon user-scalable=no.

La balise meta viewport a-t-elle un effet sur les navigateurs de bureau ?

Non. Les navigateurs de bureau l'ignorent ; la largeur de mise en page y est simplement celle de la fenêtre. La balise compte sur les téléphones et les tablettes.

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER