device-width et orientation sur mobiles

La détection de l’orientation du périphérique se fait de manière native par le navigateur mobile.

Mais savez-vous qu’en fixant une surface de viewport à width="device-width" (pratique habituelle), vous allez certainement conserver cette valeur lors du passage en orientation paysage, alors que la valeur souhaitée serait plutôt device-height dans ce sens ?

J’ai voulu tester cette affirmation pour répondre à une question essentielle : la valeur de device-width doit-elle demeurer constante quelle que soit l’orientation du terminal mobile ?

Selon moi, il serait logique que oui. Mais en fait, ça dépend…

J’ai créé une page de test pour vérifier si le device-width change avec l’orientation : http://mobitest.me/

Les infos de la balise <meta> viewport sont celles-ci :

<meta name="viewport" content="width=device-width">

Résultats Smartphones

  • iPhone 3, iPhone 4, iPhone 5 (iOS5 / iOS6) :
    Safari mobile : 320px (portrait) → 320px (paysage)
    Chrome mobile : 320px (portrait) → 320px (paysage)
    Dolphin : 320px (portrait) → 320px (paysage)
    OneBrowser :  320px (portrait) → 320px (paysage)
    UC browser : 320px (portrait) → 320px (paysage)
    Opera Mini : 320px (portrait) → 480px (paysage, après refresh)
  • Samsung Galaxy Nexus (Android 4.2) :
    Navigateur natif : 320px (portrait) → 540px (paysage)
    Chrome mobile : 320px (portrait) → 540px (paysage)
    Firefox mobile : 320px (portrait) → 540px (paysage)
    Opera Mobile : 320px (portrait) → 540px (paysage)
  • LG Optimus 2X (Android 2.3) :
    Navigateur natif : 320px (portrait) → 480px (paysage)
    Chrome mobile : 320px (portrait) → 480px (paysage)
    UC browser : 320px (portrait) → 480px (paysage)
    Firefox mobile : 320px (portrait) → 480px (paysage)
    Opera Mobile : 320px (portrait) → 480px (paysage)
  • Samsung Wave (Bada 1.1) :
    Dolphin : 240px (portrait) → 320px (paysage)
  • Samsung Wave gt 8500 (Bada 2) :
    Dolphin : 320px (portrait) → 480px (paysage)
  • Nokia N8 (Symbian) :
    Opera Mobile : 240px (portrait) → 427px (paysage, après refresh)
    Opera Mini : 360px (portrait) → 640px (paysage, après refresh)

Résultats Tablettes

  • iPad 1, 2, 3 :
    Safari mobile : 768px (portrait) → 768px (paysage)
    Opera Mini : 768px (portrait) → 1024px (paysage, après refresh)
  • Samsung Galaxy Tab 8.9 (Android 3) :
    Browser natif : 800px (portrait) → 1280px (paysage)
    Chrome mobile : 800px (portrait) → 1280px (paysage)
    Dolphin : 800px (portrait) → 1280px (paysage)
    Opera Mobile : 800px (portrait) → 1280px (paysage)

Mais ça veut dire quoi tout ça ?!

La règle semble être la suivante:

  • De manière générale, sur la plupart des terminaux testés, la valeur de device-width change et s’adapte à l’orientation.
  • Apple fait une exception à la règle : la valeur de device-width demeure constante en portrait et en paysage sur tous ses navigateurs (sauf sur Opera mini).

Ce comportement a une incidence sur l’affichage des pages : en mode paysage sur les produits Apple (uniquement ?), la largeur de fenêtre reste constante tandis que la résolution physique change. Conséquence : la taille globale augmente d’environ 1/3.

Note : ce souci de device-width n’a pas lieu si l’on se contente de définir le zoom initial :

<meta name="viewport" content="initial-scale=1.0">

Voir la page de test : http://bit.ly/mobilewidth2

Euh, je ne suis pas sûr d’avoir vraiment compris :/

Voyons cela en images…

Prenons un navigateur au hasard sur iPhone ou iPad (ici Chrome, mais cela aurait pu être n’importe lequel sauf Opera) avec un meta viewport en “width=device-width”.
La valeur de device-width en paysage est figée, elle est donc de 320px comme en portrait. La page est donc légèrement zoomée :

image

Petite variante : même navigateur, même envionnement mais un meta viewport en “initial-scale=1.0”.
Cette fois, la valeur de device-width, n’étant pas figée par la balise meta, s’adapte correctement et la page n’est pas zoomée. C’est le comportement souhaité :

image 

Alors, que faire pour être sûr ?

N’hésitez pas à me signaler si vos propres tests confirment ou contredisent les miens ;)

image



  1. goetter a publié ce billet