Le comportement réel sur les différents appareils est incohérent . Les événements resize et orientationChange peuvent se déclencher dans une séquence différente avec une fréquence variable. De plus, certaines valeurs (par exemple screen.width et window.orientation) ne changent pas toujours lorsque vous vous y attendez. Évitez screen.width - cela ne change pas lors de la rotation dans iOS.
L'approche fiable consiste à écouter à la fois les événements de redimensionnement et d'orientationChange (avec une interrogation comme prise de sécurité), et vous obtiendrez finalement une valeur valide pour l'orientation. Lors de mes tests, les appareils Android ne parviennent parfois pas à déclencher des événements lors d'une rotation complète de 180 degrés.J'ai donc également inclus un setInterval pour interroger l'orientation.
var previousOrientation = window.orientation;
var checkOrientation = function(){
if(window.orientation !== previousOrientation){
previousOrientation = window.orientation;
}
};
window.addEventListener("resize", checkOrientation, false);
window.addEventListener("orientationchange", checkOrientation, false);
setInterval(checkOrientation, 2000);
Voici les résultats des quatre appareils que j'ai testés (désolé pour le tableau ASCII, mais cela semblait être le moyen le plus simple de présenter les résultats). Mis à part la cohérence entre les appareils iOS, il existe une grande variété entre les appareils. REMARQUE: les événements sont répertoriés dans l'ordre de leur déclenchement.
| ================================================== ============================== |
| Appareil | Événements déclenchés | orientation | innerWidth | screen.width |
| ================================================== ============================== |
| iPad 2 | redimensionner | 0 | 1024 | 768 |
| (au paysage) | orientationchange | 90 | 1024 | 768 |
| ---------------- + ------------------- + ------------ - + ------------ + -------------- |
| iPad 2 | redimensionner | 90 | 768 | 768 |
| (au portrait) | orientationchange | 0 | 768 | 768 |
| ---------------- + ------------------- + ------------ - + ------------ + -------------- |
| iPhone 4 | redimensionner | 0 | 480 | 320 |
| (au paysage) | orientationchange | 90 | 480 | 320 |
| ---------------- + ------------------- + ------------ - + ------------ + -------------- |
| iPhone 4 | redimensionner | 90 | 320 | 320 |
| (au portrait) | orientationchange | 0 | 320 | 320 |
| ---------------- + ------------------- + ------------ - + ------------ + -------------- |
| Téléphone Droid | orientationchange | 90 | 320 | 320 |
| (au paysage) | redimensionner | 90 | 569 | 569 |
| ---------------- + ------------------- + ------------ - + ------------ + -------------- |
| Téléphone Droid | orientationchange | 0 | 569 | 569 |
| (au portrait) | redimensionner | 0 | 320 | 320 |
| ---------------- + ------------------- + ------------ - + ------------ + -------------- |
| Samsung Galaxy | orientationchange | 0 | 400 | 400 |
| Tablette | orientationchange | 90 | 400 | 400 |
| (au paysage) | orientationchange | 90 | 400 | 400 |
| | redimensionner | 90 | 683 | 683 |
| | orientationchange | 90 | 683 | 683 |
| ---------------- + ------------------- + ------------ - + ------------ + -------------- |
| Samsung Galaxy | orientationchange | 90 | 683 | 683 |
| Tablette | orientationchange | 0 | 683 | 683 |
| (au portrait) | orientationchange | 0 | 683 | 683 |
| | redimensionner | 0 | 400 | 400 |
| | orientationchange | 0 | 400 | 400 |
| ---------------- + ------------------- + ------------ - + ------------ + -------------- |