设备方向与运动

W3C 候选推荐标准草案

关于此文档的更多细节
此版本
https://w3org.cn/TR/2025/CRD-orientation-event-20250212/
最新发布版本
https://w3org.cn/TR/orientation-event/
编辑草案
https://w3c.github.io/deviceorientation/
历史版本
历史
https://w3org.cn/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 技术报告索引(https://w3org.cn/TR/)中找到。

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

如果您希望对本文档发表评论,请 在规范仓库中提交议题

作为候选推荐标准发布并不意味着 W3C 及其成员的认可。候选推荐标准草案整合了上一个候选推荐标准中的变更,工作组打算将其包含在后续的候选推荐标准快照中。这是一份草案文档,可能随时被其他文档更新、替换或废弃。将其作为进展中的工作之外的文档引用是不恰当的。

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

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

有关常规工作组公告、行政事务和非技术性问题,请发送电子邮件至 public-device-apis@w3.org (订阅, 归档) 或 public-webapps@w3.org (订阅, 归档)。

本文档受 2023 年 11 月 3 日版 W3C 流程文档管辖。

自作为 候选推荐标准 发布以来的新功能包括:集成了权限策略和 API,现在需要通过 requestPermission() 显式获得用户同意才能访问设备方向数据。已对坐标系说明和精度要求进行了更新,以降低被动指纹识别风险。引入了 deviceorientationabsolute 事件,以增强需要绝对方向数据的应用(标记为 处于风险)。接口现在仅在 安全上下文 中可用,且安全与隐私考量已变为规范性要求。该规范现在还提供了 自动化测试 此 API 的方法(标记为 处于风险)。详见 § 10 变更 章节以获取更多信息。

1. 引言

本节是非规范性的。

本规范提供了两个新的 DOM 事件,用于获取有关宿主设备物理方向和运动的信息。这些事件提供的信息并非原始传感器数据,而是与底层信息源无关的高级数据。常见的信息源包括陀螺仪、罗盘和加速度计。

deviceorientation 事件表示设备的物理方向,表现为从局部坐标系进行的一系列旋转。

devicemotion 事件表示设备的加速度,以设备定义的笛卡尔坐标系表示。它还提供了设备围绕局部坐标系的旋转速率。在实际可行的情况下,该事件应提供设备质心的加速度。

以下代码摘录展示了这些事件的基本用法。

注册以接收 deviceorientation 事件
window.addEventListener("deviceorientation", event => {
  // process event.alpha, event.beta and event.gamma
});

// Alternatively...
window.ondeviceorientation = event => {
  // process event.alpha, event.beta and event.gamma
};
一个平放在水平表面上,屏幕顶部指向西方的设备具有以下方向
{
  alpha: 90,
  beta: 0,
  gamma: 0
};

要获得罗盘方位,只需用 360 度减去 alpha。当设备在水平面上转动时,罗盘方位为 (360 - alpha)。

用户将设备拿在手中,屏幕位于垂直平面且顶部指向正上方。无论 alphagamma 为何值,beta 的值均为 90。
用户面对 alpha 度的罗盘方位,将设备拿在手中,屏幕位于垂直平面且顶部指向其右侧。该设备的方向为
{
  alpha: 270 - alpha,
  beta: 0,
  gamma: 90
};
注册以接收 devicemotion 事件
window.addEventListener("devicemotion", (event) => {
  // Process event.acceleration, event.accelerationIncludingGravity,
  // event.rotationRate and event.interval
});

// Alternatively...
window.ondevicemotion = (event) => {
  // Process event.acceleration, event.accelerationIncludingGravity,
  // event.rotationRate and event.interval
};
一个平放在水平表面上且屏幕朝上的设备,其 acceleration 为零,并具有以下 accelerationIncludingGravity
{
  x: 0,
  y: 0,
  z: 9.8
};
一个处于自由落体状态、屏幕水平且朝上的设备,其 accelerationIncludingGravity 为零,并具有以下加速度值
{
  x: 0,
  y: 0,
  z: -9.8
};
设备安装在车辆中,屏幕处于垂直平面,顶部朝上并面向车辆后方。车辆正以速度 v 绕半径为 r 的右弯行驶。设备记录了 accelerationaccelerationIncludingGravity 的正 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 轴在下方为正,且旋转遵循左手约定。此外,[GEOMETRY-1] 中指定的 rotateSelf()rotate() 以 Z - Y' - X'' 顺序应用旋转,这与此处指定的顺序不同。

alphabetagamma 表示的旋转通过以下步骤执行

  1. 将设备框架绕其 z 轴旋转 alpha 度,其中 alpha 在 [0, 360) 范围内。

    start orientation
    设备处于初始位置,参考框架 (XYZ) 与主体框架 (xyz) 对齐。
    rotation about z axis
    设备绕 z 轴旋转 alpha 角,x 和 y 轴的先前位置显示为 x0 和 y0
  2. 将设备框架绕其 x 轴旋转 beta 度,其中 beta 在 [-180, 180) 范围内。

    rotation about x axis
    设备绕新 x 轴旋转 beta 角,y 和 z 轴的先前位置显示为 y0 和 z0
  3. 将设备框架绕其 y 轴旋转 gamma 度,其中 gamma 在 [-90, 90) 范围内。

    rotation about y axis
    设备绕新 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 属性是 ondeviceorientation 事件处理程序事件处理程序 IDL 属性,其 事件处理程序事件类型deviceorientation

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

beta 属性必须返回其初始化时的值。它表示 § 3.1 设备方向 中描述的 Z - X' - Y'' 内禀 Tait-Bryan 角绕 X' 轴(在绕 Z 轴旋转之后产生)的旋转。

gamma 属性必须返回其初始化时的值。它表示 § 3.1 设备方向 中描述的 Z - X' - Y'' 内禀 Tait-Bryan 角绕 Y'' 轴(按此顺序绕 Z 和 X' 轴旋转之后产生)的旋转。

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

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

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

  3. promise 对象的 相关 Realm 中的 一个新 promise

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

  5. 如果 absolute 为 true,将 "magnetometer" 追加permissions

  6. 并行方式运行这些步骤

    1. 对于 permissions 中的 每个 name

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

        1. 设备运动和方向任务源 上排队一个全局任务,给定 global,以 "NotAllowedError" DOMException 拒绝 promise

        2. 返回。

    2. permissionState 为 "granted"。

    3. 对于 permissions 中的 每个 name

      注意: 没有一次性请求多个权限的算法。然而,鼓励用户代理将针对不同媒体类型的并发请求捆绑到一个面向用户的权限提示中。

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

        1. permissionState 设置为 "denied"。

        2. 跳出。.

    4. 设备运动和方向任务源 上排队一个全局任务,给定 global,以 permissionState 解析 promise

  7. 返回 promise

给定 DOMString eventWindow windowboolean absolute触发方向事件
  1. orientation 为 null。

  2. topLevelTraversablewindow可导航对象顶层遍历器

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

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

    1. virtualSensortopLevelTraversable虚拟传感器映射[virtualSensorType]。

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

      1. orientation 设置为提供给 virtualSensor 的最新读数,并使用 "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. environmentwindow相关设置对象

  10. 并行 执行这些步骤

    1. 对于 permissions 中的 每个 permission

      1. state获取当前权限状态 给定 permissionenvironment 的结果。

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

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

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

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

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

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

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

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

      7. window触发 一个名为 event 的事件,使用 DeviceOrientationEvent,其中 alpha 属性初始化为 zbeta 属性初始化为 xgamma 属性初始化为 y,并且 absolute 属性初始化为 absolute

方向的 重大变化 指示与前一个值相比,方向值的差异足以触发 deviceorientationdeviceorientationabsolute 事件。确定是否发生了 方向的重大变化 的过程是 实现定义 的,尽管建议将 1 度作为变化的最高阈值。如果实现有理由相信页面没有足够新鲜的数据,它们也可以考虑发生了该变化。

注意: 实现必须考虑 § 9 自动化 来确定是否发生了 方向的重大变化,以便虚拟传感器读数更新导致其被评估。

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

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

  3. absolute 为 false。

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

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

    1. absolute 设置为 true。

    2. 追加 "magnetometer"features

  6. 对于 features 中的 每个 feature

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

  7. 触发方向事件,使用 deviceorientationwindowabsolute

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

6.2. deviceorientationabsolute 事件

由于 有限的实施经验deviceorientationabsolute 事件及其 ondeviceorientationabsolute 事件处理程序 IDL 属性被标记为 处于风险
partial interface Window {
    [SecureContext] attribute EventHandler ondeviceorientationabsolute;
};

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

deviceorientationabsolute 事件与 deviceorientation 事件完全类似,不同之处在于它必须始终提供 绝对方向 数据。

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

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

6.3. devicemotion 事件

6.3.1. The DeviceMotionEventAcceleration 接口

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

DeviceMotionEventAcceleration 接口表示 § 3.2 设备运动 中描述的设备加速度。它具有以下相关数据

x 轴加速度

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

y 轴加速度

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

z 轴加速度

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

x 获取器的步骤是返回 对象的 x 轴加速度 的值。

y 获取器的步骤是返回 对象的 y 轴加速度 的值。

z 获取器的步骤是返回 对象的 z 轴加速度 的值。

6.3.2. The DeviceMotionEventRotationRate 接口

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

DeviceMotionEventRotationRate 接口表示 § 3.2 设备运动 中描述的设备 旋转速率。它具有以下相关数据

x 轴旋转速率

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

y 轴旋转速率

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

z 轴旋转速率

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

alpha 获取器的步骤是返回 对象的 x 轴旋转速率 的值。

beta 获取器的步骤是返回 对象的 y 轴旋转速率 的值。

gamma 获取器的步骤是返回 对象的 z 轴旋转速率 的值。

6.3.3. The 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 属性是 ondevicemotion 事件处理程序事件处理程序 IDL 属性,其 事件处理程序事件类型devicemotion

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

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

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

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

requestPermission() 方法的步骤如下
  1. global当前全局对象

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

  3. result 对象的 相关 Realm 中的 一个新 promise

  4. 并行 执行这些步骤

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

    2. 对于 permissions 中的 每个 name

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

        1. 设备运动和方向任务源 上排队一个全局任务,给定 global,以 "NotAllowedError" DOMException 拒绝 result

        2. 返回。

    3. permissionState 为 "granted"。

    4. 对于 permissions 中的 每个 name

      注意: 没有一次性请求多个权限的算法。然而,鼓励用户代理将针对不同媒体类型的并发请求捆绑到一个面向用户的权限提示中。

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

        1. permissionState 设置为 "denied"。

        2. 跳出。.

    5. 设备运动和方向任务源 上排队一个全局任务,给定 global,以 permissionState 解析 result

  5. 返回 result

实现定义 的间隔 interval 下,用户代理必须在 可导航对象活动窗口 window 上执行以下步骤
  1. documentwindow关联文档

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

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

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

  4. topLevelTraversablewindow可导航对象顶层遍历器

  5. platformLinearAcceleration 为 null。

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

    1. virtualSensortopLevelTraversable虚拟传感器映射["linear-acceleration"]。

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

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

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

  8. acceleration 为 null。

  9. 如果 platformLinearAcceleration 不为 null

    1. acceleration 设置为在 windowRealm 中创建的 DeviceMotionEventAcceleration

    2. accelerationx 轴加速度 设置为 platformLinearAcceleration 沿 X 轴的值,或者如果无法提供则为 null。

    3. 如果 accelerationx 轴加速度 不为 null,则将其精度限制为不超过 0.1 m/s2

    4. accelerationy 轴加速度 设置为 platformLinearAcceleration 沿 Y 轴的值,或者如果无法提供则为 null。

    5. 如果 accelerationy 轴加速度 不为 null,则将其精度限制为不超过 0.1 m/s2

    6. accelerationz 轴加速度 设置为 platformLinearAcceleration 沿 Z 轴的值,或者如果无法提供则为 null。

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

  10. platformAccelerationIncludingGravity 为 null。

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

    1. virtualSensortopLevelTraversable虚拟传感器映射["accelerometer"]。

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

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

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

  13. accelerationIncludingGravity 为 null。

  14. 如果 platformAccelerationIncludingGravity 不为 null

    1. accelerationIncludingGravity 设置为在 windowRealm 中创建的 DeviceMotionEventAcceleration

    2. accelerationIncludingGravityx 轴加速度 设置为 platformAccelerationIncludingGravity 沿 X 轴的值,或者如果无法提供则为 null。

    3. 如果 accelerationIncludingGravityx 轴加速度 不为 null,则将其精度限制为不超过 0.1 m/s2

    4. accelerationIncludingGravityy 轴加速度 设置为 platformAccelerationIncludingGravity 沿 Y 轴的值,或者如果无法提供则为 null。

    5. 如果 accelerationIncludingGravityy 轴加速度 不为 null,则将其精度限制为不超过 0.1 m/s2

    6. accelerationIncludingGravityz 轴加速度 设置为 platformAccelerationIncludingGravity 沿 Z 轴的值,或者如果无法提供则为 null。

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

  15. platformRotationRate 为 null。

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

    1. virtualSensortopLevelTraversable虚拟传感器映射["gyroscope"]。

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

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

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

  18. rotationRate 为 null。

  19. 如果 platformRotationRate 不为 null

    1. rotationRate 设置为在 windowRealm 中创建的 DeviceMotionEventRotationRate

    2. rotationRatex 轴旋转速率 设置为 platformRotationRate 绕 X 轴的值,或者如果无法提供则为 null。

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

    4. rotationRatey 轴旋转速率 设置为 platformRotationRate 绕 Y 轴的值,或者如果无法提供则为 null。

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

    6. rotationRatez 轴旋转速率 设置为 platformRotationRate 绕 Z 轴的值,或者如果无法提供则为 null。

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

  20. environmentwindow相关设置对象

  21. 并行 执行这些步骤

    1. 针对 « "accelerometer"(加速度计), "gyroscope"(陀螺仪) » 中的每个 permission

      1. state 为使用 permissionenvironment 获取当前权限状态 的结果。

      2. 如果 state 不是 "granted"(已授予),则返回。

    2. window 给定的 设备运动与方向任务源排队一个全局任务以执行以下步骤

      1. 触发一个事件,命名为 "devicemotion",目标为 window,使用 DeviceMotionEvent,并将 acceleration 属性初始化为 accelerationaccelerationIncludingGravity 属性初始化为 accelerationIncludingGravityrotationRate 属性初始化为 rotationRate,以及 interval 属性初始化为 interval

如果实现无法提供运动信息,则该事件触发时应将 accelerationaccelerationIncludingGravityrotationRate 属性设置为 null。

7. 安全与隐私考量

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

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

此外,为了最大限度地降低隐私风险、指纹识别和其他攻击的可能性,实现必须:

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

正在收集进一步的实现经验,以便为最大采样频率上限提供参考。

8. 无障碍考量

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

可能会出现两种用户需求,这些需求很可能由用户代理或底层操作系统来管理。然而,记住这些考量因素会有所帮助,因为它们代表了您的内容或应用可能被使用的方式。

9. 自动化

由于实现经验有限,此功能处于风险之中

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

为了应对这一挑战,本文档建立在 [WEBDRIVER2] 扩展命令以及 通用传感器 API § 9 自动化中制定的基础设施之上。之所以选择这种方案,而不是开发全新的独立基础设施,是因为两个规范之间存在显著重叠:不仅测试 [GENERIC-SENSOR] 规范存在类似的挑战,而且许多派生 API(例如 [GYROSCOPE])获取和提供的信息也相似。

本规范仅要求实现支持 [GENERIC-SENSOR] 规范的 通用传感器 API § 9 自动化部分,而不需要支持其接口和事件。

9.1. 设备方向自动化

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

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

因此,本规范没有要求实现(和自动化用户)通过使用不同测量单位的底层虚拟传感器提供方向读数,而是为相对数据和方向数据定义了额外的虚拟传感器类型,格式与本规范使用的格式一致。

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

要执行解析方向数据读数算法,给定一个 JSON Object parameters
  1. alpha 为从 parameters 中调用获取属性方法并传入 "alpha" 的结果。

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

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

  4. beta 为从 parameters 中调用获取属性方法并传入 "beta" 的结果。

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

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

  7. gamma 为从 parameters 中调用获取属性方法并传入 "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"(绝对方向)虚拟传感器类型

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

"absolute-orientation"

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

9.1.3. "relative-orientation"(相对方向)虚拟传感器类型

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

"relative-orientation"

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

9.2. 设备运动自动化

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

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

9.2.1. "accelerometer"(加速度计)虚拟传感器类型

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

"accelerometer"

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

9.2.2. "linear-acceleration"(线性加速度)虚拟传感器类型

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

"linear-acceleration"

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

9.2.3. "gyroscope"(陀螺仪)虚拟传感器类型

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

"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 表示如下,以便在提供的参数已定义、非 null 且表示absolute(绝对)值时,返回正确的指南针方位。

var degtorad = Math.PI / 180; // Degree-to-Radian conversion

function compassHeading( alpha, beta, gamma ) {

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

  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 );

  // Calculate Vx and Vy components
  var Vx = - cZ * sY - sZ * sX * cY;
  var Vy = - sZ * sY + cZ * sX * cY;

  // Calculate compass heading
  var compassHeading = Math.atan( Vx / Vy );

  // Convert compass heading to use whole unit circle
  if( Vy < 0 ) {
    compassHeading += Math.PI;
  } else if( Vx < 0 ) {
    compassHeading += 2 * Math.PI;
  }

  return compassHeading * ( 180 / Math.PI ); // Compass Heading (in degrees)

}

作为一致性检查,如果我们设置 γ = 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 其他设备方向表示法

本节是非规范性的。

使用 Tait-Bryan 角描述方向可能会有一些缺点,例如引入万向节死锁 [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; // Degree-to-Radian conversion

function getRotationMatrix( alpha, beta, gamma ) {

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

  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 rotation matrix construction.
  //

  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; // Degree-to-Radian conversion

function getQuaternion( alpha, beta, gamma ) {

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

  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 quaternion construction.
  //

  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

符合预期。

致谢

“设备方向和运动”规范最初于 2016 年 8 月以《设备方向事件规范》为题作为候选推荐标准发布,最初由地理定位工作组开发。该工作组于 2017 年解散后,该规范被暂时搁置。该文档于 2019 年由设备和传感器工作组重启,并进行了重大改进,包括在互操作性、测试自动化、隐私和编辑内容方面的提升(参见§ 10 变更部分)。

2024 年,设备和传感器工作组与Web 应用工作组展开合作,使其成为一项联合交付成果,并继续推动该规范的发展。最初的设计讨论并未保存在此 GitHub 仓库中,但可以通过地理定位工作组的邮件列表存档进行查阅。

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" 与规范性文本隔开,如下所示

这是一个说明性示例。

说明性注释以“Note”一词开头,并使用 class="note" 与规范性文本隔开,如下所示

注意,这是一个说明性注释。

一致性算法

作为算法一部分的祈使语气要求(例如“去除任何前导空格字符”或“返回 false 并中止这些步骤”)应根据引入算法时使用的关键词(“必须”、“应该”、“可以”等)进行解释。

以算法或具体步骤表述的一致性要求可以用任何方式实现,只要最终结果等效即可。特别地,本规范定义的算法旨在易于理解,而不旨在提高性能。鼓励实现者进行优化。

索引

本规范定义的术语

  • constructor(type, eventInitDict)
  • devicemotion,见 § 6.3.3
  • 设备运动与方向任务源,见 § 5
  • DeviceMotionEvent,见 § 6.3.3
  • DeviceMotionEventAcceleration,见 § 6.3.1
  • DeviceMotionEventAccelerationInit,见 § 6.3.3
  • DeviceMotionEventInit,见 § 6.3.3
  • DeviceMotionEventRotationRate,见 § 6.3.2
  • DeviceMotionEventRotationRateInit,见 § 6.3.3
  • DeviceMotionEvent(type),见 § 6.3.3
  • DeviceMotionEvent(type, eventInitDict),见 § 6.3.3
  • deviceorientation,见 § 6.1
  • deviceorientationabsolute,见 § 6.2
  • DeviceOrientationEvent,见 § 6.1
  • DeviceOrientationEventInit,见 § 6.1
  • DeviceOrientationEvent(type),见 § 6.1
  • DeviceOrientationEvent(type, eventInitDict),见 § 6.1
  • 触发方向事件,见 § 6.1
  • 伽马函数 (gamma)
  • "gyroscope",见 § 4
  • gyroscope 虚拟传感器类型,见 § 9.2.3
  • interval
  • 线性加速度,见 § 3.2
  • linear-acceleration 虚拟传感器类型,见 § 9.2.2
  • 线性设备加速度,见 § 3.2
  • "magnetometer",见 § 4
  • ondevicemotion,见 § 6.3.3
  • ondeviceorientation,见 § 6.1
  • ondeviceorientationabsolute,见 § 6.2
  • 解析方向数据读数,见 § 9.1.1
  • 相对设备方向,见 § 3.1.1
  • 相对方向,见 § 3.1.1
  • relative-orientation 虚拟传感器类型,见 § 9.1.3
  • requestPermission()
  • requestPermission(absolute),见 § 6.1
  • 旋转速率,见 § 3.2
  • rotationRate(旋转速率)
  • 方向的重大变化,见 § 6.1
  • x
  • x 轴加速度,见 § 6.3.1
  • x 轴旋转速率,见 § 6.3.2
  • y
  • y 轴加速度,见 § 6.3.1
  • y 轴旋转速率,见 § 6.3.2
  • z
  • z 轴加速度,见 § 6.3.1
  • z 轴旋转速率,见 § 6.3.2
  • 通过引用定义的术语

    引用

    规范性引用

    [ACCELEROMETER]
    Anssi Kostiainen. Accelerometer(加速度计). 2025 年 2 月 12 日. CRD. URL: https://w3org.cn/TR/accelerometer/
    [DOM]
    Anne van Kesteren. DOM 标准. Living Standard. URL: https://dom.spec.whatwg.org/
    [ECMASCRIPT]
    ECMAScript 语言规范. URL: https://tc39.es/ecma262/multipage/
    [GENERIC-SENSOR]
    Rick Waldron. Generic Sensor API(通用传感器 API). 2024 年 2 月 22 日. CRD. URL: https://w3org.cn/TR/generic-sensor/
    [HTML]
    Anne van Kesteren; et al. HTML 标准. Living Standard. URL: https://html.whatwg.cn/multipage/
    [INFRA]
    Anne van Kesteren; Domenic Denicola. Infra 标准. Living Standard. URL: https://infra.spec.whatwg.org/
    [ORIENTATION-SENSOR]
    Kenneth Christiansen; Anssi Kostiainen. Orientation Sensor(方向传感器). 2024 年 1 月 10 日. WD. URL: https://w3org.cn/TR/orientation-sensor/
    [PERMISSIONS]
    Marcos Caceres; Mike Taylor. Permissions. 20 December 2024. WD. URL: https://w3org.cn/TR/permissions/
    [PERMISSIONS-POLICY-1]
    Ian Clelland. Permissions Policy(权限策略). 2025 年 2 月 10 日. WD. URL: https://w3org.cn/TR/permissions-policy-1/
    [RFC2119]
    S. Bradner. RFC 中用于指示要求级别的关键词. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
    [W3C-PROCESS]
    Elika J. Etemad (fantasai); Florian Rivoal. W3C Process Document(W3C 流程文档). 2023 年 11 月 3 日. URL: https://w3org.cn/policies/process/
    [WEBDRIVER2]
    Simon Stewart; David Burns. WebDriver(WebDriver). 2025 年 2 月 10 日. WD. URL: https://w3org.cn/TR/webdriver2/
    [WEBIDL]
    Edgar Chen; Timothy Gu. Web IDL 标准. Living Standard. URL: https://webidl.spec.whatwg.org/

    参考资料

    [CSS-TRANSFORMS-2]
    Tab Atkins Jr.; et al. CSS Transforms Module Level 2. 2021年11月9日. WD. URL: https://w3org.cn/TR/css-transforms-2/
    [EULERANGLES]
    Euler Angles(欧拉角). URL: https://en.wikipedia.org/wiki/Euler_angles
    [FINGERPRINT]
    Mobile Device Identification via Sensor Fingerprinting(通过传感器指纹进行移动设备识别). 2014 年 8 月 6 日. URL: https://arxiv.org/abs/1408.1416
    [G-FORCE]
    G-Force(G 力). URL: https://en.wikipedia.org/wiki/G-force
    [GEOMETRY-1]
    Simon Pieters; Chris Harrelson. Geometry Interfaces Module Level 1. 2018年12月4日. CR. URL: https://w3org.cn/TR/geometry-1/
    [GIMBALLOCK]
    Gimbal Lock(万向节死锁). URL: https://en.wikipedia.org/wiki/Gimbal_Lock
    [GYROSCOPE]
    Anssi Kostiainen. Gyroscope(陀螺仪). 2024 年 10 月 8 日. CRD. URL: https://w3org.cn/TR/gyroscope/
    [INDOORPOS]
    Shala, Ubejd; Angel Rodriguez. Indoor positioning using sensor-fusion in android devices(基于 Android 设备传感器融合的室内定位). 2011. URL: http://www.diva-portal.org/smash/record.jsf?pid=diva2%3A475619&dswid=9050
    [MOTION-SENSORS]
    Kenneth Christiansen; Alexander Shalamov. 运动传感器说明. 30 August 2017. NOTE. URL: https://w3org.cn/TR/motion-sensors/
    [PROPERACCELERATION]
    Proper acceleration(固有加速度). URL: https://en.wikipedia.org/wiki/Proper_acceleration
    [QUATERNIONS]
    Quaternions(四元数). URL: https://en.wikipedia.org/wiki/Quaternion
    [SCREEN-ORIENTATION]
    Marcos Caceres. Screen Orientation(屏幕方向). 2023 年 8 月 9 日. WD. URL: https://w3org.cn/TR/screen-orientation/
    [SENSORID]
    Zhang, Jiexin; Beresford, Alastair R.; Sheret, Ian. SensorID: Sensor Calibration Fingerprinting for Smartphones(SensorID:智能手机传感器校准指纹识别). 2019. URL: https://doi.org/10.1109/SP.2019.00072
    [TOUCH]
    TouchSignatures: Identification of User Touch Actions and PINs Based on Mobile Sensor Data via JavaScript(TouchSignatures:基于移动传感器数据的用户触摸动作和 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+SafariChrome59+
    Opera?Edge79+
    Edge (旧版)14+IE
    Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
    MDN

    DeviceMotionEvent/acceleration

    在所有当前引擎中。

    Firefox6+SafariChrome31+
    Opera?Edge79+
    Edge (旧版)12+IE11
    Android Firefox?iOS Safari4.2+Android Chrome?Android WebView?Samsung Internet?Android Opera?
    MDN

    DeviceMotionEvent/accelerationIncludingGravity

    在所有当前引擎中。

    Firefox6+SafariChrome31+
    Opera?Edge79+
    Edge (旧版)12+IE11
    Android Firefox?iOS Safari4.2+Android Chrome?Android WebView?Samsung Internet?Android Opera?
    MDN

    DeviceMotionEvent/interval

    在所有当前引擎中。

    Firefox6+SafariChrome31+
    Opera?Edge79+
    Edge (旧版)12+IE11
    Android Firefox?iOS Safari4.2+Android Chrome?Android WebView?Samsung Internet?Android Opera?
    MDN

    DeviceMotionEvent/rotationRate

    在所有当前引擎中。

    Firefox6+SafariChrome31+
    Opera?Edge79+
    Edge (旧版)12+IE11
    Android Firefox?iOS Safari4.2+Android Chrome?Android WebView?Samsung Internet?Android Opera?
    MDN

    DeviceMotionEvent

    在所有当前引擎中。

    Firefox6+SafariChrome31+
    Opera?Edge79+
    Edge (旧版)12+IE11
    Android Firefox?iOS Safari4.2+Android Chrome?Android WebView?Samsung Internet?Android Opera?

    Window/devicemotion_event

    在所有当前引擎中。

    Firefox6+SafariChrome31+
    Opera?Edge79+
    Edge (旧版)12+IE11
    Android Firefox?iOS Safari4.2+Android Chrome?Android WebView?Samsung Internet?Android Opera?
    MDN

    DeviceMotionEventAcceleration/x

    在所有当前引擎中。

    Firefox6+SafariChrome31+
    Opera?Edge79+
    Edge (旧版)12+IE11
    Android Firefox?iOS Safari4.2+Android Chrome?Android WebView?Samsung Internet?Android Opera?
    MDN

    DeviceMotionEventAcceleration/y

    在所有当前引擎中。

    Firefox6+SafariChrome31+
    Opera?Edge79+
    Edge (旧版)12+IE11
    Android Firefox?iOS Safari4.2+Android Chrome?Android WebView?Samsung Internet?Android Opera?
    MDN

    DeviceMotionEventAcceleration/z

    在所有当前引擎中。

    Firefox6+SafariChrome31+
    Opera?Edge79+
    Edge (旧版)12+IE11
    Android Firefox?iOS Safari4.2+Android Chrome?Android WebView?Samsung Internet?Android Opera?
    MDN

    DeviceMotionEventAcceleration

    在所有当前引擎中。

    Firefox6+SafariChrome31+
    Opera?Edge79+
    Edge (旧版)12+IE11
    Android Firefox?iOS Safari4.2+Android Chrome?Android WebView?Samsung Internet?Android Opera?
    MDN

    DeviceMotionEventRotationRate/alpha

    在所有当前引擎中。

    Firefox6+SafariChrome31+
    Opera?Edge79+
    Edge (旧版)12+IE11
    Android Firefox?iOS Safari4.2+Android Chrome?Android WebView?Samsung Internet?Android Opera?
    MDN

    DeviceMotionEventRotationRate/beta

    在所有当前引擎中。

    Firefox6+SafariChrome31+
    Opera?Edge79+
    Edge (旧版)12+IE11
    Android Firefox?iOS Safari4.2+Android Chrome?Android WebView?Samsung Internet?Android Opera?
    MDN

    DeviceMotionEventRotationRate/gamma

    在所有当前引擎中。

    Firefox6+SafariChrome31+
    Opera?Edge79+
    Edge (旧版)12+IE11
    Android Firefox?iOS Safari4.2+Android Chrome?Android WebView?Samsung Internet?Android Opera?
    MDN

    DeviceMotionEventRotationRate

    在所有当前引擎中。

    Firefox6+SafariChrome31+
    Opera?Edge79+
    Edge (旧版)12+IE11
    Android Firefox?iOS Safari4.2+Android Chrome?Android WebView?Samsung Internet?Android Opera?
    MDN

    DeviceOrientationEvent/DeviceOrientationEvent

    Firefox17+SafariChrome59+
    Opera?Edge79+
    Edge (旧版)14+IE
    Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
    MDN

    DeviceOrientationEvent/absolute

    Firefox6+SafariChrome7+
    Opera?Edge79+
    Edge (旧版)12+IE11
    Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
    MDN

    DeviceOrientationEvent/alpha

    在所有当前引擎中。

    Firefox6+SafariChrome7+
    Opera?Edge79+
    Edge (旧版)12+IE11
    Android Firefox?iOS Safari4.2+Android Chrome?Android WebView3+Samsung Internet?Android Opera?
    MDN

    DeviceOrientationEvent/beta

    在所有当前引擎中。

    Firefox6+SafariChrome7+
    Opera?Edge79+
    Edge (旧版)12+IE11
    Android Firefox?iOS Safari4.2+Android Chrome?Android WebView3+Samsung Internet?Android Opera?
    MDN

    DeviceOrientationEvent/gamma

    在所有当前引擎中。

    Firefox6+SafariChrome7+
    Opera?Edge79+
    Edge (旧版)12+IE11
    Android Firefox?iOS Safari4.2+Android Chrome?Android WebView3+Samsung Internet?Android Opera?
    MDN

    DeviceOrientationEvent

    在所有当前引擎中。

    Firefox6+SafariChrome7+
    Opera15+Edge79+
    Edge (旧版)12+IE11
    Android Firefox?iOS Safari4.2+Android Chrome?Android WebView3+Samsung Internet1.0+Android Opera14+

    Window/deviceorientation_event

    在所有当前引擎中。

    Firefox6+SafariChrome7+
    Opera12+Edge79+
    Edge (旧版)12+IE11
    Android Firefox?iOS Safari4.2+Android Chrome?Android WebView3+Samsung Internet?Android Opera12+
    MDN

    Window/devicemotion_event

    在所有当前引擎中。

    Firefox6+SafariChrome31+
    Opera?Edge79+
    Edge (旧版)12+IE11
    Android Firefox?iOS Safari4.2+Android Chrome?Android WebView?Samsung Internet?Android Opera?
    MDN

    Window/deviceorientation_event

    在所有当前引擎中。

    Firefox6+SafariChrome7+
    Opera12+Edge79+
    Edge (旧版)12+IE11
    Android Firefox?iOS Safari4.2+Android Chrome?Android WebView3+Samsung Internet?Android Opera12+
    MDN

    Window/deviceorientationabsolute_event

    仅在一种当前的引擎中可用。

    FirefoxSafariChrome50+
    Opera?Edge79+
    Edge (旧版)?IE
    Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?