Increasingly, web-enabled devices are capable of determining their orientation; that is, they can report data indicating changes to their orientation with relation to the pull of gravity. In particular, hand-held devices such as mobile phones can use this information to automatically rotate the display to remain upright, presenting a wide-screen view of the web content when the device is rotated so that its width is greater than its height.
There are two JavaScript events that handle orientation information. The first one is the DeviceOrientationEvent, which is sent when the accelerometer detects a change to the orientation of the device. By receiving and processing the data reported by these orientation events, it's possible to interactively respond to rotation and elevation changes caused by the user moving the device.
The second event is the DeviceMotionEvent, which is sent when a change in acceleration was added. It is different from the DeviceOrientationEvent because it is listening for changes in acceleration as opposed to orientation. Sensors that are commonly capable of detecting DeviceMotionEvent include sensors in laptops to protect moving storage devices. DeviceOrientationEvent is more commonly found in mobile devices.
Processing orientation events
All you need to do in order to begin receiving orientation change is to listen to the deviceorientation event:
Note:parallax is a polyfill for normalizing the accelerometer and gyroscope data on mobile devices. This is useful for overcoming some of the differences in device support for device orientation.
After registering your event listener (in this case, a JavaScript function called handleOrientation()), your listener function periodically gets called with updated orientation data.
The event handler function can look something like this:
js
functionhandleOrientation(event){const absolute = event.absolute;const alpha = event.alpha;const beta = event.beta;const gamma = event.gamma;// Do stuff with the new orientation data}
Orientation values explained
The value reported for each axis indicates the amount of rotation around a given axis in reference to a standard coordinate frame. These are described in greater detail in the Orientation and motion data explained article which is summarized below.
The DeviceOrientationEvent.alpha value represents the motion of the device around the z axis, represented in degrees with values ranging from 0 (inclusive) to 360 (exclusive).
The DeviceOrientationEvent.beta value represents the motion of the device around the x axis, represented in degrees with values ranging from -180 (inclusive) to 180 (exclusive). This represents a front to back motion of the device.
The DeviceOrientationEvent.gamma value represents the motion of the device around the y axis, represented in degrees with values ranging from -90 (inclusive) to 90 (exclusive). This represents a left to right motion of the device.
Orientation example
This example will work on any browser supporting the deviceorientation event and running on a device able to detect its orientation.
Now, if we move our device, the ball will move accordingly:
js
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;functionhandleOrientation(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 center the positioning point to the center of the ball
ball.style.top =`${(maxY * y)/180-10}px`;
ball.style.left =`${(maxX * x)/180-10}px`;}
window.addEventListener("deviceorientation", handleOrientation);
The DeviceMotionEvent objects provide web developers with information about the speed of changes for the device's position and orientation. The changes are provided along three axis (see Orientation and motion data explained for details).
7Before version 50, Chrome provided absolute values instead of relative values for this event. Developers still needing absolute values may use the deviceorientationabsolute event.
12
6Firefox 3.6, 4, and 5 supported mozOrientation instead of the standard DeviceOrientationEvent interface.
11
15
17
3Before version 50, Chrome provided absolute values instead of relative values for this event. Developers still needing absolute values may use the deviceorientationabsolute event.
18Before version 50, Chrome provided absolute values instead of relative values for this event. Developers still needing absolute values may use the deviceorientationabsolute event.
6Firefox 3.6, 4, and 5 supported mozOrientation instead of the standard DeviceOrientationEvent interface.
14
4.2
1.0Before Samsung Internet 5.0, Samsung Internet provided absolute values instead of relative values for this event. Developers still needing absolute values may use the deviceorientationabsolute event.