mozilla

Revision 435947 of Détecter l'orientation de l'appareil

  • Raccourci de la révision : WebAPI/Detecting_device_orientation
  • Titre de la révision : Détecter l'orientation de l'appareil
  • ID de la révision : 435947
  • Créé :
  • Créateur : tregagnon
  • Version actuelle ? Oui
  • Commentaire

Contenu de la révision

{{SeeCompatTable}}

Résumé

De plus en plus d'appareils connectés à Internet sont capable de déterminer leur orientation. C'est-à-dire qu'ils peuvent fournir des données indiquant des changements dans leur orientation par rapport à la gravité. En particulier les appareils portables comme les téléphones mobiles, peuvent utiliser cette information pour effectuer automatiquement une rotation de l'écran, afin de toujours proposer la meilleure disposition possible pour le contenu à afficher.

Il existe deux événements JavaScript pour gérer l'orientation. Le premier est {{domxref("DeviceOrientationEvent")}}, qui est envoyé quand l'accéléromètre détecte un changement d'orientation de l'appareil. En recevant et en analysant les données fournies par ces événements d'orientation, il est possible de répondre de manière interactive aux changements d'orientation et d'élévation causés par les mouvements imprimés à l'appareil par l'utilisateur.

Le second événement est {{ domxref("DeviceMotionEvent") }}, qui est envoyé quand un changement d’accélération est ajouté. il est différent de {{domxref("DeviceOrientationEvent")}} car il écoute les changements d'accélération par opposition à l'orientation. Parmi les capteurs capables de détecter {{ domxref("DeviceMotionEvent") }} on trouve les capteurs des ordinateurs portables utilisés pour protéger des chutes les périphériques de stockages. Ils sont communément présents dans les appareils mobiles (tablettes, téléphone intelligents).

Traitement des événements d'orientation

Tout ce dont vous avez besoin pour commencer à recevoir les changements d'orientation est d’écouter l’événement {{ event("deviceorientation") }} :

window.addEventListener("deviceorientation", handleOrientation, true);

Après l’enregistrement de votre gestionnaire d'événements (event listener en anglais), dans ce cas, une fonction JS appelée handleOrientation(), votre fonction d'écoute est appelée périodiquement pour récupérer les données de l'orientation mise à jour.

L'événement d'orientation contient quatre valeurs :

  • {{domxref("DeviceOrientationEvent.absolute")}}
  • {{domxref("DeviceOrientationEvent.alpha")}}
  • {{domxref("DeviceOrientationEvent.beta")}}
  • {{domxref("DeviceOrientationEvent.gamma")}}

La fonction gérant l’événement pourrait ressembler à ceci :

function handleOrientation(event) {
  var absolute = event.absolute;
  var alpha    = event.alpha;
  var beta     = event.beta;
  var gamma    = event.gamma;

  // Faites quelque chose avec les données acquises. ;)
}

Détail des valeurs d'orientation

La valeur reportée pour chaque axe indique l'angle de rotation autour d'un axe donné, en référence à un système de coordonnées standard. Ces valeurs sont décrites de façon plus détaillée dans cet article Orientation et déplacement expliquée.

  • La valeur {{ domxref("DeviceOrientationEvent.alpha") }} représente le mouvement de l'appareil, autour de l'axe « z », en degrés sur une échelle de 0° à 360° ;
  • La valeur {{ domxref("DeviceOrientationEvent.beta") }} représente le mouvement de l'appareil autour de l'axe « y » en degrés, sur une échelle de -180° à 180°.  Cela représente le mouvement d'avant en arrière de l'appareil ;
  • La valeur {{ domxref("DeviceOrientationEvent.gamma") }} représente le mouvement de l'appareil autour de l'axe « x », exprimée en degrés sur une échelle de -90° à 90°. Cela représente le mouvement de gauche à droite de l'appareil.

Exemple d'orientation

Cet exemple fonctionne sur tout navigateur supportant l’événement {{event("deviceorientation")}} et sur tout appareil capable de détecter son orientation.

Imaginons une balle dans un jardin :

<div class="jardin">
  <div class="balle"></div>
</div>

<pre class="resultat"></pre>

Ce jardin fait 200 pixels de long (Oui c'est un « petit » jardin !), et la balle est au centre :

.jardin {
  position: relative;
  width : 200px;
  height: 200px;
  border: 5px solid #CCC;
  border-radius: 10px;
}

.balle {
  position: absolute;
  top   : 90px;
  left  : 90px;
  width : 20px;
  height: 20px;
  background: green;
  border-radius: 100%;
}

Maintenant, on définit le déplacement de la balle en fonction de celui de l'appareil :

var jardin = document.querySelector('.jardin'),
    balle = document.querySelector('.balle'),
    resultat = document.querySelector('.resultat'),
    maxX = jardin.clientWidth  - balle.clientWidth,
    maxY = jardin.clientHeight - balle.clientHeight;

function handleOrientation(event) {
  var x = event.beta,  // En degré sur l'interval [-180,180].
      y = event.gamma; // En degré sur l'interval [-90,90].

  resultat.innerHTML  = "beta : " + x + "<br />";
  resultat.innerHTML += "gamma: " + y + "<br />";

  // Parce-que l'on ne veut pas avoir l'appareil à l'envers.
  // On restreint les valeurs de x à l'intervalle [-90,90].
  if (x >  90) { x =  90};
  if (x < -90) { x = -90};
  // Pour rendre le calcul plus simple.
  // On délimite l'intervalle de x et y sur [0, 180].
  x += 90;
  y += 90;

  // 10 est la moitié de la taille de la balle.
  // Cela centre le point de positionnement au centre de la balle.

  balle.style.top  = (maxX * x / 180 - 10) + "px";
  balle.style.left = (maxY * y / 180 - 10) + "px";
}

window.addEventListener('deviceorientation', handleOrientation);

Et voici le résultat en temps réel :

{{EmbedLiveSample('Orientation_example', '230', '260')}}

Attention : Chrome et Firefox ne gèrent pas les angles de la même façon, certaines directions sur les axes sont inversées.

Traiter les événement de mouvement

Les événements de mouvement gèrent l'orientation de la même façon à l'exception près qu’ils portent un nom d’événement différent : {{event("devicemotion")}}

window.addEventListener("devicemotion", handleMotion, true);

Ce qui change réellement est l'information fournie par l'objet {{ domxref("DeviceMotionEvent") }} passée comme paramètre par la fonction HandleMotion.

Les événements de mouvement contiennent quatre propriétés :

  • {{domxref("DeviceMotionEvent.acceleration")}}
  • {{domxref("DeviceMotionEvent.accelerationIncludingGravity")}}
  • {{domxref("DeviceMotionEvent.rotationRate")}}
  • {{domxref("DeviceMotionEvent.interval")}}

Explication des valeurs de mouvement

L'objet {{ domxref("DeviceMotionEvent") }} fourni aux développeurs Web des informations sur la vitesse de changement d'orientation et de position de l'appareil. Les changements rapportés sont fournis pour les trois axes (voir Orientation et déplacement expliquées pour les détails).

Pour {{domxref("DeviceMotionEvent.acceleration","acceleration")}} et {{domxref("DeviceMotionEvent.accelerationIncludingGravity","accelerationIncludingGravity")}}, Les axes correspondent à :

  • x : représente l'axe d'Ouest en Est ;
  • y : représente l'axe Sud vers Nord :
  • z : représente l'axe perpendiculaire au sol.

Pour {{domxref("DeviceMotionEvent.rotationRate","rotationRate")}}, c'est un peu différent. L'information correspond à :

  • alpha : représente le ratio de rotation le long de l'axe perpendiculaire à l'écran (ou du clavier au bureau) ;
  • bêta : représente le ratio de rotation le long de l'axe allant de la gauche vers la droite de l'écran (ou du clavier au bureau) ;
  • gamma : représente le ratio de rotation le long de l'axe allant du bas vers le haut de l'écran (ou clavier vers le bureau).

Au final, {{domxref("DeviceMotionEvent.interval","interval")}} représente l'intervalle de temps, en millisecondes, pour les données générées par l'appareil.

Spécifications

Spécification Statut Commentaires
{{SpecName('Device Orientation')}} {{Spec2('Device Orientation')}} Spécification initiale.

Compatibilité des navigateurs

{{CompatibilityTable()}}

Fonctionnalité Chrome Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
{{domxref("DeviceOrientationEvent")}} 7.0 3.6[1]
6
{{CompatUnknown()}} {{CompatUnknown()}} {{CompatUnknown()}}
{{domxref("DeviceMotionEvent")}} {{CompatVersionUnknown()}} 6 {{CompatUnknown()}} {{CompatUnknown()}} {{CompatUnknown()}}
Fonctionnalité Android Firefox Mobile (Gecko) IE Phone Opera Mobile Safari Mobile
{{domxref("DeviceOrientationEvent")}} 3.0 3.6[1]
6
{{ CompatNo() }} {{ CompatNo() }} 4.2
{{domxref("DeviceMotionEvent")}} {{ CompatVersionUnknown() }} 6 {{ CompatUnknown() }} {{ CompatUnknown() }} {{ CompatUnknown() }}

Notes d'implementation pour Gecko 

  1. Firefox 3.6, 4, et 5 supportent mozOrientation au lieu de l'événement standard {{domxref("DeviceOrientationEvent")}}.

Voir aussi

Source de la révision

<p>{{SeeCompatTable}}</p>
<h2 id="R.C3.A9sum.C3.A9">Résumé</h2>
<p>De plus en plus d'appareils connectés à Internet sont capable de déterminer leur <strong>orientation</strong>. C'est-à-dire qu'ils peuvent fournir des données indiquant des changements dans leur orientation par rapport à la gravité. En particulier les appareils portables comme les téléphones mobiles, peuvent utiliser cette information pour effectuer automatiquement une rotation de l'écran, afin de toujours proposer la meilleure disposition possible pour le contenu à afficher.</p>
<p>Il existe deux événements JavaScript pour gérer l'orientation. Le premier est {{domxref("DeviceOrientationEvent")}}, qui est envoyé quand l'accéléromètre détecte un changement d'orientation de l'appareil. En recevant et en analysant les données fournies par ces événements d'orientation, il est possible de répondre de manière interactive aux changements d'orientation et d'élévation causés par les mouvements imprimés à l'appareil par l'utilisateur.</p>
<p>Le second événement est {{ domxref("DeviceMotionEvent") }}, qui est envoyé quand un changement d’accélération est ajouté. il est différent de {{domxref("DeviceOrientationEvent")}} car il écoute les changements d'accélération par opposition à l'orientation. Parmi les capteurs capables de détecter {{ domxref("DeviceMotionEvent") }} on trouve les capteurs des ordinateurs portables utilisés pour protéger des chutes les périphériques de stockages. Ils sont communément présents dans les appareils mobiles (tablettes, téléphone intelligents).</p>
<h2 id="Traitement_des_.C3.A9v.C3.A9nements_d'orientation">Traitement des événements d'orientation</h2>
<p>Tout ce dont vous avez besoin pour commencer à recevoir les changements d'orientation est d’écouter l’événement {{ event("deviceorientation") }}&nbsp;:</p>
<pre class="brush: js">
window.addEventListener("deviceorientation", handleOrientation, true);
</pre>
<p>Après l’enregistrement de votre gestionnaire d'événements (<em>event listener</em> en anglais), dans ce cas, une fonction JS appelée handleOrientation(), votre fonction d'écoute est appelée périodiquement pour récupérer les données de l'orientation mise à jour.</p>
<p>L'événement d'orientation contient quatre valeurs&nbsp;:</p>
<ul>
  <li>{{domxref("DeviceOrientationEvent.absolute")}}</li>
  <li>{{domxref("DeviceOrientationEvent.alpha")}}</li>
  <li>{{domxref("DeviceOrientationEvent.beta")}}</li>
  <li>{{domxref("DeviceOrientationEvent.gamma")}}</li>
</ul>
<p>La fonction gérant l’événement pourrait ressembler à ceci&nbsp;:</p>
<pre class="brush: js">
function handleOrientation(event)&nbsp;{
&nbsp; var absolute = event.absolute;
&nbsp; var alpha    = event.alpha;
&nbsp; var beta     = event.beta;
&nbsp; var gamma    = event.gamma;

&nbsp; // Faites quelque chose avec les données acquises. ;)
}
</pre>
<h3 id="D.C3.A9tail_des_valeurs_d'orientation">Détail des valeurs d'orientation</h3>
<p>La valeur reportée pour chaque axe indique l'angle de rotation autour d'un axe donné, en référence à un système de coordonnées standard. Ces valeurs sont décrites de façon plus détaillée dans cet article <a href="/en-US/DOM/Orientation_and_motion_data_explained" title="Orientation et déplacement expliquée">Orientation et déplacement expliquée</a>.</p>
<ul>
  <li>La valeur {{ domxref("DeviceOrientationEvent.alpha") }} représente le mouvement de l'appareil, autour de l'axe «&nbsp;z&nbsp;», en degrés sur une échelle de 0° à 360°&nbsp;;</li>
  <li>La valeur {{ domxref("DeviceOrientationEvent.beta") }} représente le mouvement de l'appareil autour de l'axe «&nbsp;y&nbsp;» en degrés, sur une échelle de -180° à 180°.&nbsp; Cela représente le mouvement d'avant en arrière de l'appareil&nbsp;;</li>
  <li>La valeur {{ domxref("DeviceOrientationEvent.gamma") }} représente le mouvement de l'appareil autour de l'axe «&nbsp;x&nbsp;», exprimée en degrés sur une échelle de -90° à 90°. Cela représente le mouvement de gauche à droite de l'appareil.</li>
</ul>
<h3 id="Exemple_d'orientation">Exemple d'orientation</h3>
<p>Cet exemple fonctionne sur tout navigateur supportant l’événement {{event("deviceorientation")}} et sur tout appareil capable de détecter son orientation.</p>
<p>Imaginons une balle dans un jardin&nbsp;:</p>
<pre class="brush: html">
&lt;div class="jardin"&gt;
  &lt;div class="balle"&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;pre class="resultat"&gt;&lt;/pre&gt;
</pre>
<p>Ce jardin fait 200 pixels de long (Oui c'est un «&nbsp;petit&nbsp;» jardin&nbsp;!), et la balle est au centre&nbsp;:</p>
<pre class="brush: css">
.jardin {
  position: relative;
  width : 200px;
  height: 200px;
  border: 5px solid #CCC;
  border-radius: 10px;
}

.balle {
  position: absolute;
  top   : 90px;
  left  : 90px;
  width : 20px;
  height: 20px;
  background: green;
  border-radius: 100%;
}
</pre>
<p>Maintenant, on définit le déplacement de la balle en fonction de celui de l'appareil&nbsp;:</p>
<pre class="brush: js">
var jardin = document.querySelector('.jardin'),
    balle = document.querySelector('.balle'),
    resultat = document.querySelector('.resultat'),
    maxX = jardin.clientWidth  - balle.clientWidth,
    maxY = jardin.clientHeight - balle.clientHeight;

function handleOrientation(event) {
  var x = event.beta,  // En degré sur l'interval [-180,180].
      y = event.gamma; // En degré sur l'interval [-90,90].

  resultat.innerHTML  = "beta : " + x + "&lt;br /&gt;";
  resultat.innerHTML += "gamma: " + y + "&lt;br /&gt;";

  // Parce-que l'on ne veut pas avoir l'appareil à l'envers.
  // On restreint les valeurs de x à l'intervalle [-90,90].
  if (x &gt;  90) { x =  90};
  if (x &lt; -90) { x = -90};
  // Pour rendre le calcul plus simple.
  // On délimite l'intervalle de x et y sur [0, 180].
  x += 90;
  y += 90;

  // 10 est la moitié de la taille de la balle.
  // Cela centre le point de positionnement au centre de la balle.

  balle.style.top  = (maxX * x / 180 - 10) + "px";
  balle.style.left = (maxY * y / 180 - 10) + "px";
}

window.addEventListener('deviceorientation', handleOrientation);
</pre>
<p>Et voici le résultat en temps réel&nbsp;:</p>
<div>
  {{EmbedLiveSample('Orientation_example', '230', '260')}}</div>
<div class="warning">
  <p><strong>Attention :</strong> Chrome et Firefox ne gèrent pas les angles de la même façon, certaines directions sur les axes sont inversées.</p>
</div>
<h2 id="Traiter_les_.C3.A9v.C3.A9nement_de_mouvement">Traiter les événement de mouvement</h2>
<p>Les événements de mouvement gèrent l'orientation de la même façon à l'exception près qu’ils portent un nom d’événement différent&nbsp;: {{event("devicemotion")}}</p>
<pre class="brush: js">
window.addEventListener("devicemotion", <em>handleMotion</em>, true);
</pre>
<p>Ce qui change réellement est l'information fournie par l'objet {{ domxref("DeviceMotionEvent") }} passée comme paramètre par la fonction <em>HandleMotion</em>.</p>
<p>Les événements de mouvement contiennent quatre propriétés&nbsp;:</p>
<ul>
  <li>{{domxref("DeviceMotionEvent.acceleration")}}</li>
  <li>{{domxref("DeviceMotionEvent.accelerationIncludingGravity")}}</li>
  <li>{{domxref("DeviceMotionEvent.rotationRate")}}</li>
  <li>{{domxref("DeviceMotionEvent.interval")}}</li>
</ul>
<h3 id="Explication_des_valeurs_de_mouvement">Explication des valeurs de mouvement</h3>
<p>L'objet {{ domxref("DeviceMotionEvent") }} fourni aux développeurs Web des informations sur la vitesse de changement d'orientation et de position de l'appareil. Les changements rapportés sont fournis pour les trois axes (voir <a href="/en-US/docs/Web/Guide/DOM/Events/Orientation_and_motion_data_explained" title="/en-US/docs/Web/Guide/DOM/Events/Orientation_and_motion_data_explained">Orientation et déplacement expliquées</a> pour les détails).</p>
<p>Pour {{domxref("DeviceMotionEvent.acceleration","acceleration")}} et {{domxref("DeviceMotionEvent.accelerationIncludingGravity","accelerationIncludingGravity")}}, Les axes correspondent à&nbsp;:</p>
<ul>
  <li><code>x</code>&nbsp;: représente l'axe d'Ouest en Est&nbsp;;</li>
  <li><code>y</code>&nbsp;: représente l'axe Sud vers Nord&nbsp;:</li>
  <li><code>z</code>&nbsp;: représente l'axe perpendiculaire au sol.</li>
</ul>
<p>Pour {{domxref("DeviceMotionEvent.rotationRate","rotationRate")}}, c'est un peu différent. L'information correspond à :</p>
<ul>
  <li><code>alpha</code>&nbsp;: représente le ratio de rotation le long de l'axe perpendiculaire à l'écran (ou du clavier au bureau)&nbsp;;</li>
  <li><code>bêta</code>&nbsp;: représente le ratio de rotation le long de l'axe allant de la gauche vers la droite de l'écran (ou du clavier au bureau)&nbsp;;</li>
  <li><code>gamma</code>&nbsp;: représente le ratio de rotation le long de l'axe allant du bas vers le haut de l'écran (ou clavier vers le bureau).</li>
</ul>
<p>Au final, {{domxref("DeviceMotionEvent.interval","interval")}} représente l'intervalle de temps, en millisecondes, pour les données générées par l'appareil.</p>
<h2 id="Sp.C3.A9cifications">Spécifications</h2>
<table class="standard-table">
  <thead>
    <tr>
      <th scope="col">Spécification</th>
      <th scope="col">Statut</th>
      <th scope="col">Commentaires</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>{{SpecName('Device Orientation')}}</td>
      <td>{{Spec2('Device Orientation')}}</td>
      <td>Spécification initiale.</td>
    </tr>
  </tbody>
</table>
<h2 id="Compatibilit.C3.A9_des_navigateurs">Compatibilité des navigateurs</h2>
<p>{{CompatibilityTable()}}</p>
<div id="compat-desktop">
  <table class="compat-table">
    <tbody>
      <tr>
        <th>Fonctionnalité</th>
        <th>Chrome</th>
        <th>Firefox (Gecko)</th>
        <th>Internet Explorer</th>
        <th>Opera</th>
        <th>Safari (WebKit)</th>
      </tr>
      <tr>
        <td>{{domxref("DeviceOrientationEvent")}}</td>
        <td>7.0</td>
        <td>3.6<sup>[1]</sup><br />
          6</td>
        <td>{{CompatUnknown()}}</td>
        <td>{{CompatUnknown()}}</td>
        <td>{{CompatUnknown()}}</td>
      </tr>
      <tr>
        <td>{{domxref("DeviceMotionEvent")}}</td>
        <td>{{CompatVersionUnknown()}}</td>
        <td>6</td>
        <td>{{CompatUnknown()}}</td>
        <td>{{CompatUnknown()}}</td>
        <td>{{CompatUnknown()}}</td>
      </tr>
    </tbody>
  </table>
</div>
<div id="compat-mobile">
  <table class="compat-table">
    <tbody>
      <tr>
        <th>Fonctionnalité</th>
        <th>Android</th>
        <th>Firefox Mobile (Gecko)</th>
        <th>IE Phone</th>
        <th>Opera Mobile</th>
        <th>Safari Mobile</th>
      </tr>
      <tr>
        <td>{{domxref("DeviceOrientationEvent")}}</td>
        <td>3.0</td>
        <td>3.6<sup>[1]</sup><br />
          6</td>
        <td>{{ CompatNo() }}</td>
        <td>{{ CompatNo() }}</td>
        <td>4.2</td>
      </tr>
      <tr>
        <td>{{domxref("DeviceMotionEvent")}}</td>
        <td>{{ CompatVersionUnknown() }}</td>
        <td>6</td>
        <td>{{ CompatUnknown() }}</td>
        <td>{{ CompatUnknown() }}</td>
        <td>{{ CompatUnknown() }}</td>
      </tr>
    </tbody>
  </table>
</div>
<h3 id="Notes_d'implementation_pour_Gecko.C2.A0">Notes d'implementation pour Gecko&nbsp;</h3>
<ol>
  <li>Firefox 3.6, 4, et 5 supportent <a href="/en-US/DOM/MozOrientation" title="MozOrientation">mozOrientation </a>au lieu de l'événement standard {{domxref("DeviceOrientationEvent")}}.</li>
</ol>
<h2 id="Voir_aussi">Voir aussi</h2>
<ul>
  <li>{{domxref("DeviceOrientationEvent")}}</li>
  <li>{{domxref("DeviceMotionEvent")}}</li>
  <li>The legacy <code><a href="/en-US/DOM/MozOrientation" title="en-US/DOM/MozOrientation">MozOrientation</a></code> event.</li>
  <li><a href="/en-US/docs/Web/Guide/DOM/Events/Orientation_and_motion_data_explained" title="Orientation and motion data explained">Orientation and motion data explained</a></li>
  <li><a href="/en-US/docs/Web/Guide/DOM/Events/Using_device_orientation_with_3D_transforms" title="Using Deviceorientation In 3D Transforms">Using deviceorientation in 3D Transforms</a></li>
</ul>
Revenir à cette révision