Spec-Zone.ru › Web APIs

Обнаружение ориентации устройства

Безопасный контекст: Эта функция доступна только в безопасных контекстах (HTTPS), в некоторых или во всех поддерживающих браузерах.

Все более широкое распространение получили устройства с возможностью определения своей ориентации; то есть они могут сообщать данные, указывающие на изменения их ориентации относительно силы тяжести. В частности, портативные устройства, такие как мобильные телефоны, могут использовать эту информацию для автоматического поворота экрана, чтобы оставаться в вертикальном положении, предоставляя широкоэкранный вид веб-контента при повороте устройства так, что его ширина больше высоты.

Существуют два события JavaScript, обрабатывающие информацию об ориентации. Первое — DeviceOrientationEvent, которое отправляется, когда акселерометр обнаруживает изменение ориентации устройства. Получая и обрабатывая данные, сообщаемые этими событиями ориентации, можно интерактивно реагировать на изменения поворота и наклона, вызванные перемещением устройства пользователем.

Второе событие — DeviceMotionEvent, которое отправляется при добавлении изменения ускорения. Оно отличается от DeviceOrientationEvent тем, что следит за изменениями ускорения, а не ориентации. К сенсорам, которые обычно способны определять DeviceMotionEvent, относятся сенсоры ноутбуков для защиты движущихся накопителей. DeviceOrientationEvent чаще встречается в мобильных устройствах.

Обработка событий ориентации

Для начала получения изменений ориентации необходимо прослушать событие deviceorientation:

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

После регистрации обработчика события (в данном случае, JavaScript-функции с названием handleOrientation()) функция обработчика периодически вызывается с обновленными данными ориентации.

Событие ориентации содержит четыре значения:

  • DeviceOrientationEvent.absolute
  • DeviceOrientationEvent.alpha
  • DeviceOrientationEvent.beta
  • DeviceOrientationEvent.gamma

Функция обработчика события может выглядеть примерно так:

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

  // Do stuff with the new orientation data
}

Примечание: parallax — это полифилл для нормализации данных акселерометра и гироскопа на мобильных устройствах. Это полезно для преодоления некоторых различий в поддержке ориентации устройства различными устройствами.

Объяснение значений ориентации

Значение, отчётливое для каждой оси, указывает величину вращения вокруг данной оси по отношению к стандартной системе координат. Более подробное описание приведено в статье Объяснение данных ориентации и движения, которая суммирована ниже.

  • Значение DeviceOrientationEvent.alpha представляет движение устройства вокруг оси z, выраженное в градусах со значениями от 0 (включительно) до 360 (исключительно).
  • Значение DeviceOrientationEvent.beta представляет движение устройства вокруг оси x, выраженное в градусах со значениями от -180 (включительно) до 180 (исключительно). Это представляет переднее-заднее движение устройства.
  • Значение DeviceOrientationEvent.gamma представляет движение устройства вокруг оси y, выраженное в градусах со значениями от -90 (включительно) до 90 (исключительно). Это представляет лево-правовое движение устройства.

Пример ориентации

Этот пример будет работать в любом браузере, поддерживающем событие deviceorientation, и на устройстве, способном определить свою ориентацию.

Представьте себе мяч в саду:

<div class="garden">
  <div class="ball"></div>
</div>
Hold the device parallel to the ground. Rotate along its x and y axes to see the
ball move up/down and left/right respectively.
<pre class="output"></pre>

Этот сад имеет ширину 200 пикселей (да, он крошечный), и мяч находится в центре:

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

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

Теперь, если мы перемещаем устройство, мяч будет перемещаться соответственно:

const ball = document.querySelector(".ball");
const garden = document.querySelector(".garden");
const output = document.querySelector(".output");

const maxX = garden.clientWidth - ball.clientWidth;
const maxY = garden.clientHeight - ball.clientHeight;

function handleOrientation(event) {
  let x = event.beta; // In degree in the range [-180,180)
  let y = event.gamma; // In degree in the range [-90,90)

  output.textContent = `beta: ${x}\n`;
  output.textContent += `gamma: ${y}\n`;

  // Because we don't want to have the device upside down
  // We constrain the x value to the range [-90,90]
  if (x > 90) {
    x = 90;
  }
  if (x < -90) {
    x = -90;
  }

  // To make computation easier we shift the range of
  // x and y to [0,180]
  x += 90;
  y += 90;

  // 10 is half the size of the ball
  // It centers the positioning point to the center of the ball
  ball.style.left = `${(maxY * y) / 180 - 10}px`; // rotating device around the y axis moves the ball horizontally
  ball.style.top = `${(maxX * x) / 180 - 10}px`; // rotating device around the x axis moves the ball vertically
}

window.addEventListener("deviceorientation", handleOrientation);

Нажмите здесь, чтобы открыть этот пример в новом окне; так как deviceorientation не работает в кросс-доменном <iframe> во всех браузерах.

Обработка событий движения

События движения обрабатываются так же, как и события ориентации, за исключением того, что у них есть собственное имя события: devicemotion

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

На самом деле, изменилась информация, предоставленная в объекте DeviceMotionEvent, переданном как параметр обработчика события (handleMotion() в нашем примере).

Событие движения содержит четыре свойства:

  • DeviceMotionEvent.acceleration
  • DeviceMotionEvent.accelerationIncludingGravity
  • DeviceMotionEvent.rotationRate
  • DeviceMotionEvent.interval

Объяснение значений движения

Объекты DeviceMotionEvent предоставляют разработчикам веб-приложений информацию о скорости изменения положения и ориентации устройства. Изменения предоставляются вдоль трех осей (подробнее см. статью Объяснение данных ориентации и движения).

Для acceleration и accelerationIncludingGravity, эти оси соответствуют следующему:

x

Представляет ось с запада на восток

y

Представляет ось с юга на север

z

Представляет ось, перпендикулярную земле

Для rotationRate, ситуация немного иная; информация в каждом случае соответствует следующему:

alpha

Представляет скорость вращения вдоль оси, перпендикулярной экрану (или клавиатуре для настольных компьютеров).

beta

Представляет скорость вращения вдоль оси, идущей слева направо по плоскости экрана (или клавиатуры для настольных компьютеров).

gamma

Представляет скорость вращения вдоль оси, идущей снизу вверх по плоскости экрана (или клавиатуры для настольных компьютеров).

Наконец, interval представляет интервал времени в миллисекундах, в течение которого данные получаются от устройства.

Спецификации

Спецификация
Ориентация и движение устройства
# devicemotion
Ориентация и движение устройства
# deviceorientation

Совместимость с браузерами

Рабочий стол Мобильный телефон
Chrome Edge Firefox Opera Safari Chrome Android Firefox для Android Opera Android Safari в IOS Samsung Internet WebView Android
DeviceOrientationEvent 59 14 17 46 Нет 59 17 43 Нет 7.0 59
Detecting_device_orientation
7До версии 50 Chrome предоставлял абсолютные значения вместо относительных для этого события. Разработчики, которым по-прежнему нужны абсолютные значения, могут использовать событие deviceorientationabsolute.
12
6Firefox 3.6, 4 и 5 поддерживали mozOrientation вместо стандартного интерфейса DeviceOrientationEvent.
15 17
18До версии 50 Chrome Android предоставлял абсолютные значения вместо относительных для этого события. Разработчики, которым по-прежнему нужны абсолютные значения, могут использовать событие deviceorientationabsolute.
6Firefox для Android 4.6, 4 и 5 поддерживали mozOrientation вместо стандартного интерфейса DeviceOrientationEvent.
14 4.2
1.0До Samsung Internet 5.0, Samsung Internet предоставлял абсолютные значения вместо относительных для этого события. Разработчики, которым по-прежнему нужны абсолютные значения, могут использовать событие deviceorientationabsolute.
3До версии 50 Chrome предоставлял абсолютные значения вместо относительных для этого события. Разработчики, которым по-прежнему нужны абсолютные значения, могут использовать событие deviceorientationabsolute.
absolute 7 12 6 15 17 18 6 14 Нет 1.0 4.4
alpha 7 12 6 15 17 18 6 14 4.2 1.0 3
beta 7 12 6 15 17 18 6 14 4.2 1.0 3
gamma 7 12 6 15 17 18 6 14 4.2 1.0 3
requestPermission_static Нет Нет Нет Нет Нет Нет Нет Нет 14.5 Нет Нет
Рабочий стол Мобильный телефон
Chrome Edge Firefox Opera Safari Chrome Android Firefox для Android Opera Android Safari в IOS Samsung Internet WebView Android
DeviceMotionEvent 59 14 29 46 Нет 59 29 43 Нет 7.0 59
Detecting_device_orientation 31 12 6 18 17 31 6 18 4.2 2.0 4.4.3
acceleration 31 12 6 18 17 31 6 18 4.2 2.0 4.4.3
accelerationIncludingGravity 31 12 6 18 17 31 6 18 4.2 2.0 4.4.3
interval 31 12 6 18 17 31 6 18 4.2 2.0 4.4.3
requestPermission_static Нет Нет Нет Нет Нет Нет Нет Нет 14.5 Нет Нет
rotationRate 31 12 6 18 17 31 6 18 4.2 2.0 4.4.3

api.DeviceMotionEvent

Таблицы BCD загружаются только в браузере

api.DeviceOrientationEvent

Таблицы BCD загружаются только в браузере

См. также

  • DeviceOrientationEvent
  • DeviceMotionEvent
  • Описание ориентации и данных о движении
  • Использование deviceorientation в 3D-преобразованиях
  • Игра Cyber Orb: лабиринт в 2D с ориентацией устройства

© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/Device_orientation_events/Detecting_device_orientation

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API