设备方向与运动

W3C 候选推荐标准草案,

关于本文档的更多详情
此版本:
https://www.w3.org/TR/2026/CRD-orientation-event-20261026/
最新发布版本:
https://www.w3.org/TR/orientation-event/
编辑草案:
https://w3c.github.io/deviceorientation/
先前版本:
历史:
https://www.w3.org/standards/history/orientation-event/
反馈:
public-device-apis@w3.org 主题行请包含“[orientation-event] … 消息主题 …”(存档)
设备方向和运动存储库
实现报告:
https://wpt.fyi/results/orientation-event
编辑:
Reilly Grant (Google LLC)
Marcos Cáceres (Apple Inc.)
前任编辑:
Raphael Kubo da Costa (Intel Corporation)
Rich Tibbett (Opera Software ASA)
Tim Volodine (Google Inc)
Steve Block (Google Inc,任期至 2012 年 7 月)
Andrei Popescu (Google Inc,任期至 2012 年 7 月)

摘要

本规范定义了表示托管设备物理方向和运动的事件。这些事件为Web应用程序提供了访问方向和运动数据的能力。该规范旨在对这些数据的底层来源保持中立,旨在实现不同环境之间的互操作性。

本文档的状态

本节描述了本文档在发布时间的状态。当前W3C出版物的列表以及此技术报告的最新修订版本可在 W3C技术报告索引 中找到。

本文档由 设备和传感器工作组 和 Web 应用工作组 作为候选推荐标准草案发布,采用推荐标准流程。 本文档旨在成为 W3C 推荐标准。

如果您希望对本文档提出意见,请在规范存储库中提交问题。

作为候选推荐标准发布并不意味着 W3C 及其成员的认可。候选推荐标准草案整合了 先前候选推荐标准中的更改,工作组打算将这些更改包含在 后续的候选推荐标准快照中。这是一份草案文件, 随时可能被其他文件更新、替换或废弃。 将本文档作为正在进行的工作以外的内容引用是不合适的。

本文档进入提议推荐标准阶段的准入标准是 至少有两个独立且可互操作的用户代理 实现本规范的所有功能,这将通过 工作组开发的测试套件中定义的用户代理测试来确定。工作组将准备一份实施报告以跟踪 进展。

本文档由在 W3C 专利政策下运作的小组制作。 W3C 维护一份与每个小组的可交付成果相关的任何专利披露的公开列表(设备和传感器)和 一份与每个小组的可交付成果相关的任何专利披露的公开列表(Web 应用); 这些页面还包括披露专利的说明。 任何实际知晓某项专利,并认为该专利包含基本权利要求的个人,必须按照 W3C 专利政策第 6 节的规定披露该信息。

有关一般工作组公告、管理事务和非技术事宜, 请发送电子邮件至 public-device-apis@w3.org(订阅,存档) 或 public-webapps@w3.org(订阅,存档)。

本文档受 2025 年 8 月 18 日 W3C 流程文档的约束。

自候选推荐标准发布以来的新功能包括权限策略和 API 的集成,现在需要通过 requestPermission() 明确获得用户同意才能访问设备方向数据。已更新坐标系说明和精度要求,以降低被动指纹识别风险。deviceorientationabsolute 事件的引入增强了需要绝对方向数据的应用程序(标记为存在风险)。接口现在仅在安全上下文中可用,并且安全和隐私注意事项已成为规范性内容。该规范现在还提供了一种自动化测试此 API 的方法(标记为存在风险)。有关更多信息,请参阅 § 10 变更部分。

1. 简介

本节是非规范性的。

本规范提供了两个新的DOM事件,用于获取托管设备的物理方向和运动信息。事件提供的信息不是原始传感器数据,而是与信息来源无关的高级数据。常见的信息来源包括陀螺仪、指南针和加速度计。

deviceorientation 事件表示设备的物理方向,表达为相对于局部坐标系的一系列旋转。

devicemotion 事件表示设备的加速度,以设备定义的坐标系中的笛卡尔坐标表示。它还提供了设备相对于局部坐标系的旋转速率。尽可能实际情况下,事件应提供设备质心的加速度。

以下代码示例说明了事件的基本使用。

注册接收 deviceorientation 事件:
window.addEventListener("deviceorientation", event => {
  // 处理 event.alpha, event.beta 和 event.gamma
});

// 或者...
window.ondeviceorientation = event => {
  // 处理 event.alpha, event.beta 和 event.gamma
};
设备平放在水平表面上,屏幕顶部指向西方,具有以下方向:
{
  alpha: 90,
  beta: 0,
  gamma: 0
};

要获取指南针方向,只需将alpha 从360度中减去。随着设备在水平表面上旋转,指南针方向为(360 - alpha)。

用户手持设备,屏幕处于垂直平面,屏幕顶部向上。beta 的值为90,而 alpha 和 gamma 的值则不受影响。
用户面朝alpha度的指南针方向,手持设备,屏幕处于垂直平面,屏幕顶部向右。设备的方向为:
{
  alpha: 270 - alpha,
  beta: 0,
  gamma: 90
};
注册接收 devicemotion 事件:
window.addEventListener("devicemotion", (event) => {
  // 处理 event.acceleration, event.accelerationIncludingGravity,
  // event.rotationRate 和 event.interval
});

// 或者...
window.ondevicemotion = (event) => {
  // 处理 event.acceleration, event.accelerationIncludingGravity,
  // event.rotationRate 和 event.interval
};
设备平放在水平表面上,屏幕朝上,acceleration 为零,accelerationIncludingGravity 的值如下:
{
  x: 0,
  y: 0,
  z: 9.8
};
设备在自由落体状态下,屏幕水平且朝上,accelerationIncludingGravity 为零,且加速度的值如下:
{
  x: 0,
  y: 0,
  z: -9.8
};
设备安装在车辆中,屏幕处于垂直平面,顶部朝上并面向车尾。车辆以速度v行驶,在半径为r的右转弯中。设备记录了acceleration 和accelerationIncludingGravity的正x分量。设备还记录了rotationRate.gamma的负值:
{
  acceleration: {x: v^2/r, y: 0, z: 0},
  accelerationIncludingGravity: {x: v^2/r, y: 9.8, z: 0},
  rotationRate: {alpha: 0, beta: 0, gamma: -v/r*180/pi}
};

2. 范围

本节是非规范性的。

本规范的范围包括表示托管设备物理方向和运动的事件。超出范围的包括用于操作方向数据的实用工具(如变换库)以及提供访问原始传感器数据或直接与这些传感器接口的方法。

3. 模型

3.1. 设备方向

本规范将设备的物理方向表示为相对于实现定义参考坐标系的一系列旋转。

旋转步骤的顺序是一组Z - X' - Y''类型的固有Tait-Bryan角度([EULERANGLES]),这些角度应用于在设备坐标系中定义的系统,定义见[ACCELEROMETER],如下所示:

对于手机或平板电脑等移动设备,设备坐标系相对于屏幕的标准方向定义,通常为竖屏。这意味着像键盘这样的滑出元件未展开,像显示器这样的旋转元件被折叠到默认位置。

如果设备旋转或滑出键盘时屏幕的方向发生变化,这不会影响坐标系相对于设备的方向。

对于笔记本电脑,设备坐标系相对于内置键盘定义。

注意: 开发人员希望检测屏幕方向变化可以参考[SCREEN-ORIENTATION]。

旋转使用右手定则,这意味着沿轴的正方向看时,围绕轴的正旋转是顺时针方向。

注意: 本规范使用的坐标系与CSS Transforms 2 § 4 变换渲染模型中的不同,后者的y轴正方向为底部,旋转遵循左手定则。 此外,rotateSelf() 和rotate() 在[GEOMETRY-1]中指定的旋转顺序为Z - Y' - X'',与此处指定的顺序不同。

由alpha、beta 和gamma 表示的旋转通过以下步骤进行:

  1. 将设备坐标系围绕其z轴旋转alpha度,alpha的取值范围为[0, 360)。

    初始方向
    设备处于初始位置,参考坐标系(XYZ)和设备坐标系(xyz)对齐。
    围绕z轴旋转
    设备围绕z轴旋转角度alpha,x轴和y轴的先前位置分别标为x0和y0。
  2. 将设备坐标系围绕其x轴旋转beta度,beta的取值范围为[-180, 180)。

    围绕x轴旋转
    设备围绕新的x轴旋转角度beta,y轴和z轴的先前位置分别标为y0和z0。
  3. 将设备坐标系围绕其y轴旋转gamma度,gamma的取值范围为[-90, 90)。

    围绕y轴旋转
    设备围绕新的y轴旋转角度gamma,x轴和z轴的先前位置分别标为x0和z0。

注意: 这种角度选择遵循数学惯例,但意味着alpha与指南针方向相反。这也意味着这些角度与车辆动力学中使用的滚-俯-偏航惯例不匹配。

3.1.1. 参考坐标系的选择

设备的方向始终相对于另一个坐标系,该坐标系的选择会影响方向传递的信息类型以及方向数据的来源。

相对设备方向 通过加速度计和陀螺仪测量,参考坐标系是任意的。因此,方向数据提供了相对于设备初始位置的变化信息。

注意: 在本地平台术语中,这类似于Windows上的相对OrientationSensor, Android上的游戏旋转矢量传感器,或Core Motion中的xArbitraryZVertical选项。

绝对方向 通过加速度计、陀螺仪和磁力计测量,参考坐标系是地球参考坐标系。

注意: 在本地平台术语中,这类似于Windows上的绝对OrientationSensor, Android上的旋转矢量传感器,或Core Motion中的xMagneticNorthZVertical选项。

3.2. 设备运动

本规范通过测量设备的加速度和旋转速率来表示设备在空间中的运动,这些数据通过加速度计和陀螺仪获取。数据是相对于前一节中总结的设备坐标系提供的。

加速度是设备相对于时间的速度变化率,单位是米每秒平方(m/s2)。

线性设备加速度 表示设备不受重力影响的加速度率。当设备平放在桌面上时,其线性加速度为0 m/s2。

当包含重力的加速度时,其值包含重力的影响,并表示实际加速度([PROPERACCELERATION])。当设备处于自由落体状态时,加速度为0 m/s2。这在许多应用中不太有用,但作为一种为无法提供线性加速度(例如,由于缺乏陀螺仪)的实现提供尽力支持的方式。

注意: 实际上,包含重力的加速度代表了从运动传感器解释器§ 加速度计中获取的原始读数,或[G-FORCE], 而线性加速度则提供了运动传感器解释器§ 线性加速度传感器的读数,并且可能是融合传感器。[MOTION-SENSORS] 和[ACCELEROMETER] 都包含有关可测量的不同类型加速度计和加速度的更详细讨论。

旋转速率 测量设备绕设备坐标系中指定轴的旋转速率。与设备方向一样,旋转必须使用右手定则,这意味着沿轴正方向看时,围绕轴的正旋转为顺时针方向。旋转速率以每秒度(deg/s)为单位测量。

注意: [MOTION-SENSORS] 和[GYROSCOPE] 都包含有关陀螺仪、旋转速率和测量的更详细讨论。

4. 权限

由于风险较高,DeviceMotionEvent.requestPermission()和DeviceOrientationEvent.requestPermission()测试的通过率较低,因此该集成面临风险。

本规范是强大功能,因此定义了以下权限,这些权限是具有给定策略控制功能的默认允许列表:

注意: 哪些事件会分发取决于哪些权限已经授予:

5. 任务来源

任务来源,如本规范中提到的任务,是设备运动和方向任务来源。

6. API

6.1. deviceorientation 事件

partial interface Window {
    [SecureContext] attribute EventHandler ondeviceorientation;
};

[Exposed=Window, SecureContext]
interface DeviceOrientationEvent : Event {
    constructor(DOMString type, optional DeviceOrientationEventInit eventInitDict = {});
    readonly attribute double? alpha;
    readonly attribute double? beta;
    readonly attribute double? gamma;
    readonly attribute boolean absolute;

    static Promise<PermissionState> requestPermission(optional boolean absolute = false);
};

dictionary DeviceOrientationEventInit : EventInit {
    double? alpha = null;
    double? beta = null;
    double? gamma = null;
    boolean absolute = false;
};

ondeviceorientation 属性是一个 事件处理程序 IDL 属性,用于 ondeviceorientation 事件处理程序,其 事件处理程序事件类型 是 deviceorientation。

alpha 属性必须返回初始化的值。它表示围绕 Z 轴的旋转,使用在 § 3.1 设备方向 中描述的 Z - X' - Y'' 内在 Tait-Bryan 角度。

beta 属性必须返回初始化的值。它表示围绕 X' 轴的旋转(在 Z 轴旋转之后应用),使用在 § 3.1 设备方向 中描述的 Z - X' - Y'' 内在 Tait-Bryan 角度。

gamma 属性必须返回初始化的值。它表示围绕 Y'' 轴的旋转(按照此顺序应用 Z 和 X' 轴的旋转),使用在 § 3.1 设备方向 中描述的 Z - X' - Y'' 内在 Tait-Bryan 角度。

absolute 属性必须返回初始化的值。它表示是提供 相对方向数据还是绝对方向数据。

requestPermission(absolute) 方法的步骤如下:
  1. 令 global 为 当前全局对象。

  2. 如果this 的 相关全局对象具有瞬时激活,则令 hasTransientActivation 为 true,否则为 false。

  3. 令 promise 为 一个新的 promise,在this 的相关领域中。

  4. 令 permissions 为 « "accelerometer","gyroscope" »。

  5. 如果 absolute 为 true,附加 "magnetometer" » 到 permissions。

  6. 并行执行以下步骤:

    1. 对每个 name 在 permissions 中:

      1. 如果 name 的权限状态为 "prompt",并且 hasTransientActivation 为 false:

        1. 在设备运动和方向任务来源上队列一个全局任务,给定 global 来拒绝 promise,原因为 "NotAllowedError" DOMException。

        2. 返回。

    2. 令 permissionState 为 "granted"。

    3. 对每个 name 在 permissions 中:

      注意: 没有同时请求多个权限的算法。但是,建议用户代理将不同类型的媒体的并发请求合并为单个用户界面权限提示。

      1. 如果请求使用权限name 的结果不是 "granted":

        1. 将 permissionState 设置为 "denied"。

        2. 终止。

    4. 在设备运动和方向任务来源上队列一个全局任务,给定 global 来解决 promise,并返回 permissionState。

  7. 返回 promise。

为了 触发一个方向事件,给定 DOMString 的 event,Window 的 window 和 boolean 的 absolute:
  1. 令 orientation 为 null。

  2. 令 topLevelTraversable 为 window 的 可导航 的 顶层遍历。

  3. 如果 absolute 为 false,则将 virtualSensorType 设置为 "relative-orientation",否则设置为 "absolute-orientation"。

  4. 如果 topLevelTraversable 的 虚拟传感器映射 包含 virtualSensorType:

    1. 令 virtualSensor 为 topLevelTraversable 的 虚拟传感器映射[virtualSensorType]。

    2. 如果 virtualSensor 的 可以提供读数的标志 为 true:

      1. 将 orientation 设置为通过虚拟传感器提供的最新读数,并使用 "alpha", "beta", 和 "gamma" 键。

  5. 否则:

    1. 如果 absolute 为 false:

      1. 将 orientation 设置为设备在三维平面内的 相对方向。

    2. 否则:

      1. 将 orientation 设置为设备在三维平面内的 绝对方向。

  6. 令 permissions 为 null。

  7. 如果 absolute 为 false:

    1. 将 permissions 设置为 « "accelerometer","gyroscope" »。

  8. 否则:

    1. 将 permissions 设置为 « "accelerometer","gyroscope","magnetometer" »。

  9. 令 environment 为 window 的 相关设置对象。

  10. 并行执行以下步骤:

    1. 对每个 permission 在 permissions 中:

      1. 令 state 为 获取当前权限状态 的结果,使用 permission 和 environment。

      2. 如果 state 不是 "granted",则返回。

    2. 在设备运动和方向任务来源上队列一个全局任务,给定 window,以执行以下步骤:

      1. 令 z 为 orientation 在 Z - X' - Y'' 的内在 Tait-Bryan 角度表示,沿 Z 轴,或如果实现无法提供角度值,则为 null。

      2. 如果 z 不是 null,将 z 的精度限制为 0.1 度。

      3. 令 x 为 orientation 在 Z - X' - Y'' 的内在 Tait-Bryan 角度表示,沿 X' 轴,或如果实现无法提供角度值,则为 null。

      4. 如果 x 不是 null,将 x 的精度限制为 0.1 度。

      5. 令 y 为 orientation 在 Z - X' - Y'' 的内在 Tait-Bryan 角度表示,沿 Y'' 轴,或如果实现无法提供角度值,则为 null。

      6. 如果 y 不是 null,将 y 的精度限制为 0.1 度。

      7. 触发事件,命名为 event,在 window 上,使用 DeviceOrientationEvent,并将 alpha 属性初始化为 z,beta 属性初始化为 x,gamma 属性初始化为 y,并将 absolute 属性初始化为 absolute。

方向的显著变化 表示与之前的方向值相比发生了变化,从而触发 deviceorientation 或 deviceorientationabsolute 事件。 确定是否发生 显著方向变化 的过程是 实现定义 的,建议最大变化阈值为 1 度。 如果页面的数据不足够新,实施可能也会认为已经发生了变化。

注意: 实现必须考虑 § 9 自动化,以确定是否发生了 显著方向变化,以便虚拟传感器读取更新时触发相应的评估。

每当发生 显著方向变化 时,用户代理必须在 可导航对象 的 活动窗口 window 上执行以下步骤:
  1. 令 document 为 window 的 关联的文档。

  2. 如果 document 的 可见性状态 不是 "visible",则返回。

  3. 令 absolute 为 false。

  4. 令 features 为 « "accelerometer","gyroscope" »。

  5. 如果实现无法提供 相对方向,或者生成的 绝对方向 数据更准确:

    1. 将 absolute 设置为 true。

    2. 追加 "magnetometer" 到 features。

  6. 遍历 features 中的每个 feature:

    1. 如果 document 不被 允许使用 feature,则返回。

  7. 触发方向事件,使用 deviceorientation、window 和 absolute。

如果实现永远无法提供方向信息,则应触发事件,并将 alpha、beta 和 gamma 属性设置为 null,并将 absolute 属性设置为 false。

6.2. deviceorientationabsolute 事件

deviceorientationabsolute 事件及其 ondeviceorientationabsolute 事件处理程序 IDL 属性由于实现经验有限而存在风险。
partial interface Window {
                [SecureContext] attribute EventHandler ondeviceorientationabsolute;
            };
            

ondeviceorientationabsolute 属性是 事件处理程序IDL属性,用于 ondeviceorientationabsolute 事件处理程序,其 事件处理程序事件类型 是 deviceorientationabsolute。

deviceorientationabsolute 事件与 deviceorientation 事件完全类似,只不过它必须始终提供 绝对方向 数据。

每当发生 显著方向变化 时,用户代理必须在 可导航对象 的 活动窗口 window 上执行以下步骤:
  1. 触发方向事件,使用 deviceorientationabsolute、window 和 true。

如果实现永远无法提供绝对方向信息,则应触发事件,并将 alpha、beta 和 gamma 属性设置为 null,并将 absolute 属性设置为 true。

6.3. devicemotion 事件

6.3.1. DeviceMotionEventAcceleration 接口

[Exposed=Window, SecureContext]
interface DeviceMotionEventAcceleration {
    readonly attribute double? x;
    readonly attribute double? y;
    readonly attribute double? z;
};

The DeviceMotionEventAcceleration 接口表示设备的加速度,如 § 3.2 设备运动 中所述。它包含以下相关数据:

x 轴加速度

设备沿 X 轴的加速度,或为 null。初始为 null。

y 轴加速度

设备沿 Y 轴的加速度,或为 null。初始为 null。

z 轴加速度

设备沿 Z 轴的加速度,或为 null。初始为 null。

The x getter 方法返回 this 对象的 x 轴加速度。

The y getter 方法返回 this 对象的 y 轴加速度。

The z getter 方法返回 this 对象的 z 轴加速度。

6.3.2. DeviceMotionEventRotationRate 接口

[Exposed=Window, SecureContext]
interface DeviceMotionEventRotationRate {
    readonly attribute double? alpha;
    readonly attribute double? beta;
    readonly attribute double? gamma;
};

The DeviceMotionEventRotationRate 接口表示设备的旋转速率,如 § 3.2 设备运动 中所述。它包含以下相关数据:

x 轴旋转速率

设备绕 X 轴的旋转速率,或为 null。初始为 null。

y 轴旋转速率

设备绕 Y 轴的旋转速率,或为 null。初始为 null。

z 轴旋转速率

设备绕 Z 轴的旋转速率,或为 null。初始为 null。

The alpha getter 方法返回 this 对象的 x 轴旋转速率。

The beta getter 方法返回 this 对象的 y 轴旋转速率。

The gamma getter 方法返回 this 对象的 z 轴旋转速率。

6.3.3. DeviceMotionEvent 接口

partial interface Window {
    [SecureContext] attribute EventHandler ondevicemotion;
};

[Exposed=Window, SecureContext]
interface DeviceMotionEvent : Event {
    constructor(DOMString type, optional DeviceMotionEventInit eventInitDict = {});
    readonly attribute DeviceMotionEventAcceleration? acceleration;
    readonly attribute DeviceMotionEventAcceleration? accelerationIncludingGravity;
    readonly attribute DeviceMotionEventRotationRate? rotationRate;
    readonly attribute double interval;

    static Promise<PermissionState> requestPermission();
};

dictionary DeviceMotionEventAccelerationInit {
    double? x = null;
    double? y = null;
    double? z = null;
};

dictionary DeviceMotionEventRotationRateInit {
    double? alpha = null;
    double? beta = null;
    double? gamma = null;
};

dictionary DeviceMotionEventInit : EventInit {
    DeviceMotionEventAccelerationInit acceleration;
    DeviceMotionEventAccelerationInit accelerationIncludingGravity;
    DeviceMotionEventRotationRateInit rotationRate;
    double interval = 0;
};

该 ondevicemotion 属性是一个 事件处理程序 IDL 属性,用于 ondevicemotion 事件处理程序,其 事件处理程序事件类型 是 devicemotion。

该 acceleration 属性必须返回其初始化的值。创建对象时,此属性必须被初始化为 null。它表示设备的 线性加速度。

该 accelerationIncludingGravity 属性必须返回其初始化的值。创建对象时,此属性必须被初始化为 null。它表示设备的 带重力的加速度。

该 rotationRate 属性必须返回其初始化的值。创建对象时,此属性必须被初始化为 null。它表示设备的 旋转速率。

该 interval 属性必须返回其初始化的值。它表示从底层硬件获取数据的时间间隔,必须以毫秒(ms)为单位。为了简化 Web 应用程序对数据的过滤,这个值是恒定的。

该 requestPermission() 方法的步骤为:
  1. 令 global 为 当前全局对象。

  2. 如果 this 的 相关全局对象拥有 瞬时激活,则令 hasTransientActivation 为 true,否则为 false。

  3. 令 result 为 一个新的 promise,位于 this 的 相关 Realm 中。

  4. 并行执行这些步骤 in parallel:

    1. 令 permissions 为 « "accelerometer", "gyroscope" »。

    2. 对于 permissions 中的每个 name:

      1. 如果 name 的 权限状态 为 "prompt" 且 hasTransientActivation 为 false:

        1. 在 设备运动与方向任务源 上排队一个全局任务,给定 global 来 拒绝 result,拒绝原因为 "NotAllowedError" DOMException。

        2. 返回。

    3. 将 permissionState 设为 "granted"。

    4. 对于 permissions 中的每个 name:

      注意: 没有一次请求多个权限的算法。然而,鼓励用户代理将不同种类的媒体的并发请求捆绑为单个用户界面的权限请求。

      1. 如果 请求使用权限 name 的结果不是 "granted":

        1. 将 permissionState 设为 "denied"。

        2. 中断。

    5. 在 设备运动与方向任务源 上排队一个全局任务,给定 global 来 解决 result,值为 permissionState。

  5. 返回 result。

在一个 实现定义的 时间间隔 interval 内,用户代理必须在 可导航 的 活动窗口 window 上执行以下步骤:
  1. 令 document 为 window 的 关联的文档。

  2. 如果 document 的 可见性状态 不是 "visible",则返回。

  3. 对于每个 « "accelerometer", "gyroscope" » 中的policy:

    1. 如果 document 不被 允许使用 名为 policy 的 策略控制功能,则返回。

  4. 令 topLevelTraversable 为 window 的 可导航 的 顶级可遍历。

  5. 令 platformLinearAcceleration 为 null。

  6. 如果 topLevelTraversable 的 虚拟传感器映射 包含 "linear-acceleration":

    1. 令 virtualSensor 为 topLevelTraversable 的 虚拟传感器映射["linear-acceleration"]。

    2. 如果 virtualSensor 的 能够提供读数标志 为 true,则将 platformLinearAcceleration 设置为 virtualSensor 提供的最新读数。

  7. 否则,如果实现能够提供 线性加速度:

    1. 将 platformLinearAcceleration 设置为设备沿 X、Y 和 Z 轴的 线性加速度。

  8. 令 acceleration 为 null。

  9. 如果 platformLinearAcceleration 不为 null:

    1. 将 acceleration 设置为一个 新的 DeviceMotionEventAcceleration 在 window 的 realm 中创建。

    2. 将 acceleration 的 x 轴加速度 设置为 platformLinearAcceleration 沿 X 轴的值,如果不能提供则为 null。

    3. 如果 acceleration 的 x 轴加速度 不为 null,将其精度限制为不超过 0.1 m/s2。

    4. 将 acceleration 的 y 轴加速度 设置为 platformLinearAcceleration 沿 Y 轴的值,如果不能提供则为 null。

    5. 如果 acceleration 的 y 轴加速度 不为 null,将其精度限制为不超过 0.1 m/s2。

    6. 将 acceleration 的 z 轴加速度 设置为 platformLinearAcceleration 沿 Z 轴的值,如果不能提供则为 null。

    7. 如果 acceleration 的 z 轴加速度 不为 null,将其精度限制为不超过 0.1 m/s2。

  10. 令 platformAccelerationIncludingGravity 为 null。

  11. 如果 topLevelTraversable 的 虚拟传感器映射 包含 "accelerometer":

    1. 令 virtualSensor 为 topLevelTraversable 的 虚拟传感器映射["accelerometer"]。

    2. 如果 virtualSensor 的 能够提供读数标志 为 true,则将 platformAccelerationIncludingGravity 设置为 virtualSensor 提供的最新读数。

  12. 否则,如果实现能够提供 带重力的加速度:

    1. 将 platformAccelerationIncludingGravity 设置为设备沿 X、Y 和 Z 轴的 线性加速度。

  13. 令 accelerationIncludingGravity 为 null。

  14. 如果 platformAccelerationIncludingGravity 不为 null:

    1. 将 accelerationIncludingGravity 设置为一个 新的 DeviceMotionEventAcceleration 在 window 的 realm 中创建。

    2. 将 accelerationIncludingGravity 的 x 轴加速度 设置为 platformAccelerationIncludingGravity 沿 X 轴的值,如果不能提供则为 null。

    3. 如果 accelerationIncludingGravity 的 x 轴加速度 不为 null,将其精度限制为不超过 0.1 m/s2。

    4. 将 accelerationIncludingGravity 的 y 轴加速度 设置为 platformAccelerationIncludingGravity 沿 Y 轴的值,如果不能提供则为 null。

    5. 如果 accelerationIncludingGravity 的 y 轴加速度 不为 null,将其精度限制为不超过 0.1 m/s2。

    6. 将 accelerationIncludingGravity 的 z 轴加速度 设置为 platformAccelerationIncludingGravity 在 Z 轴上的值,若无法提供则为 null。

    7. 如果 accelerationIncludingGravity 的 z 轴加速度 不为 null, 则将其精度限制为不超过 0.1 m/s2。

  15. 令 platformRotationRate 为 null。

  16. 如果 topLevelTraversable 的 虚拟传感器映射 包含 "gyroscope":

    1. 令 virtualSensor 为 topLevelTraversable 的 虚拟传感器映射["gyroscope"]。

    2. 如果 virtualSensor 的 能够提供读数标志 为 true,则将 platformRotationRate 设置为 virtualSensor 提供的最新读数。

  17. 否则,如果实现能够提供 旋转速率:

    1. 将 platformRotationRate 设置为设备沿 X、Y 和 Z 轴的 旋转速率。

  18. 令 rotationRate 为 null。

  19. 如果 platformRotationRate 不为 null:

    1. 将 rotationRate 设置为一个 新的 DeviceMotionEventRotationRate 在 window 的 realm 中创建。

    2. 将 rotationRate 的 x 轴旋转速率 设置为 platformRotationRate 沿 X 轴的值,如果不能提供则为 null。

    3. 如果 rotationRate 的 x 轴旋转速率 不为 null,将其精度限制为不超过 0.1 deg/s。

    4. 将 rotationRate 的 y 轴旋转速率 设置为 platformRotationRate 沿 Y 轴的值,如果不能提供则为 null。

    5. 如果 rotationRate 的 y 轴旋转速率 不为 null,将其精度限制为不超过 0.1 deg/s。

    6. 将 rotationRate 的 z 轴旋转速率 设置为 platformRotationRate 沿 Z 轴的值,如果不能提供则为 null。

    7. 如果 rotationRate 的 z 轴旋转速率 不为 null,将其精度限制为不超过 0.1 deg/s。

  20. 令 environment 为 window 的 相关设置对象。

  21. 并行执行这些步骤 in parallel:

    1. 对于 « "accelerometer", "gyroscope" » 中的每个 permission:

      1. 令 state 为使用 permission 和 environment 获取当前权限状态的结果。

      2. 如果 state 不是 "granted",则返回。

    2. 给定 window,在设备运动和方向任务源上排队一个全局任务,以运行以下步骤:

      1. 在 window 上使用 DeviceMotionEvent 触发一个名为 "devicemotion" 的事件,其中 acceleration 属性初始化为 acceleration,accelerationIncludingGravity 属性初始化为 accelerationIncludingGravity,rotationRate 属性初始化为 rotationRate,并且 interval 属性初始化为 interval。

如果实现永远无法提供运动信息,则应触发该事件,acceleration、 accelerationIncludingGravity 和 rotationRate 属性应设置为 null。

7. 安全和隐私注意事项

本规范中定义的 API 可以用于从硬件传感器(如加速度计、陀螺仪和磁力计)获取信息。提供的数据可能被视为敏感信息,可能成为恶意网页攻击的目标。加速度计、陀螺仪和磁力计的校准可能暴露有关特定传感器硬件的持久性细节 [SENSORID]。主要的攻击向量可以分为以下几类:

鉴于此,实施过程中可以考虑通过视觉指示器标示网页使用传感器的情况。此外,本规范要求用户通过 明确许可 来允许用户代理通过 requestPermission() API 调用提供设备运动和/或方向数据。

此外,为了最小化隐私风险,减少指纹识别和其他攻击的可能性,实施必须:

此外,实施这些项可能对移动设备的电池寿命产生积极影响。

进一步的实施经验 正在收集中,以确定最大采样频率的上限。

8. 可访问性注意事项

DeviceOrientation 事件提供了新的输入形式的机会,这可以为用户带来新的交互方式。为了确保尽可能多的人能够与您构建的体验进行交互,请考虑以下事项:

有两个用户需求可能会出现,通常由用户代理或底层操作系统管理。然而,考虑这些因素可能有助于您了解内容或应用的使用方式。

9. 自动化

此功能由于实现经验有限而存在风险。

本规范可能给测试作者带来挑战,因为这里定义的事件依赖于物理硬件的存在,而硬件读数无法轻易控制。

为了解决这一挑战,本文档基于 [WEBDRIVER2] 扩展命令 和 通用传感器 API § 9 自动化 所制定的基础设施。这种方式被优先选择,而不是开发带有单独扩展命令的全新独立基础设施,因为这两个规范之间存在显著重叠:不仅是测试 [GENERIC-SENSOR] 规范面临类似的挑战,许多派生的 API(例如 [GYROSCOPE])获取并提供了类似的信息。

本规范只要求实现支持 通用传感器 API § 9 自动化 章节,而不要求其接口和事件。

9.1. 设备方向自动化

对 deviceorientation 事件的自动化支持建立在表示加速度计、陀螺仪和(可选的)磁力计的虚拟传感器之上。

用户代理从平台获取的方向数据来自加速度计、陀螺仪和(可选的)磁力计。与运动数据不同的是,这些低级读数必须转换为 § 3.1 设备方向 中描述的欧拉角。此外,平台可能会为用户代理提供额外的 API,这些 API 已经执行了从原始加速度和旋转数据到欧拉角的部分转换。

因此,本规范定义了额外的 虚拟传感器类型,用于相对和方向数据的格式,而不是要求实现和自动化用户通过使用不同计量单位的低级虚拟传感器来提供方向读数。

9.1.1. 解析方向读数数据算法

为执行 解析方向读数数据 算法,给定一个 JSON Object parameters:
  1. 从 parameters 中通过 "alpha" 调用 获取属性,并将结果赋值给 alpha。

  2. 如果 alpha 不是一个 Number, 或其值为 NaN、+∞ 或 −∞,则返回 undefined。

  3. 如果 alpha 不在 [0, 360) 范围内,则返回 undefined。

  4. 从 parameters 中通过 "beta" 调用 获取属性,并将结果赋值给 beta。

  5. 如果 beta 不是一个 Number, 或其值为 NaN、+∞ 或 −∞,则返回 undefined。

  6. 如果 beta 不在 [-180, 180) 范围内,则返回 undefined。

  7. 从 parameters 中通过 "gamma" 调用 获取属性,并将结果赋值给 gamma。

  8. 如果 gamma 不是一个 Number, 或其值为 NaN、+∞ 或 −∞,则返回 undefined。

  9. 如果 gamma 不在 [-90, 90) 范围内,则返回 undefined。

  10. 返回一个新的 有序映射 «[ "alpha" → alpha, "beta" → beta, "gamma" → gamma ]»。

注意: 返回值是一个 有序映射,以避免依赖 传感器读数 的概念,来自 [GENERIC-SENSOR] 规范。对于上述算法的目的,它们应该是可互换的。

9.1.2. “绝对方向”虚拟传感器类型

每种类型的虚拟传感器元数据 元数据 映射 必须包含以下 条目:

键

"absolute-orientation"

值

一个 虚拟传感器元数据,其 读数解析算法 是 解析方向读数数据。

9.1.3. “相对方向”虚拟传感器类型

每种类型的虚拟传感器元数据 元数据 映射 必须包含以下 条目:

键

"relative-orientation"

值

一个 虚拟传感器元数据,其 读数解析算法 是 解析方向读数数据。

9.2. 设备运动自动化

用户代理从平台获取的运动数据来自加速度计和陀螺仪。本规范定义了与 [ACCELEROMETER] 和 [GYROSCOPE] 规范共享的某些 每种类型的虚拟传感器元数据 条目。

加速度计虚拟传感器用于向平台提供 带重力的加速度 数据。线性加速度虚拟传感器用于向平台提供 线性加速度 数据。陀螺仪虚拟传感器用于向平台提供 旋转速率 数据。

9.2.1. “加速度计”虚拟传感器类型

每种类型的虚拟传感器元数据 元数据 映射 必须包含以下 条目:

键

"accelerometer"

值

一个 虚拟传感器元数据,其 读数解析算法 是 解析 xyz 读数。

9.2.2. “线性加速度”虚拟传感器类型

每种类型的虚拟传感器元数据 元数据 映射 必须包含以下 条目:

键

"linear-acceleration"

值

一个 虚拟传感器元数据,其 读数解析算法 是 解析 xyz 读数。

9.2.3. “陀螺仪”虚拟传感器类型

每种类型的虚拟传感器元数据 元数据 映射 必须包含以下 条目:

键

"gyroscope"

值

一个 虚拟传感器元数据,其 读数解析算法 是 解析 xyz 读数。

A 示例

本节非规范性。

A.1 计算指南针方向

本节非规范性。

以下示例旨在帮助用户理解 DeviceOrientation 事件的使用。

简介 部分提供了一个使用 DeviceOrientation 事件在设备水平持有时获取指南针方向的示例。该示例展示了如何在设备屏幕垂直朝向用户时,确定用户面对的指南针方向。这一应用的例子可以是增强现实系统。

更准确地说,我们希望确定一个与设备屏幕垂直并指向屏幕后方的向量的水平分量的指南针方向。

如果 v 表示在旋转的设备体坐标系 xyz 中的该向量,则 v 如下所示。

v = [0; 0; -1]

绕 z 轴旋转引起的 v 的变换可以通过以下旋转矩阵表示。

Z = [cos(alpha) -sin(alpha) 0; sin(alpha) cos(alpha) 0; 0 0 1]

绕 x 轴旋转引起的 v 的变换可以通过以下旋转矩阵表示。

X = [1 0 0; 0 cos(beta) -sin(beta); 0 sin(beta) cos(beta)]

绕 y 轴旋转引起的 v 的变换可以通过以下旋转矩阵表示。

Y = [cos(gamma) 0 sin(gamma); 0 1 0; -sin(gamma) 0 cos(gamma)]

如果 R 表示设备在地球坐标系 XYZ 中的完整旋转矩阵,则由于初始体坐标系与地球对齐,R 如下所示。

R = ZXY = [[cos(alpha) cos(gamma)-sin(alpha) sin(beta) sin(gamma), -cos(beta) sin(alpha), cos(gamma) sin(alpha) sin(beta)+cos(alpha) sin(gamma)], [cos(gamma) sin(alpha)+cos(alpha) sin(beta) sin(gamma), cos(alpha) cos(beta), sin(alpha) sin(gamma)-cos(alpha) cos(gamma) sin(beta)], [-cos(beta) sin(gamma), sin(beta), cos(beta) cos(gamma)]]

如果 v' 表示在地球坐标系 XYZ 中的向量 v,则由于初始体坐标系与地球对齐,v' 如下所示。

v' = Rv v' = [-cos(alpha)sin(gamma)-sin(alpha)sin(beta)cos(gamma); -sin(alpha)sin(gamma)+cos(alpha)sin(beta)cos(gamma); -cos(beta)cos(gamma)]

指南针方向 θ 如下所示

theta = atan((v'_x)/(v'_y)) = atan((-cos(alpha)sin(gamma)-sin(alpha)sin(beta)cos(gamma))/(-sin(alpha)sin(gamma)+cos(alpha)sin(beta)cos(gamma)))

前提是 β 和 γ 不同时为零。

上面的指南针方向计算可以通过以下 JavaScript 表示,以在提供的参数已定义、非空且表示 absolute 值时返回正确的指南针方向。

var degtorad = Math.PI / 180; // 角度到弧度的转换

function compassHeading( alpha, beta, gamma ) {

  var _x = beta  ? beta  * degtorad : 0; // beta 值 
  var _y = gamma ? gamma * degtorad : 0; // gamma 值 
  var _z = alpha ? alpha * degtorad : 0; // alpha 值 

  var cX = Math.cos( _x ); 
  var cY = Math.cos( _y ); 
  var cZ = Math.cos( _z ); 
  var sX = Math.sin( _x ); 
  var sY = Math.sin( _y ); 
  var sZ = Math.sin( _z ); 

  // 计算 Vx 和 Vy 分量 
  var Vx = - cZ * sY - sZ * sX * cY; 
  var Vy = - sZ * sY + cZ * sX * cY; 

  // 计算指南针方向 
  var compassHeading = Math.atan( Vx / Vy ); 

  // 将指南针方向转换为完整的单位圆 
  if( Vy < 0 ) { 
    compassHeading += Math.PI;
  } else if( Vx < 0 ) { 
    compassHeading += 2 * Math.PI; 
  } 

  return compassHeading * ( 180 / Math.PI ); // 指南针方向(以度为单位) 

} 

作为一致性检查,如果我们设置 γ = 0,则

theta = atan(-sin(alpha)sin(beta)/cos(alpha)sin(beta)) = -alpha

与预期一致。

或者,如果我们设置 β = 90,则

theta = atan((-cos(alpha)sin(gamma)-sin(alpha)cos(gamma))/(-sin(alpha)sin(gamma)+cos(alpha)cos(gamma))) theta = atan(-sin(alpha+gamma)/cos(alpha+gamma)) = -(alpha+gamma)

与预期一致。

A.2 替代设备方向表示法

本节非规范性。

使用泰特-布莱恩角描述方向可能存在一些缺点,例如引入万向节锁[GIMBALLOCK]。根据具体应用的不同,将设备方向值转换为其他旋转表示可能会更有用。

第一种替代方向表示法使用旋转矩阵。通过结合上面示例中提供的分量旋转矩阵,我们可以将设备体坐标系的方向表示为一个组合旋转矩阵。

如果 R 表示设备在地球坐标系 XYZ 中的旋转矩阵,那么由于初始体坐标系与地球对齐,R 如下所示。

R = ZXY = [[cos(alpha) cos(gamma)-sin(alpha) sin(beta) sin(gamma), -cos(beta) sin(alpha), cos(gamma) sin(alpha) sin(beta)+cos(alpha) sin(gamma)], [cos(gamma) sin(alpha)+cos(alpha) sin(beta) sin(gamma), cos(alpha) cos(beta), sin(alpha) sin(gamma)-cos(alpha) cos(gamma) sin(beta)], [-cos(beta) sin(gamma), sin(beta), cos(beta) cos(gamma)]]
上面的组合旋转矩阵可以在 JavaScript 中表示如下,前提是传入的参数已定义且不为 null,并表示absolute 值。
var degtorad = Math.PI / 180; // 角度到弧度的转换

function getRotationMatrix( alpha, beta, gamma ) {

  var _x = beta  ? beta  * degtorad : 0; // beta 值 
  var _y = gamma ? gamma * degtorad : 0; // gamma 值 
  var _z = alpha ? alpha * degtorad : 0; // alpha 值 

  var cX = Math.cos( _x ); 
  var cY = Math.cos( _y ); 
  var cZ = Math.cos( _z ); 
  var sX = Math.sin( _x ); 
  var sY = Math.sin( _y ); 
  var sZ = Math.sin( _z ); 

  // ZXY 旋转矩阵构建 

  var m11 = cZ * cY - sZ * sX * sY; 
  var m12 = - cX * sZ; 
  var m13 = cY * sZ * sX + cZ * sY; 

  var m21 = cY * sZ + cZ * sX * sY; 
  var m22 = cZ * cX; 
  var m23 = sZ * sY - cZ * cY * sX; 

  var m31 = - cX * sY; 
  var m32 = sX; 
  var m33 = cX * cY; 

  return [ 
    m11,    m12,    m13, 
    m21,    m22,    m23, 
    m31,    m32,    m33 
  ]; 

}; 

设备方向数据的另一种替代表示法是四元数[QUATERNIONS]。

如果 q 表示设备在地球坐标系 XYZ 中的单位四元数,那么由于初始体坐标系与地球对齐,q 如下所示。

q = [[q_w], [q_x], [q_y], [q_z]] = [[cos(beta)cos(gamma)cos(alpha) - sin(beta)sin(gamma)sin(alpha)], [sin(beta)cos(gamma)cos(alpha) - cos(beta)sin(gamma)sin(alpha)], [cos(beta)sin(gamma)cos(alpha) + sin(beta)cos(gamma)sin(alpha)], [cos(beta)cos(gamma)sin(alpha) + sin(beta)sin(gamma)cos(alpha)]]
上述四元数可以在 JavaScript 中表示如下,前提是传入的参数已定义、表示absolute 值且这些参数不为 null。
var degtorad = Math.PI / 180; // 角度到弧度的转换 

function getQuaternion( alpha, beta, gamma ) { 

  var _x = beta  ? beta  * degtorad : 0; // beta 值 
  var _y = gamma ? gamma * degtorad : 0; // gamma 值 
  var _z = alpha ? alpha * degtorad : 0; // alpha 值 

  var cX = Math.cos( _x/2 ); 
  var cY = Math.cos( _y/2 ); 
  var cZ = Math.cos( _z/2 ); 
  var sX = Math.sin( _x/2 ); 
  var sY = Math.sin( _y/2 ); 
  var sZ = Math.sin( _z/2 ); 

  // ZXY 四元数构建 

  var w = cX * cY * cZ - sX * sY * sZ; 
  var x = sX * cY * cZ - cX * sY * sZ; 
  var y = cX * sY * cZ + sX * cY * sZ; 
  var z = cX * cY * sZ + sX * sY * cZ; 

  return [ w, x, y, z ];

} 

我们可以使用拉格朗日的四平方定理检查是否正确构建了单位四元数

q_w^2 * q_x^2 * q_y^2 * q_z^2 = 1

如预期的那样。

致谢

Device Orientation 和 Motion 规范最初于 2016 年 8 月作为候选推荐标准发布,标题为 DeviceOrientation Event Specification,最初由Geolocation 工作组开发。该组于 2017 年关闭后,该规范被暂时搁置。2019 年,由设备与传感器工作组重新启动,本文件进行了重大改进,包括互操作性、测试自动化、隐私和编辑内容的增强(见§ 10 变更部分)。

2024 年,设备与传感器工作组与Web 应用工作组合作,使这一规范成为共同成果,并继续推进该规范的制定。最初的设计讨论并非保存在此 GitHub 仓库中,但可以通过Geolocation 工作组的邮件列表归档进行探索。

W3C 感谢 Lars Erik Bolstad、Dean Jackson、Claes Nilsson、George Percivall、Doug Turner、Matt Womer 和 Chris Dumez 的贡献。

10. 变更

本节总结了重要的变更和显著的编辑改进,以便进行审查。完整详细信息请参阅提交日志。自候选推荐标准 2016-08-18以来的变更如下:

符合性

文档约定

符合性要求通过描述性声明和 RFC 2119 术语的组合来表达。 在本规范的规范性部分中,关键字“MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、“MAY”和“OPTIONAL”应按照 RFC 2119 中的描述进行解释。 然而,为了提高可读性,这些词在本规范中并未全部以大写字母形式出现。

本规范的所有文本均为规范性内容,除非明确标记为非规范性、示例和注释的部分。[RFC2119]

本规范中的示例以“例如”引入,或与规范性文本分开显示,使用class="example",如下所示:

这是一个信息性示例。

信息性注释以“注释”一词开头,并与规范性文本分开显示,使用class="note",如下所示:

注释:这是一个信息性注释。

符合性算法

作为算法一部分的强制性要求(例如“删除任何前导空格字符”或“返回 false 并中止这些步骤”)应按照引入算法时使用的关键字(“必须”、“应当”、“可以”等)进行解释。

以算法或特定步骤表达的符合性要求可以以任何方式实现,只要最终结果是等效的即可。 特别是,本规范中定义的算法旨在易于理解,而非追求性能。 鼓励实现者进行优化。

索引

本规范定义的术语

引用中定义的术语

参考文献

规范性参考文献

[ACCELEROMETER]
Anssi Kostiainen。 加速度计。2026年5月14日。CRD。URL:https://www.w3.org/TR/accelerometer/
[DOM]
Anne van Kesteren。 DOM 标准。现行标准。 URL:https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript 语言规范。URL:https://tc39.es/ecma262/multipage/
[GENERIC-SENSOR]
Rick Waldron。 通用传感器 API。2026年 5月14日。CRD。URL:https://www.w3.org/TR/generic-sensor/
[HTML]
Anne van Kesteren;等。 HTML 标准。 现行标准。URL:https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren;Domenic Denicola。 Infra 标准。现行标准。URL:https://infra.spec.whatwg.org/
[ORIENTATION-SENSOR]
Kenneth Christiansen;Anssi Kostiainen。 方向传感器。2026年5月14日。 WD。URL:https://www.w3.org/TR/orientation-sensor/
[PERMISSIONS]
Marcos Caceres;Mike Taylor。 权限。2025年 10月6日。WD。URL:https://www.w3.org/TR/permissions/
[PERMISSIONS-POLICY-1]
Ian Clelland; Ari Chivukula。 权限策略。2026年 9月22日。WD。URL:https://www.w3.org/TR/permissions-policy-1/
[RFC2119]
S. Bradner。 RFC 中用于指示需求级别的关键词。1997年3月。最佳当前实践。URL:https://datatracker.ietf.org/doc/html/rfc2119
[W3C-PROCESS]
Elika J. Etemad (fantasai);Florian Rivoal。 W3C 流程文档。2025年8月18日。URL:https://www.w3.org/policies/process/
[WEBDRIVER2]
Simon Stewart;David Burns。 WebDriver。2026年 7月2日。WD。URL:https://www.w3.org/TR/webdriver2/
[WEBIDL]
Edgar Chen;Timothy Gu。 Web IDL 标准。现行标准。URL:https://webidl.spec.whatwg.org/

非规范性参考文献

[CSS-TRANSFORMS-2]
Tab Atkins Jr.等. CSS Transforms 模块第 2 级. 2021年11月9日. WD. URL: https://www.w3.org/TR/css-transforms-2/
[EULERANGLES]
欧拉角. URL: https://en.wikipedia.org/wiki/Euler_angles
[FINGERPRINT]
通过传感器指纹识别移动设备. 2014年8月6日. URL: https://arxiv.org/abs/1408.1416
[G-FORCE]
G-Force. URL: https://en.wikipedia.org/wiki/G-force
[GEOMETRY-1]
Sebastian Zartner; Yehonatan Daniv. 几何接口模块第1级. 2025年12月4日. CRD. URL: https://www.w3.org/TR/geometry-1/
[GIMBALLOCK]
万向节锁. URL: https://en.wikipedia.org/wiki/Gimbal_Lock
[GYROSCOPE]
Anssi Kostiainen。 陀螺仪。2026年5月14日。 CRD。URL:https://www.w3.org/TR/gyroscope/
[INDOORPOS]
Shala, Ubejd; Angel Rodriguez. 基于安卓设备的传感器融合室内定位. 2011年. URL: http://www.diva-portal.org/smash/record.jsf?pid=diva2%3A475619&dswid=9050
[MOTION-SENSORS]
Kenneth Christiansen; Alexander Shalamov. 运动传感器解释器. 2017年8月30日. NOTE. URL: https://www.w3.org/TR/motion-sensors/
[PROPERACCELERATION]
适当加速度. URL: https://en.wikipedia.org/wiki/Proper_acceleration
[QUATERNIONS]
四元数. URL: https://en.wikipedia.org/wiki/Quaternion
[SCREEN-ORIENTATION]
Marcos Caceres; Léonie Watson. 屏幕方向. 2026年8月6日. WD. URL: https://www.w3.org/TR/screen-orientation/
[SENSORID]
Zhang, Jiexin; Beresford, Alastair R.; Sheret, Ian. SensorID: 传感器校准指纹识别智能手机. 2019年. URL: https://doi.org/10.1109/SP.2019.00072
[TOUCH]
TouchSignatures: 基于JavaScript的移动传感器数据PIN识别和用户触摸操作识别. 2016年2月12日. URL: https://arxiv.org/abs/1602.04115

IDL 索引

partial interface Window {
    [SecureContext] attribute EventHandler ondeviceorientation;
};

[Exposed=Window, SecureContext]
interface DeviceOrientationEvent : Event {
    constructor(DOMString type, optional DeviceOrientationEventInit eventInitDict = {});
    readonly attribute double? alpha;
    readonly attribute double? beta;
    readonly attribute double? gamma;
    readonly attribute boolean absolute;

    static Promise<PermissionState> requestPermission(optional boolean absolute = false);
};

dictionary DeviceOrientationEventInit : EventInit {
    double? alpha = null;
    double? beta = null;
    double? gamma = null;
    boolean absolute = false;
};

partial interface Window {
    [SecureContext] attribute EventHandler ondeviceorientationabsolute;
};

[Exposed=Window, SecureContext]
interface DeviceMotionEventAcceleration {
    readonly attribute double? x;
    readonly attribute double? y;
    readonly attribute double? z;
};

[Exposed=Window, SecureContext]
interface DeviceMotionEventRotationRate {
    readonly attribute double? alpha;
    readonly attribute double? beta;
    readonly attribute double? gamma;
};

partial interface Window {
    [SecureContext] attribute EventHandler ondevicemotion;
};

[Exposed=Window, SecureContext]
interface DeviceMotionEvent : Event {
    constructor(DOMString type, optional DeviceMotionEventInit eventInitDict = {});
    readonly attribute DeviceMotionEventAcceleration? acceleration;
    readonly attribute DeviceMotionEventAcceleration? accelerationIncludingGravity;
    readonly attribute DeviceMotionEventRotationRate? rotationRate;
    readonly attribute double interval;

    static Promise<PermissionState> requestPermission();
};

dictionary DeviceMotionEventAccelerationInit {
    double? x = null;
    double? y = null;
    double? z = null;
};

dictionary DeviceMotionEventRotationRateInit {
    double? alpha = null;
    double? beta = null;
    double? gamma = null;
};

dictionary DeviceMotionEventInit : EventInit {
    DeviceMotionEventAccelerationInit acceleration;
    DeviceMotionEventAccelerationInit accelerationIncludingGravity;
    DeviceMotionEventRotationRateInit rotationRate;
    double interval = 0;
};

MDN

DeviceMotionEvent/DeviceMotionEvent

Firefox29+SafariNoneChrome59+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
✔MDN

DeviceMotionEvent/acceleration

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
✔MDN

DeviceMotionEvent/accelerationIncludingGravity

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
✔MDN

DeviceMotionEvent/interval

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
✔MDN

DeviceMotionEvent/rotationRate

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
✔MDN

DeviceMotionEvent

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Window/devicemotion_event

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
✔MDN

DeviceMotionEventAcceleration/x

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
✔MDN

DeviceMotionEventAcceleration/y

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
✔MDN

DeviceMotionEventAcceleration/z

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
✔MDN

DeviceMotionEventAcceleration

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
✔MDN

DeviceMotionEventRotationRate/alpha

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
✔MDN

DeviceMotionEventRotationRate/beta

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
✔MDN

DeviceMotionEventRotationRate/gamma

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
✔MDN

DeviceMotionEventRotationRate

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

DeviceOrientationEvent/DeviceOrientationEvent

Firefox17+SafariNoneChrome59+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

DeviceOrientationEvent/absolute

Firefox6+SafariNoneChrome7+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
✔MDN

DeviceOrientationEvent/alpha

In all current engines.

Firefox6+SafariNoneChrome7+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile?
✔MDN

DeviceOrientationEvent/beta

In all current engines.

Firefox6+SafariNoneChrome7+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile?
✔MDN

DeviceOrientationEvent/gamma

In all current engines.

Firefox6+SafariNoneChrome7+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile?
✔MDN

DeviceOrientationEvent

In all current engines.

Firefox6+SafariNoneChrome7+
Opera15+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView3+Samsung Internet1.0+Opera Mobile14+

Window/deviceorientation_event

In all current engines.

Firefox6+SafariNoneChrome7+
Opera12+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12+
✔MDN

Window/devicemotion_event

In all current engines.

Firefox6+SafariNoneChrome31+
Opera?Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
✔MDN

Window/deviceorientation_event

In all current engines.

Firefox6+SafariNoneChrome7+
Opera12+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari4.2+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12+
⚠MDN

Window/deviceorientationabsolute_event

In only one current engine.

FirefoxNoneSafariNoneChrome50+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?