全屏 API

现行标准 — 最后更新

参与:
GitHub whatwg/fullscreen (新建 issue, 打开的 issues)
在 Matrix 上聊天
提交:
GitHub whatwg/fullscreen/commits
该提交时的快照
@fullscreenapi
测试:
web-platform-tests fullscreen/ (正在进行的工作)
翻译 (非规范性)
日本語
简体中文

摘要

全屏 API 标准定义了一个 API,允许元素以全屏模式显示。

1. 术语

本规范依赖于 Infra 标准。[INFRA]

本规范中使用的大多数术语来自 CSS、DOM、HTML 和 Web IDL。[CSS] [DOM] [HTML] [WEBIDL]

2. 模型

所有元素都有一个相关的全屏标志。除非另有说明,否则该标志为未设置。

所有iframe元素都有一个相关的iframe 全屏标志。除非另有说明,否则该标志为未设置。

所有文档都有一个相关的全屏元素全屏元素文档顶层 中置顶的元素,其 全屏标志已设置;否则为 null。

所有文档都有一个相关的待处理全屏事件列表, 它是一个包含 (字符串, 元素)元组有序集合。初始为空。

全屏显示 element

  1. hideUntil 设为运行最顶层的弹出元素祖先的结果,给定 element,null 和 false。

  2. 如果 hideUntil 为 null,则将 hideUntil 设为 element节点文档

  3. 运行隐藏所有弹出元素直到,给定 hideUntil,false 和 true。

  4. 设置 element全屏标志

  5. 立即从顶层移除给定 element

  6. 添加到顶层给定 element

取消全屏显示 element,取消设置 element全屏标志iframe 全屏标志(如果有),并立即从顶层移除给定 element

取消全屏显示 document取消全屏显示所有在 document顶层 中的元素,其 全屏标志已设置。


完全退出全屏给定 文档 document,运行以下步骤:

  1. 如果 document全屏元素 为 null,则终止这些步骤。

  2. 取消全屏显示元素,这些元素的全屏标志已设置,在 document顶层中,但不包括 document全屏元素

  3. 退出全屏document

每当运行 移除步骤时,给定一个 removedNode,运行以下步骤:

  1. document 设为 removedNode节点文档

  2. nodes 设为 removedNode包括阴影在内的包含后代,其全屏标志已设置,按包括阴影在内的树顺序排列。

  3. 遍历nodes中的每个node

    1. 如果 nodedocument全屏元素退出全屏 document

    2. 否则,取消全屏显示node

    3. 如果 document顶层 包含 node立即从顶层移除给定 node

      其他规范可以在顶层中添加和移除元素,因此 node 可能不是 document全屏元素。例如,node 可能是一个打开的对话框元素。

每当运行卸载文档清理步骤时,给定一个document完全退出全屏 document


支持全屏,如果没有先前建立的用户偏好、安全风险或平台限制。


运行全屏步骤给定 文档document,运行这些步骤:

  1. pendingEvents 设为 document待处理全屏事件列表

  2. 清空 document待处理全屏事件列表

  3. 遍历 pendingEvents 中的每个 (type, element):

    1. target 设为 element,如果 element已连接并且其节点文档document,否则将 target 设为 document

    2. 触发一个事件,名为 type,其bubblescomposed属性设置为 true, 在 target 上。

这些步骤与 HTML 中定义的事件循环集成。[HTML]

3. API

enum FullscreenNavigationUI {
  "auto",
  "show",
  "hide"
};

dictionary FullscreenOptions {
  FullscreenNavigationUI navigationUI = "auto";
};

partial interface Element {
  Promise<undefined> requestFullscreen(optional FullscreenOptions options = {});

  attribute EventHandler onfullscreenchange;
  attribute EventHandler onfullscreenerror;
};

partial interface Document {
  [LegacyLenientSetter] readonly attribute boolean fullscreenEnabled;
  [LegacyLenientSetter, Unscopable] readonly attribute boolean fullscreen; // historical

  Promise<undefined> exitFullscreen();

  attribute EventHandler onfullscreenchange;
  attribute EventHandler onfullscreenerror;
};

partial interface mixin DocumentOrShadowRoot {
  [LegacyLenientSetter] readonly attribute Element? fullscreenElement;
};
promise = element . requestFullscreen([options])
element 显示为全屏,并在完成后解析 promise

当提供时,optionsnavigationUI 成员指示是否希望在全屏显示时显示导航 UI。如果设置为 "show", 则表示优先考虑导航简便性,而不是屏幕空间;如果设置为 "hide", 则更倾向于更多的屏幕空间。用户代理始终可以优先考虑用户偏好,而不是应用程序的偏好。默认值 "auto" 表示没有应用程序偏好。

document . fullscreenEnabled

如果 document 具有显示元素 全屏的能力,并且支持全屏,则返回 true,否则返回 false。

promise = document . exitFullscreen()

停止 document全屏元素的全屏显示,并在完成后解析 promise

document . fullscreenElement

返回 document全屏元素

shadowroot . fullscreenElement

返回 shadowroot全屏元素

元素element全屏元素就绪检查返回 true 如果以下所有条件都为 true,否则返回 false:

requestFullscreen(options)方法的步骤如下:

  1. pendingDoc 设为this节点文档

  2. promise 设为一个新的 promise。

  3. 如果 pendingDoc 不是完全活动的,则使用 TypeError 异常拒绝 promise,并返回 promise

  4. error 设为 false。

  5. 如果以下任一条件为 false,则将 error 设置为 true:

  6. 如果 error 为 false,则消耗用户激活,给定 pendingDoc相关全局对象

  7. 返回 promise,并运行剩余步骤并行

  8. 如果 error 为 false,则调整 pendingDoc节点可导航顶级可遍历对象活动文档的视口尺寸,可选择考虑 options["navigationUI"]:

    视口尺寸
    "hide" 输出设备屏幕的完整尺寸
    "show" 限制为允许用户代理显示页面导航控件的输出设备屏幕尺寸
    "auto" 用户代理定义,但匹配上述之一

    可选择显示一条消息,说明最终用户如何还原此操作。

  9. 如果以下任一条件为 false,则将 error 设置为 true:

  10. 如果 error 为 true:

    1. 追加 (fullscreenerror, this) 到 pendingDoc待处理全屏事件列表中。

    2. 使用 TypeError 异常拒绝 promise,并终止这些步骤。

  11. fullscreenElements 设为一个有序集合,最初由this组成。

  12. 当条件为 true 时:

    1. last 设为 fullscreenElements 的最后一个

    2. container 设为 last节点可导航容器

    3. 如果 container 为 null,则中断

    4. 追加 containerfullscreenElements

  13. 遍历 fullscreenElements 中的每个 element

    1. doc 设为 element节点文档

    2. 如果 elementdoc全屏元素,则继续

      当没有发生任何变化时,无需通知观察者。

    3. 如果 elementthis,并且this 是一个 iframe 元素,则设置 elementiframe 全屏标志

    4. 全屏显示 elementdoc 中。

    5. 追加 (fullscreenchange, element) 到 doc待处理全屏事件列表

    元素全屏显示的顺序是不可观察的,因为运行全屏步骤树顺序中被调用。

  14. 使用 undefined 解析 promise

具有跨进程可导航对象的实现留给读者练习。欢迎对潜在改进提出意见。

fullscreenEnabled getter 步骤是如果this允许使用 "全屏" 功能,并且支持全屏,则返回 true, 否则返回 false。

fullscreen getter 步骤是如果this全屏元素 为 null,则返回 false,否则返回 true。

请改用fullscreenElement 属性。

fullscreenElement getter 步骤如下:

  1. 如果this阴影根,并且其宿主连接,则返回 null。

  2. candidate 设为重新目标化的结果全屏元素针对this

  3. 如果 candidatethis在同一中,则返回 candidate

  4. 返回 null。

一个 document 被称为 简单全屏文档,如果在其 顶层中只有一个 元素 具有其 全屏标志 设置。

一个 document 中有两个 元素 在其 顶层 中,可以被称为一个 简单全屏文档。例如,除了 全屏元素 外,还可以有一个打开的 对话框 元素。

收集要退出全屏的文档,给定doc,请运行以下步骤:

  1. docs 设为一个有序集合,由 doc 组成。

  2. 条件为 true 时:

    1. lastDoc 设为 docs 的最后一个文档

    2. 断言:lastDoc全屏元素 不为 null。

    3. 如果 lastDoc 不是 简单全屏文档,则中断

    4. container 设为 lastDoc节点可导航容器

    5. 如果 container 为 null,则中断

    6. 如果 containeriframe 全屏标志 被设置,中断

    7. 追加 container节点文档docs

  3. 返回 docs

    这是全屏元素将被退出全屏的一组文档,但 docs 中的最后一个文档可能有多个元素在其顶层中设置了 全屏标志,这种情况下该文档仍将保持全屏状态。

退出全屏,给定文档 doc,请运行以下步骤:

  1. promise 设为一个新的 promise。

  2. 如果 doc 不是完全活动的doc全屏元素 为 null,则使用 TypeError异常拒绝 promise,并返回 promise

  3. resize 设为 false。

  4. docs 设为收集要退出全屏的文档的结果,给定 doc

  5. topLevelDoc 设为 doc节点可导航顶级可遍历对象活动文档

  6. 如果 topLevelDocdocs 中,并且它是一个 简单全屏文档,则将 doc 设置为 topLevelDoc 并将 resize 设置为 true。

  7. 如果 doc全屏元素连接

    1. 追加 (fullscreenchangedoc全屏元素) 到 doc待处理全屏事件列表中。

  8. 返回 promise,并运行剩余步骤并行

  9. 运行完全解锁屏幕方向的步骤,给定 doc

  10. 如果 resize 为 true,则调整 doc 的视口到其“正常”尺寸。

  11. 如果 doc全屏元素为 null,则使用 undefined 解析 promise 并终止这些步骤。

  12. exitDocs 设为收集要退出全屏的文档的结果,给定 doc

  13. descendantDocs 设为一个有序集合,由 doc后代可导航对象活动文档全屏元素非 null(如果有)组成,按树顺序

  14. 遍历 exitDoc 中的每个 exitDoc

    1. 追加 (fullscreenchangeexitDoc全屏元素) 到 exitDoc待处理全屏事件列表中。

    2. 如果 resize 为 true,则退出全屏 exitDoc

    3. 否则,退出全屏 exitDoc全屏元素

  15. 遍历 descendantDoc 中的每个 descendantDoc

    1. 追加 (fullscreenchangedescendantDoc全屏元素) 到 descendantDoc待处理全屏事件列表中。

    2. 退出全屏 descendantDoc

    文档退出全屏的顺序是不可观察的,因为运行全屏步骤树顺序中被调用。

  16. 使用 undefined 解析 promise

exitFullscreen()方法步骤是返回在退出全屏上运行的结果,给定this


以下是事件处理程序(及其对应的事件处理程序事件类型),它们必须被ElementDocument 对象作为事件处理程序IDL属性支持的事件处理程序:

事件处理程序 事件处理程序事件类型
onfullscreenchange fullscreenchange
onfullscreenerror fullscreenerror

这些事件处理程序不被ShadowRootWindow 对象支持,并且在任何命名空间中的Element 对象上也没有对应的事件处理程序内容属性

4. 用户界面

鼓励用户代理在实现原生媒体全屏控制时使用requestFullscreen()exitFullscreen()

如果最终用户指示用户代理结束通过requestFullscreen()启动的全屏会话,完全退出全屏,给定顶级可遍历对象活动文档

用户代理可以在没有最终用户指示或调用exitFullscreen()的情况下随时结束任何全屏会话,只要用户代理认为有必要。

5. 渲染

本节的解释应与HTML的渲染部分等效。[HTML]

5.1. :fullscreen 伪类

:fullscreen伪类必须匹配满足以下任一条件的元素element

这使其不同于fullscreenElement API,该API返回最上层的全屏元素

5.2. 用户代理级别样式表默认值

@namespace "http://www.w3.org/1999/xhtml";

*|*:not(:root):fullscreen {
  position:fixed !important;
  inset:0 !important;
  margin:0 !important;
  box-sizing:border-box !important;
  min-width:0 !important;
  max-width:none !important;
  min-height:0 !important;
  max-height:none !important;
  width:100% !important;
  height:100% !important;
  transform:none !important;

  /* intentionally not !important */
  object-fit:contain;
}

iframe:fullscreen {
  border:none !important;
  padding:0 !important;
}

*|*:not(:root):fullscreen::backdrop {
  background:black;
}

6. 权限策略集成

本规范定义了一个由字符串"fullscreen"标识的策略控制的功能。其默认允许列表'self'

文档权限策略决定了该文档中的任何内容是否被允许进入全屏模式。如果在任何文档中禁用,则该文档中的任何内容都不会 被允许使用全屏。

HTML allowfullscreen 属性会影响嵌套在该 iframe 中的任何文档的 容器策略。除非通过 allow 属性覆盖,在 allowfullscreen 上设置 <iframe allow="fullscreen *">,如Permissions Policy § 6.3.1 allowfullscreen中所述。

7. 安全性和隐私考量

用户代理应确保,例如通过覆盖层,使最终用户意识到某些内容正在全屏显示。用户代理应提供一种始终有效的退出全屏的方式,并向用户宣传这一点。这是为了防止网站通过在全屏状态下重新创建用户代理甚至操作系统环境来欺骗最终用户。另请参见requestFullscreen()的定义。

要使子可遍历对象中的内容能够全屏显示,必须通过权限策略明确允许,方式包括通过HTMLallowfullscreen属性,或通过HTMLiframe元素中的allow属性,或通过与嵌套文档一起传递的`Permissions-Policy` HTTP头部声明。

这可以防止例如第三方内容未经明确许可进入全屏模式。

本规范之前托管了::backdrop选择器和文档的顶层概念的定义。

致谢

特别感谢 Robert O’Callahan 设计了最初的模型,并且非常出色。

感谢 Andy Earnshaw, Changwan Hong, Chris Pearce, Darin Fisher, Dave Tapuska, fantasai, Giuseppe Pascale, Glenn Maynard, Ian Clelland, Ian Hickson, Ignacio Solla, João Eiras, Josh Soref, Kagami Sascha Rosylight, Matt Falkenhagen, Mihai Balan, Mounir Lamouri, Øyvind Stenhaug, Pat Ladd, Rafał Chłodnicki, Riff Jiang, Rune Lillesveen, Sigbjørn Vik, Simon Pieters, Tab Atkins-Bittner, Takayoshi Kochi, Theresa O’Connor, triple-underscore, Vincent Scheib, 和 Xidorn Quan 也非常出色。

本标准由 Philip Jägenstedt (Google, philip@foolip.org) 编辑。最初由 Anne van Kesteren (Apple, annevk@annevk.nl) 撰写。Tantek Çelik (Mozilla, tantek@cs.stanford.edu) 解决了法律问题。

知识产权

版权 © WHATWG (Apple, Google, Mozilla, Microsoft)。本作品以 知识共享署名 4.0 国际许可协议 授权。若将其部分内容纳入源代码,则源代码中的这些部分将根据 BSD 3-Clause 许可证 授权。

这是现行标准。对专利审查版本感兴趣的人士应查看现行标准审查草案

索引

本规范定义的术语

引用定义的术语

参考文献

规范性引用

[CSS]
Bert Bos; 等. 层叠样式表第 2 级修订 1 (CSS 2.1) 规范. URL: https://drafts.csswg.org/css2/
[CSS-POSITION-4]
CSS 定位布局模块第 4 级. 编辑草案. URL: https://drafts.csswg.org/css-position-4/
[DOM]
Anne van Kesteren. DOM 标准. 现行标准. URL: https://dom.spec.whatwg.org/
[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/
[MATHML]
Patrick D F Ion; Robert R Miner. 数学标记语言 (MathML™) 1.01 规范. 2023年3月7日. REC. URL: https://www.w3.org/TR/REC-MathML/
[PERMISSIONS-POLICY-1]
Ian Clelland. 权限策略. URL: https://w3c.github.io/webappsec-permissions-policy/
[SCREEN-ORIENTATION]
Marcos Caceres. 屏幕方向. URL: https://w3c.github.io/screen-orientation/
[SVG]
Erik Dahlström; 等. 可缩放矢量图形 (SVG) 1.1(第二版). 2011年8月16日. REC. URL: https://www.w3.org/TR/SVG11/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 标准. 现行标准. URL: https://webidl.spec.whatwg.org/

IDL 索引

enum FullscreenNavigationUI {
  "auto",
  "show",
  "hide"
};

dictionary FullscreenOptions {
  FullscreenNavigationUI navigationUI = "auto";
};

partial interface Element {
  Promise<undefined> requestFullscreen(optional FullscreenOptions options = {});

  attribute EventHandler onfullscreenchange;
  attribute EventHandler onfullscreenerror;
};

partial interface Document {
  [LegacyLenientSetter] readonly attribute boolean fullscreenEnabled;
  [LegacyLenientSetter, Unscopable] readonly attribute boolean fullscreen; // historical

  Promise<undefined> exitFullscreen();

  attribute EventHandler onfullscreenchange;
  attribute EventHandler onfullscreenerror;
};

partial interface mixin DocumentOrShadowRoot {
  [LegacyLenientSetter] readonly attribute Element? fullscreenElement;
};

MDN

Document/exitFullscreen

In all current engines.

Firefox64+Safari16.4+Chrome71+
Opera58+Edge79+
Edge (Legacy)NoneIENone
Firefox for Android?iOS SafariNoneChrome for Android?Android WebView71+Samsung Internet?Opera Mobile50+
MDN

Document/fullscreenchange_event

In all current engines.

Firefox64+Safari16.4+Chrome71+
Opera58+Edge79+
Edge (Legacy)NoneIENone
Firefox for Android?iOS SafariNoneChrome for Android?Android WebView71+Samsung Internet?Opera Mobile50+

Element/fullscreenchange_event

In all current engines.

Firefox64+Safari16.4+Chrome71+
Opera58+Edge79+
Edge (Legacy)NoneIENone
Firefox for Android?iOS SafariNoneChrome for Android?Android WebView71+Samsung Internet?Opera Mobile50+
MDN

Document/fullscreenElement

In all current engines.

Firefox64+Safari16.4+Chrome71+
Opera58+Edge79+
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile50+
MDN

Document/fullscreenEnabled

In all current engines.

Firefox64+Safari16.4+Chrome71+
Opera58+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS SafariNoneChrome for Android?Android WebView?Samsung Internet?Opera Mobile50+
MDN

Document/fullscreenerror_event

In all current engines.

Firefox64+Safari16.4+Chrome71+
Opera58+Edge79+
Edge (Legacy)NoneIENone
Firefox for Android?iOS SafariNoneChrome for Android?Android WebView71+Samsung Internet?Opera Mobile50+

Element/fullscreenerror_event

In all current engines.

Firefox64+Safari16.4+Chrome71+
Opera58+Edge79+
Edge (Legacy)NoneIENone
Firefox for Android?iOS SafariNoneChrome for Android?Android WebView71+Samsung Internet?Opera Mobile50+
MDN

Element/requestFullscreen

In all current engines.

Firefox64+Safari16.4+Chrome71+
Opera58+Edge79+
Edge (Legacy)NoneIENone
Firefox for Android64+iOS SafariNoneChrome for Android?Android WebView71+Samsung Internet?Opera Mobile50+
MDN

Element

In all current engines.

Firefox1+Safari1+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+IE4+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile10.1+
MDN

ShadowRoot/fullscreenElement

In all current engines.

Firefox64+Safari16.4+Chrome71+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

:fullscreen

Firefox64+SafariNoneChrome71+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS SafariNoneChrome for Android?Android WebView71+Samsung Internet?Opera Mobile?
MDN

Headers/Feature-Policy/fullscreen

In only one current engine.

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

Headers/Permissions-Policy/fullscreen

In only one current engine.

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