1. 背景
本规范中定义的许多特性,浏览器早已支持很长时间。本规范的目标是以所有浏览器都能实现且互操作的方式来定义这些特性。此外,规范也定义了一些新的滚动定制相关特性。
2. 术语
本规范中使用的术语来自 DOM、CSSOM 和 HTML。[DOM] [CSSOM] [HTML]
一个元素 body(即 body
元素)在以下所有条件都为真时,被认为是 可能可滚动:
-
body 有一个关联的 盒子。
-
body 的 父元素的 overflow-x 或 overflow-y 属性的计算值既不是 visible,也不是 clip。
-
body 的 overflow-x 或 overflow-y 属性的计算值既不是 visible,也不是 clip。
注意:
body
元素即使被认为是 可能可滚动,也可能没有 滚动盒。
例如,其 overflow
的使用值可能为 auto,但内容没有溢出其内容区域。
一个 滚动盒,属于 视口或元素,有两个 溢出方向,即该视口或元素的 块结束和 行内结束方向。 注意,初始滚动位置不一定与 滚动区域原点对齐,具体取决于 内容分布属性,参考 CSS Box Alignment 3 § 5.3 对齐溢出与滚动容器。
术语 滚动区域 指的是一个 视口或元素的盒子,具体边界由该 视口或元素的 滚动盒的 溢出方向决定。
如果 溢出方向为… | 对于 视口 | 对于元素 |
---|---|---|
向右且向下 | ||
向左且向下 | ||
向左且向上 | ||
向右且向上 |
原点:滚动区域的原点是,如果该 滚动区域是 视口,则为 初始包含块的原点;否则为元素默认滚动位置时的左上内边距边。x 坐标向右增加,y 坐标向下增加。
起始边:某个盒子或元素的一组边的起始边如下:
- 如果 溢出方向为向右且向下
- 上边和左边。
- 如果 溢出方向为向左且向下
- 上边和右边。
- 如果 溢出方向为向左且向上
- 下边和右边。
- 如果 溢出方向为向右且向上
- 下边和左边。
结束边:某个盒子或元素的一组边的结束边如下:
- 如果 溢出方向为向右且向下
- 下边和右边。
- 如果 溢出方向为向左且向下
- 下边和左边。
- 如果 溢出方向为向左且向上
- 上边和左边。
- 如果 溢出方向为向右且向上
- 上边和右边。
视觉视口是一种 视口,其 滚动区域是另一个 视口,称为 布局视口。
除了滚动外,视觉视口还可能对其 布局视口应用缩放变换。 此变换应用于 布局视口的画布,但不会影响其内部坐标空间。
注意:视觉视口的缩放变换通常称为“捏合缩放(pinch-zoom)”。从概念上说,这种变换改变了 CSS 参考像素的大小,但会按比例改变布局视口的大小,从而不会导致页面内容重排。
缩放变换的幅度称为 视觉视口的 缩放因子。
此动画展示了一个被缩放的视觉视口被“平移”(比如用户进行触摸拖动)的示例。页面被缩放后,布局视口会比视觉视口更大。
滚动增量会首先应用于视觉视口。当视觉视口到达其边界时,滚动增量会应用到布局视口。此行为由 执行滚动步骤实现。
VisualViewport
对象有一个
关联的文档,
这是一个
Document
对象。
它是拥有
Window
的
关联文档
,该
VisualViewport
属于这个
Window。
布局视口
是该
Window
的
视口。
在本规范要求中,display 属性的计算值为 table-column 或 table-column-group 的元素,必须被视为有一个关联的 盒子(分别为列或列组)。
术语 SVG 布局盒
指由 SVG 元素生成的 盒子,其不对应任何 CSS 定义的 display
类型。
(例如 盒子由
rect
元素生成。)
术语 变换 指 SVG 变换与 CSS 变换。[SVG11] [CSS-TRANSFORMS-1]
当某个方法或属性被称为调用另一个方法或属性时,用户代理必须调用该属性或方法的内部 API,以保证作者不能通过在 ECMAScript 中覆写属性或方法(如自定义属性或函数)来改变其行为。
除非另有说明,所有字符串比较均使用 is。
2.1. CSS 像素
除非另有说明,本规范中定义的 API 的所有坐标和尺寸均以 CSS 像素为单位。[CSS-VALUES]
注意: 这不适用于如 matchMedia()
等,因为这些地方的单位已明确定义。
2.2. 缩放
有两种缩放方式:页面缩放,影响初始视口的大小;以及视觉视口的 缩放因子,类似放大镜,并不影响初始视口或实际视口。[CSS-DEVICE-ADAPT]
注意: “缩放因子”通常称为“捏合缩放(pinch-zoom)”;但也可能通过其他方式改变。例如,用户代理可能会对聚焦的输入框进行缩放以提高可读性。
2.3. Web 暴露的屏幕信息
用户代理可以选择隐藏输出设备屏幕的信息,以保护用户隐私。为确保各 API 一致处理,本规范定义了以下术语,每个术语都包含宽度和高度,原点为左上角,x、y 坐标分别向右和向下递增。
Web 暴露的屏幕区域包括以下之一:
Web 暴露的可用屏幕区域包括以下之一:
3. 通用基础设施
本规范依赖 WHATWG Infra 标准。[INFRA]
3.1. 滚动
当用户代理需要执行滚动
某个滚动盒 box
到指定位置 position,并指定一个关联元素或
伪元素 element
,可选地指定滚动行为 behavior(若省略则为 "auto
"),
必须按照以下步骤进行:
- 中止 box 上正在进行的 平滑滚动。
-
如果用户代理支持 scroll-behavior 属性,且以下任一条件为真:
- behavior 为 "
auto
" 且 element 非空,并且其 scroll-behavior 属性计算值为 smooth - behavior 为
smooth
注意:
behavior: "instant"
始终按此算法执行 瞬时滚动。注意: 如果滚动位置因用户操作或编程调用未发生变化,也未产生任何平移,则不会触发 scrollend 事件,因为没有发生滚动。
- behavior 为 "
当用户代理需要执行滚动
某个视口到指定位置
position,并可选指定滚动行为 behavior(若省略则为 "auto
"),
必须按照以下步骤执行协调视口滚动:
-
令 vv 为
VisualViewport
,其 关联文档为 doc。 -
令 dx 为 position 的水平分量减去 vv 的 pageLeft 属性值。
-
令 dy 为 position 的垂直分量减去 vv 的 pageTop 属性值。
-
令 visual x 为 vv 的 offsetLeft 属性值。
-
令 visual y 为 vv 的 offsetTop 属性值。
-
令 visual dx 为 min(maxX, max(0, visual x + dx)) - visual x。
-
令 visual dy 为 min(maxY, max(0, visual y + dy)) - visual y。
-
令 layout dx 为 dx - visual dx
-
令 layout dy 为 dy - visual dy
-
令 element 为 doc 的根元素(如有),否则为 null。
-
将 执行滚动 应用于 视口 的 滚动盒 ,将其滚动到当前滚动位置 + (layout dx, layout dy),并将 element 作为关联元素,behavior 作为滚动行为。
-
对 vv 的 滚动盒 执行滚动 ,将其滚动到当前滚动位置 + (visual dx, visual dy),并将 element 作为关联元素,behavior 作为滚动行为。
注意: 从概念上讲,视觉视口会被滚动,直到“碰到”布局视口边缘,然后“推动”布局视口,将滚动增量应用到布局视口。但上述步骤的滚动会预先计算并按相反顺序应用,以便先滚动布局视口再滚动视觉视口。这是历史原因,以保证滚动事件顺序一致。可参见上方示例。
当滚动位置没有待更新或平移,且用户已完成手势时,滚动即完成。滚动位置更新包括鼠标滚轮平滑或瞬时滚动、键盘滚动、滚动捕捉事件、或其它导致滚动位置变化并可能插值的 API 和手势。触摸拖动或触控板滚动等用户手势,直到指针或按键释放才算完成。
当用户代理需要对 滚动盒 box进行 平滑滚动到 position,应以用户代理定义的方式和时长更新 box 的滚动位置。滚动完成时,box 的滚动位置必须为 position。滚动也可能被算法或用户中止。
当用户代理需要对 滚动盒 box进行瞬时滚动到 position,应将 box 的滚动位置立即更新为 position。
要对文档 document滚动到文档开头,执行以下步骤:
- 令 viewport 为 与 document 关联的视口。
- 令 position 为将 滚动区域的起始边与 viewport 的起始边对齐时 viewport 的滚动位置。
- 如果 position 与 viewport 当前滚动位置相同,且 viewport 没有正在进行的 平滑滚动,则中止后续步骤。
- 对 viewport 执行滚动到 position, 关联元素为 document 的 根元素(如有),否则为 null。
注意: 当跳转到 #top
片段标识符时会用到此算法,HTML 已定义。[HTML]
测试
- interrupt-hidden-smooth-scroll.html (在线测试) (源码)
- long_scroll_composited.html (在线测试) (源码)
- scroll-back-to-initial-position.html (在线测试) (源码)
- scrolling-no-browsing-context.html (在线测试) (源码)
- scrolling-quirks-vs-nonquirks.html (在线测试) (源码)
- smooth-scroll-in-load-event.html (在线测试) (源码)
- smooth-scroll-nonstop.html (在线测试) (源码)
3.2. WebIDL 值
当被要求为值 x 规范化非有限值 时,若 x 是三种特殊浮点文字值之一
(Infinity
, -Infinity
或 NaN
),
则必须将 x 更改为值 0
。[WEBIDL]
4.
对 Window
接口的扩展
enum {
ScrollBehavior ,
"auto" ,
"instant" };
"smooth" dictionary {
ScrollOptions ScrollBehavior = "auto"; };
behavior dictionary :
ScrollToOptions ScrollOptions {unrestricted double ;
left unrestricted double ; };
top partial interface Window { [NewObject ]MediaQueryList matchMedia (CSSOMString ); [
query SameObject ,Replaceable ]readonly attribute Screen screen ; [SameObject ,Replaceable ]readonly attribute VisualViewport ?visualViewport ; // browsing contextundefined moveTo (long ,
x long );
y undefined moveBy (long ,
x long );
y undefined resizeTo (long ,
width long );
height undefined resizeBy (long ,
x long ); // viewport [
y Replaceable ]readonly attribute long innerWidth ; [Replaceable ]readonly attribute long innerHeight ; // viewport scrolling [Replaceable ]readonly attribute double scrollX ; [Replaceable ]readonly attribute double pageXOffset ; [Replaceable ]readonly attribute double scrollY ; [Replaceable ]readonly attribute double pageYOffset ;undefined scroll (optional ScrollToOptions = {});
options undefined scroll (unrestricted double ,
x unrestricted double );
y undefined scrollTo (optional ScrollToOptions = {});
options undefined scrollTo (unrestricted double ,
x unrestricted double );
y undefined scrollBy (optional ScrollToOptions = {});
options undefined scrollBy (unrestricted double ,
x unrestricted double ); // client [
y Replaceable ]readonly attribute long screenX ; [Replaceable ]readonly attribute long screenLeft ; [Replaceable ]readonly attribute long screenY ; [Replaceable ]readonly attribute long screenTop ; [Replaceable ]readonly attribute long outerWidth ; [Replaceable ]readonly attribute long outerHeight ; [Replaceable ]readonly attribute double devicePixelRatio ; };
当调用 matchMedia(query)
方法时,必须运行下列步骤:
- 令 parsed media query list 为对 query 执行 解析 的结果。
- 返回一个新的
MediaQueryList
对象,其 this 的 关联Document
作为该对象的 document,并以 parsed media query list 作为其关联的 media query list。
screen
属性必须返回与该 Screen
对象关联的 Window
对象的 Screen 对象。
注意: 通过 WindowProxy
对象访问 screen
时,在文档导航时可能会得到不同结果。
如果 关联文档 是 fully active(完全活动) 的,则 visualViewport
属性必须返回与该 VisualViewport
对象关联的 VisualViewport 对象。否则,必须返回 null。
注意: VisualViewport 对象只对当前正在呈现其 Document 的窗口返回并有用。如果保留对某个关联文档未被呈现的 VisualViewport 的引用,则该 VisualViewport 中的值不得泄露关于浏览上下文的任何信息。
Tests
moveTo(x, y)
方法必须遵循下列步骤:
-
可选地,返回。
-
令 target 为 this 的 相关全局对象 的 browsing context。
-
如果 target 不是由脚本创建的(即不是由用户动作创建的)辅助浏览上下文(auxiliary browsing context),则返回。
-
可选地,以用户代理定义的方式将 x 和 y 限定,以使窗口不会移出可用空间。
-
移动 target 的窗口,使窗口左上角位于相对于输出设备左上角的坐标 (x, y),测量单位为 CSS pixels(正方向为右和下)。
moveBy(x, y)
方法必须遵循下列步骤:
-
可选地,返回。
-
令 target 为 this 的 相关全局对象 的 browsing context。
-
如果 target 不是由脚本创建的辅助浏览上下文,则返回。
-
可选地,以用户代理定义的方式将 x 和 y 限定,以使窗口不会移出可用空间。
-
将 target 的窗口向右移动 x 个 CSS pixels,并向下移动 y 个 CSS pixels。
resizeTo(width, height)
方法必须
遵循下列步骤:
-
可选地,返回。
-
令 target 为 this 的 相关全局对象 的 browsing context。
-
如果 target 不是由脚本创建的辅助浏览上下文,则返回。
-
可选地,以用户代理定义的方式将 width 和 height 限定,以使窗口不会过小或超出可用空间。
-
通过移动其右和下边缘来调整 target 窗口的大小,使视口的左右边距离为 width 个 CSS pixels,上下边距离为 height 个 CSS pixels。
-
可选地,以用户代理定义的方式移动 target 的窗口,使其不超出可用空间。
Tests
resizeBy(x, y)
方法必须遵循下列步骤:
-
可选地,返回。
-
令 target 为 this 的 相关全局对象 的 browsing context。
-
如果 target 不是由脚本创建的辅助浏览上下文,则返回。
-
可选地,以用户代理定义的方式将 x 和 y 限定,以使窗口不会过小或超出可用空间。
-
通过将其右边缘向右移动 x 个 CSS pixels,并将其下边缘向下移动 y 个 CSS pixels,来调整 target 的窗口大小。
-
可选地,以用户代理定义的方式移动 target 的窗口,使其不超出可用空间。
innerWidth
属性必须返回包括已渲染滚动条(如有)大小在内的 视口 宽度,若不存在视口则返回零。
innerHeight
属性必须返回包括已渲染滚动条(如有)大小在内的 视口
高度,若不存在视口则返回零。
scrollX
属性必须返回相对于 initial containing block 原点的 x 坐标,
即视口左侧的位置,若不存在视口则返回零。
pageXOffset
属性必须返回 scrollX
属性的值。
scrollY
属性必须返回相对于 initial containing block 原点的 y 坐标,
即视口顶部的位置,若不存在视口则返回零。
pageYOffset
属性必须返回 scrollY
属性的值。
当调用 scroll()
方法时,必须运行下列步骤:
-
如果以一个参数调用,请执行下列子步骤:
-
如果以两个参数调用,请执行下列子步骤:
-
将 options 设为将 null 转换 为
ScrollToOptions
字典的结果。[WEBIDL] -
令 x 和 y 分别为传入的两个参数。
-
-
对 x 和 y 执行 规范化非有限值。
-
如果不存在 视口,则中止这些步骤。
-
令 viewport width 为排除滚动条宽度(如有)后的 视口 宽度。
-
令 viewport height 为排除滚动条高度(如有)后的 视口 高度。
-
令 position 为通过将 视口 滚动区域 的 x 坐标 x 与视口的左侧对齐,以及将该滚动区域的 y 坐标 y 与视口的顶部对齐,视口将会具有的滚动位置。
-
对该视口执行滚动 到 position,并以 document 的 根元素(如有)作为关联元素,若无则为 null,滚动行为为 options 的
behavior
字段的值。用户代理对该步骤应使用协调的 viewport 的 perform a scroll 还是对布局视口的滚动盒执行 perform a scroll 存在分歧。
Tests
当调用 scrollTo()
方法时,用户代理必须如同使用相同参数调用 scroll()
方法一样进行处理。
当调用 scrollBy()
方法时,用户代理必须运行下列步骤:
-
如果以两个参数调用,请执行下列子步骤:
-
将 options 设为将 null 转换 为
ScrollToOptions
字典的结果。[WEBIDL] -
令 x 和 y 分别为传入的两个参数。
-
令
left
字典成员的值为 x。 -
令
top
字典成员的值为 y。
-
-
如同以 options 作为唯一参数调用
scroll()
方法一样进行处理。
screenX
与 screenLeft
属性必须返回相对于 Web-exposed screen area
原点的客户端窗口左侧的 x 坐标,单位为 CSS pixels,若不存在则返回零。
Tests
screenY
与 screenTop
属性必须返回相对于 Web-exposed screen area
原点的客户端窗口顶部的 y 坐标,单位为 CSS pixels,若不存在则返回零。
outerWidth
属性必须返回客户端窗口的宽度;如果不存在客户端窗口则返回零。
outerHeight
属性必须返回客户端窗口的高度;如果不存在客户端窗口则返回零。
devicePixelRatio
属性必须返回下述 确定设备像素比率 算法的结果:
-
如果不存在输出设备,返回 1 并中止这些步骤。
-
令 CSS pixel size 为在当前 page zoom 且使用 scale factor 为 1.0 时的 CSS pixel 的大小。
-
令 device pixel size 为输出设备的设备像素的垂直尺寸。
-
返回 CSS pixel size 除以 device pixel size 的结果。
4.1. features 参数用于 open()
方法
HTML 定义了 open()
方法。本节定义了在 features 参数中给出的 位置 和 大小 的行为。[HTML]
要为给定的浏览上下文 target 使用一个 map tokenizedFeatures 来 设置浏览上下文特性:
-
令 x 为 null。
-
令 y 为 null。
-
令 width 为 null。
-
令 height 为 null。
-
如果 tokenizedFeatures["left"] 存在:
-
如果 x 是一个错误,则将 x 设为 0。
-
可选地,以用户代理定义的方式将 x 限定,使窗口不会移出 Web 暴露的可用屏幕区域。
-
可选地,移动 target 的窗口,使窗口的左边位于相对于 Web 暴露的屏幕区域 左边缘 的水平坐标 x,以 CSS 像素(相对于 target)为度量单位。正方向为向右。
-
如果 tokenizedFeatures["top"] 存在:
-
如果 y 是一个错误,则将 y 设为 0。
-
可选地,以用户代理定义的方式将 y 限定,使窗口不会移出 Web 暴露的可用屏幕区域。
-
可选地,移动 target 的窗口,使窗口的上边位于相对于 Web 暴露的屏幕区域 顶边 的垂直坐标 y,以 CSS 像素(相对于 target)为度量单位。正方向为向下。
-
如果 tokenizedFeatures["width"] 存在:
-
如果 width 是一个错误,则将 width 设为 0。
-
如果 width 不为 0:
-
可选地,以用户代理定义的方式将 width 限定,使窗口不会过小或超出 Web 暴露的可用屏幕区域。
-
可选地,通过移动 target 的右边,使视口的左右边之间的距离为 width 个相对于 target 的 CSS 像素,以此来调整窗口的大小。
-
可选地,以用户代理定义的方式移动 target 的窗口,使其不会超出 Web 暴露的可用屏幕区域。
-
-
如果 tokenizedFeatures["height"] 存在:
-
如果 height 是一个错误,则将 height 设为 0。
-
如果 height 不为 0:
-
可选地,以用户代理定义的方式将 height 限定,使窗口不会过小或超出 Web 暴露的可用屏幕区域。
-
可选地,通过移动 target 的下边,使视口的上下边之间的距离为 height 个相对于 target 的 CSS 像素,以此来调整窗口的大小。
-
可选地,以用户代理定义的方式移动 target 的窗口,使其不会超出 Web 暴露的可用屏幕区域。
-
一个 受支持的
open()
特性名 是下列之一:
- width
- 视口的宽度。
- height
- 视口的高度。
- left
- 窗口的左侧位置。
- top
- 窗口的顶部位置。
4.2.
MediaQueryList
接口
一个 MediaQueryList
对象在创建时具有一个关联的 media query list 和一个关联的 document。
MediaQueryList
对象有一个关联的
media
,它是关联的
序列化
形式的
媒体查询列表
。
一个 MediaQueryList
对象具有一个关联的 matches state,当关联的 media query
list 与该 document 的状态匹配时该值为 true,否则为 false。
在被要求为一个 Document
doc 评估媒体查询并报告变更 时,运行下列步骤:
-
对于每个以创建顺序(最早创建者先)遍历的、其 document 为 doc 的
MediaQueryList
对象 target,运行下列子步骤:- 如果自上次运行这些步骤以来 target 的 matches state 已改变,则在 target 上 触发事件,事件名为 change,使用
MediaQueryListEvent
,其isTrusted
属性初始化为 true, 其media
属性初始化为 target 的 media, 并且其matches
属性初始化为 target 的 matches state。
- 如果自上次运行这些步骤以来 target 的 matches state 已改变,则在 target 上 触发事件,事件名为 change,使用
function handleOrientationChange( event) { if ( event. matches) // landscape …else …} var mql= matchMedia( "(orientation:landscape)" ); mql. onchange= handleOrientationChange;
[Exposed =Window ]interface :
MediaQueryList EventTarget {readonly attribute CSSOMString media ;readonly attribute boolean matches ;undefined addListener (EventListener ?);
callback undefined removeListener (EventListener ?);
callback attribute EventHandler onchange ; };
属性 media
必须返回关联的 media。
属性 matches
必须返回关联的 matches state。
当调用方法 addListener(callback)
时,必须运行下列步骤:
当调用方法 removeListener(callback)
时,必须运行下列步骤:
-
如果 this 的 事件监听器列表 中 包含 一个 事件监听器,其 类型 为
change
,其 回调 为 callback,且 capture 为 false,则使用 移除事件监听器 的步骤,从 this 中移除该事件监听器。
注意: 本规范最初有一个自定义的回调机制,使用 addListener()
和 removeListener()
,
回调会以关联的 media query list 作为参数被调用。现在改为使用普通的事件机制。为向后兼容,addListener()
和 removeListener()
方法基本上分别是 addEventListener()
和 removeEventListener()
的别名,并且 change
事件会伪装成 MediaQueryList
。
下列为所有实现 MediaQueryList
接口的对象必须支持的 事件处理程序(及其对应的 事件处理类型),以作为 事件处理 IDL 属性:
Event handler | Event handler event type |
---|---|
onchange
| change |
Tests
- MediaQueryList-addListener-handleEvent.html (在线测试) (源码)
- MediaQueryList-addListener-removeListener.html (在线测试) (源码)
- MediaQueryList-change-event-matches-value.html (在线测试) (源码)
- MediaQueryList-extends-EventTarget-interop.html (在线测试) (源码)
- MediaQueryList-extends-EventTarget.html (在线测试) (源码)
- MediaQueryListEvent.html 在线测试) (源码)
[Exposed =Window ]interface :
MediaQueryListEvent Event {(
constructor CSSOMString ,
type optional MediaQueryListEventInit = {});
eventInitDict readonly attribute CSSOMString media ;readonly attribute boolean matches ; };dictionary :
MediaQueryListEventInit EventInit {CSSOMString = "";
media boolean =
matches false ; };
属性 media
必须返回它被初始化为的值。
属性 matches
必须返回它被初始化为的值。
4.2.1. 事件摘要
本节为非规范性内容。
事件 | 接口 | 感兴趣的目标 | 描述 |
---|---|---|---|
change
|
MediaQueryListEvent
|
MediaQueryList
|
当
MediaQueryList
的
matches state
发生变化时触发。
|
4.3. Screen
接口
正如其名称所示,Screen
接口表示有关输出设备屏幕的信息。
[Exposed =Window ]interface {
Screen readonly attribute long availWidth ;readonly attribute long availHeight ;readonly attribute long width ;readonly attribute long height ;readonly attribute unsigned long colorDepth ;readonly attribute unsigned long pixelDepth ; };
属性 availWidth
必须返回 Web
暴露的可用屏幕区域 的宽度。
属性 availHeight
必须返回 Web
暴露的可用屏幕区域 的高度。
属性 width
必须返回 Web 暴露的屏幕区域 的宽度。
属性 height
必须返回 Web 暴露的屏幕区域 的高度。
属性 colorDepth
和 pixelDepth
应返回输出设备上每像素用于颜色的位数(不包括 alpha
通道)。如果用户代理无法返回输出设备所使用的确切位数,则应返回最接近的估计值,例如发送到显示器的帧缓冲使用的位数或任何内部表示的位数,这些值最接近输出设备将使用的值。用户代理必须返回一个至少等于 color 媒体特性乘以三的值。如果不同的颜色分量使用的位数不相等,则返回值可能大于 color 媒体特性值的三倍。如果用户代理不知道颜色深度或出于隐私原因不想返回它,应返回 24。
注意: 为了兼容性,属性 colorDepth
和 pixelDepth
返回相同的值。
注意: 已知一些不符合规范的实现会返回 32 而不是 24。
Tests
5.
对 Document
接口的扩展
partial interface Document {Element ?elementFromPoint (double ,
x double );
y sequence <Element >elementsFromPoint (double ,
x double );
y CaretPosition ?caretPositionFromPoint (double ,
x double ,
y optional CaretPositionFromPointOptions = {});
options readonly attribute Element ?scrollingElement ; };dictionary {
CaretPositionFromPointOptions sequence <ShadowRoot >= []; };
shadowRoots
elementFromPoint(x, y)
方法必须遵循以下步骤:
-
如果任一参数为负数,x大于视口宽度(不包括已呈现滚动条的大小,如果有),或y大于视口高度(不包括已呈现滚动条的大小,如果有),或者文档没有关联的视口,则返回 null 并终止这些步骤。
-
如果文档有根元素,则返回根元素并终止这些步骤。
-
返回 null。
注意:elementFromPoint()
方法不一定返回最顶部绘制的元素。例如,可以通过 CSS 属性 pointer-events 将某元素排除在命中测试目标之外。
测试
- elementFromPoint-001.html (在线测试) (源码)
- elementFromPoint-002.html (在线测试) (源码)
- elementFromPoint-003.html (在线测试) (源码)
- elementFromPoint-dynamic-anon-box.html (在线测试) (源码)
- elementFromPoint-ellipsis-in-inline-box.html (在线测试) (源码)
- elementFromPoint-float-in-relative.html (在线测试) (源码)
- elementFromPoint-float-in-table.html (在线测试) (源码)
- elementFromPoint-list-001.html (在线测试) (源码)
- elementFromPoint-mixed-font-sizes.html (在线测试) (源码)
- elementFromPoint-parameters.html (在线测试) (源码)
- elementFromPoint-subpixel.html (在线测试) (源码)
- elementFromPoint-visibility-hidden-resizer.html (在线测试) (源码)
- elementFromPoint.html (在线测试) (源码)
- elementFromPosition.html (在线测试) (源码)
- negativeMargins.html (在线测试) (源码)
elementsFromPoint(x, y)
方法必须遵循以下步骤:
-
令sequence为一个新的空序列。
-
如果任一参数为负数,x大于视口宽度(不包括已呈现滚动条的大小,如果有),或y大于视口高度(不包括已呈现滚动条的大小,如果有),或者文档没有关联的视口,则返回sequence并终止这些步骤。
-
对于盒子在视口中,以绘制顺序(从最顶部的盒子开始),能够成为坐标 x,y 的命中测试目标,即使没有重叠,应用适用于视口后代的变换后,将关联的元素添加到sequence中。
-
如果文档有根元素,且sequence的最后一项不是根元素,则将根元素添加到sequence中。
-
返回sequence。
测试
- elementsFromPoint-iframes.html (在线测试) (源码)
- elementsFromPoint-inline-htb-ltr.html (在线测试) (源码)
- elementsFromPoint-inline-htb-rtl.html (在线测试) (源码)
- elementsFromPoint-inline-vlr-ltr.html (在线测试) (源码)
- elementsFromPoint-inline-vlr-rtl.html (在线测试) (源码)
- elementsFromPoint-inline-vrl-ltr.html (在线测试) (源码)
- elementsFromPoint-inline-vrl-rtl.html (在线测试) (源码)
- elementsFromPoint-invalid-cases.html (在线测试) (源码)
- elementsFromPoint-shadowroot.html (在线测试) (源码)
- elementsFromPoint-simple.html (在线测试) (源码)
- elementsFromPoint-svg-text.html (在线测试) (源码)
- elementsFromPoint-svg.html (在线测试) (源码)
- elementsFromPoint-table.html (在线测试) (源码)
- elementsFromPoint.html (在线测试) (源码)
caretPositionFromPoint(x, y, options)
方法必须返回运行以下步骤的结果:
-
如果文档没有关联的视口,返回 null。
-
如果任一参数为负数,x大于视口宽度(不包括已呈现滚动条的大小,如果有),y大于视口高度(不包括已呈现滚动条的大小,如果有),则返回 null。
-
如果在视口中的坐标 x,y 处,应用适用于视口后代的变换后,文本插入点指示器会插入到也是替换元素的文本输入控件中,则返回一个插入点位置,其属性如下:
-
否则:
-
令caretPosition为一个元组,包含caretPositionNode(一个节点)和caretPositionOffset(一个非负整数),表示应用适用于变换后的视口后代,在插入文本指示器时的位置。
-
令startNode为caretPosition的caretPositionNode,令startOffset为caretPosition的caretPositionOffset。
-
当startNode是节点,startNode的根是shadow root,并且startNode的根不是options["
shadowRoots
"]中任何一个的包含 shadow 的祖先,重复以下步骤: -
返回一个插入点位置,其属性如下:
-
注意:命中测试的具体细节不在本规范范围内,因此elementFromPoint()
和 caretPositionFromPoint()
的具体细节也不在范围内。命中测试有望在未来的 CSS 或 HTML 修订中被定义。
scrollingElement
属性,在获取时,必须运行以下步骤:
-
如果存在根元素,则返回根元素并中止这些步骤。
-
返回 null。
注意:对于总是采用
怪异模式行为的非兼容用户代理,
在 scrollTop
和 scrollLeft
上,
scrollingElement
属性也应始终返回 body
元素(或如果不存在则为 null)。
此 API 的存在是为了让 Web 开发者能正确获取用于滚动 API 的元素,
无需假设某个特定用户代理的行为,也无需通过实际滚动来判断哪个元素会滚动视口。
注意:body
元素与 HTML 的
document.body
不同,后者可能返回 frameset
元素。
测试
5.1.
CaretPosition
接口
插入符号位置
指的是文本插入点指示器所在的位置。它总是关联一个插入符号节点和插入符号偏移量。它由一个 CaretPosition
对象表示。
[Exposed =Window ]interface {
CaretPosition readonly attribute Node offsetNode ;readonly attribute unsigned long offset ; [NewObject ]DOMRect ?getClientRect (); };
offsetNode
属性必须返回 插入符号节点。
offset
属性必须返回 插入符号偏移量。
getClientRect()
方法必须按照以下步骤执行,遇到返回值时即终止:
6. 对 Element
接口的扩展
enum {
ScrollLogicalPosition ,
"start" ,
"center" ,
"end" };
"nearest" dictionary :
ScrollIntoViewOptions ScrollOptions {ScrollLogicalPosition = "start";
block ScrollLogicalPosition = "nearest";
inline ScrollIntoViewContainer = "all"; };
container enum {
ScrollIntoViewContainer ,
"all" };
"nearest" dictionary {
CheckVisibilityOptions boolean =
checkOpacity false ;boolean =
checkVisibilityCSS false ;boolean =
contentVisibilityAuto false ;boolean =
opacityProperty false ;boolean =
visibilityProperty false ; };partial interface Element {DOMRectList getClientRects (); [NewObject ]DOMRect getBoundingClientRect ();boolean checkVisibility (optional CheckVisibilityOptions = {});
options undefined scrollIntoView (optional (boolean or ScrollIntoViewOptions )= {});
arg undefined scroll (optional ScrollToOptions = {});
options undefined scroll (unrestricted double ,
x unrestricted double );
y undefined scrollTo (optional ScrollToOptions = {});
options undefined scrollTo (unrestricted double ,
x unrestricted double );
y undefined scrollBy (optional ScrollToOptions = {});
options undefined scrollBy (unrestricted double ,
x unrestricted double );
y attribute unrestricted double scrollTop ;attribute unrestricted double scrollLeft ;readonly attribute long scrollWidth ;readonly attribute long scrollHeight ;readonly attribute long clientTop ;readonly attribute long clientLeft ;readonly attribute long clientWidth ;readonly attribute long clientHeight ;readonly attribute double currentCSSZoom ; };
注意:checkOpacity
和 checkVisibilityCSS
属性是历史名称。
这些属性有与新命名方案一致的别名,
即 opacityProperty
和 visibilityProperty
。
getClientRects()
方法被调用时,必须返回以下算法的执行结果:
-
如果所调用元素没有关联的 盒,返回空的
DOMRectList
对象并停止算法。 -
如果元素有 SVG 布局盒,则返回包含一个 缩放
DOMRectList
对象的列表,包含一个描述该元素边界框的DOMRect
对象,并应用元素及其祖先的 变换。 -
返回包含按内容顺序排列的
DOMRect
对象的DOMRectList
,每个对象对应一个 盒片段, 描述其边框区域(包括高或宽为零的片段),并且有如下约束:
注意:DOMRect
对象由 getClientRects()
返回时不是 实时 的。
测试
- cssom-getClientRects-002.html (在线测试) (源码)
- cssom-getClientRects.html (在线测试) (源码)
- DOMRectList.html (在线测试) (源码)
- getClientRects-br-htb-ltr.html (在线测试) (源码)
- getClientRects-br-htb-rtl.html (在线测试) (源码)
- getClientRects-br-vlr-ltr.html (在线测试) (源码)
- getClientRects-br-vlr-rtl.html (在线测试) (源码)
- getClientRects-br-vrl-ltr.html (在线测试) (源码)
- getClientRects-br-vrl-rtl.html (在线测试) (源码)
- getClientRects-inline-atomic-child.html (在线测试) (源码)
- getClientRects-inline-inline-child.html (在线测试) (源码)
- getClientRects-inline.html (在线测试) (源码)
- getClientRects-zoom.html (在线测试) (源码)
- historical.html (在线测试) (源码)
- ttwf-js-cssomview-getclientrects-length.html (在线测试) (源码)
getBoundingClientRect()
方法,在
某个元素 element 上调用时,必须返回 获取边界框 的结果。
注意:DOMRect
对象由 getBoundingClientRect()
返回后不是 实时的。
div
元素的尺寸:
var example= document. getElementsByTagName( "div" )[ 0 ]. getBoundingClientRect(); var exampleWidth= example. width; var exampleHeight= example. height;
测试
- cssom-getBoundingClientRect-001.html (在线测试) (源码)
- cssom-getBoundingClientRect-002.html (在线测试) (源码)
- cssom-getBoundingClientRect-003.html (在线测试) (源码)
- cssom-getBoundingClientRect-vertical-rl.html (在线测试) (源码)
- getBoundingClientRect-empty-inline.html (在线测试) (源码)
- getBoundingClientRect-newline.html (在线测试) (源码)
- getBoundingClientRect-scroll.html (在线测试) (源码)
- getBoundingClientRect-shy.html (在线测试) (源码)
- getBoundingClientRect-svg.html (在线测试) (源码)
- getBoundingClientRect-zoom.html (在线测试) (源码)
- GetBoundingRect.html (在线测试) (源码)
checkVisibility()
方法
提供了一套简单检查,
用于判断某个元素是否有可能“可见”。
默认采用非常简单和直接的方式,
基于 盒树,
但允许启用一些额外检查,
以满足对“可见性”更精确的需求。
checkVisibility(options)
方法
在 this 元素上调用时,必须运行以下步骤:
-
如果 this 没有关联的 盒, 返回 false。
-
如果 this 在 扁平树 中的某个祖先具有 content-visibility: hidden, 返回 false。
-
如果 options 的字典成员
opacityProperty
或checkOpacity
为 true, 且 this 或其在 扁平树 中的祖先 的 opacity 计算值为 0, 返回 false。 -
如果 options 的字典成员
visibilityProperty
或checkVisibilityCSS
为 true, 且 this 是 不可见的, 返回 false。 -
如果 options 的字典成员
contentVisibilityAuto
为 true 且 this 在 扁平树 中的某个祖先 因 content-visibility: auto 跳过其内容, 返回 false。 -
返回 true。
scrollIntoView(arg)
方法必须按以下步骤运行:
-
令 behavior 为 "
auto
"。 -
令 block 为 "
start
"。 -
令 inline 为 "
nearest
"。 -
令 container 为
null
。 -
如果 arg 是一个
ScrollIntoViewOptions
字典,则: -
否则,如果 arg 为 false,则将 block 设置为 "
end
"。 -
如果该元素没有任何关联的 盒, 或不可被用户代理功能访问, 则返回。
-
使用 behavior、block、inline 和 container 将元素滚动到可视区域。
-
可选地执行其他能让用户注意到该元素的操作。
< style >
. scroller { overflow : auto ; scroll-padding : 8 px ; }
. slide { scroll-margin : 16 px ; scroll-snap-align : center ; }
</ style >
< div class = "carousel" >
< div class = "slides scroller" >
< div id = "s1" class = "slide" >
< div id = "s2" class = "slide" >
< div id = "s3" class = "slide" >
</ div >
< div class = "markers" >
< button data-target = "s1" > 1</ button >
< button data-target = "s2" > 2</ button >
< button data-target = "s3" > 3</ button >
</ div >
</ div >
< script >
document. querySelector( '.markers' ). addEventListener( 'click' , ( evt) => {
const target = document. getElementById( evt. target. dataset. target);
if ( ! target) return ;
// scrollIntoView 会正确对齐目标项,遵循 scroll-snap-align、
// scroll-margin 以及滚动容器的 scroll-padding。
target. scrollIntoView({
// 只滚动最近的滚动容器。
container: 'nearest' ,
behavior: 'smooth'
});
});
</ script >
测试
- scrollIntoView-align-scrollport-covering-child.html (在线测试) (源码)
- scrollIntoView-container.html (在线测试) (源码)
- scrollintoview-containingblock-chain.html (在线测试) (源码)
- scrollIntoView-fixed-outside-of-viewport.html (在线测试) (源码)
- scrollIntoView-fixed.html (在线测试) (源码)
- scrollIntoView-horizontal-partially-visible.html (在线测试) (源码)
- scrollIntoView-horizontal-tb-writing-mode-and-rtl-direction.html (在线测试) (源码)
- scrollIntoView-horizontal-tb-writing-mode.html (在线测试) (源码)
- scrollIntoView-inline-image.html (在线测试) (源码)
- scrollIntoView-multiple-nested.html (在线测试) (源码)
- scrollIntoView-multiple.html (在线测试) (源码)
- scrollIntoView-scrolling-container.html (在线测试) (源码)
- scrollIntoView-scrollMargin.html (在线测试) (源码)
- scrollIntoView-scrollPadding.html (在线测试) (源码)
- scrollIntoView-shadow.html (在线测试) (源码)
- scrollIntoView-should-treat-slot-as-scroll-container.html (在线测试) (源码)
- scrollIntoView-sideways-lr-writing-mode-and-rtl-direction.html (在线测试) (源码)
- scrollIntoView-sideways-lr-writing-mode.html (在线测试) (源码)
- scrollIntoView-sideways-rl-writing-mode-and-rtl-direction.html (在线测试) (源码)
- scrollIntoView-sideways-rl-writing-mode.html (在线测试) (源码)
- scrollIntoView-smooth.html (在线测试) (源码)
- scrollIntoView-stuck.tentative.html (在线测试) (源码)
- scrollIntoView-svg-shape.html (在线测试) (源码)
- scrollIntoView-vertical-lr-writing-mode-and-rtl-direction.html (在线测试) (源码)
- scrollIntoView-vertical-lr-writing-mode.html (在线测试) (源码)
- scrollIntoView-vertical-rl-writing-mode.html (在线测试) (源码)
- scrollintoview-zero-height-item.html (在线测试) (源码)
- scrollintoview.html (在线测试) (源码)
- smooth-scrollIntoView-with-smooth-fragment-scroll.html (在线测试) (源码)
- smooth-scrollIntoView-with-unrelated-gesture-scroll.html (在线测试) (源码)
- visual-scrollIntoView-001.html (在线测试) (源码)
- visual-scrollIntoView-002.html (在线测试) (源码)
- visual-scrollIntoView-003.html (在线测试) (源码)
scroll()
方法必须运行以下步骤:
-
如果以一个参数调用,按以下子步骤进行:
-
如果以两个参数调用,按以下子步骤进行:
-
令 document 为该元素的节点文档。
-
如果 document 不是活动文档,终止这些步骤。
-
令 window 为 document 的
defaultView
属性值。 -
如果 window 为 null,终止这些步骤。
-
如果该元素是根元素,则在 window 上用
scroll()
,第一个参数为 window 的scrollX
,第二个参数为 y,终止这些步骤。 -
如果该元素是
body
元素,document 处于怪异模式,且该元素不是潜在可滚动,则在 window 上用 options 作为唯一参数调用scroll()
,终止这些步骤。
当调用 scrollTo()
方法时,用户代理必须如同调用 scroll()
方法且参数相同一样处理。
当调用 scrollBy()
方法时,用户代理必须运行以下步骤:
-
如果以一个参数调用,按以下子步骤进行:
-
如果以两个参数调用,按以下子步骤进行:
-
将
scrollLeft
的值加到left
字典成员。 -
如同以 options 作为唯一参数调用
scroll()
方法一样处理。
scrollTop
属性,获取时,必须运行以下步骤:
-
令 document 为该元素的节点文档。
-
如果 document 不是活动文档,则返回 0 并终止这些步骤。
-
令 window 为 document 的
defaultView
属性值。 -
如果 window 为 null,返回 0 并终止这些步骤。
-
如果该元素是
body
元素,document 处于怪异模式,且该元素不是潜在可滚动,则返回 window 的scrollY
值。 -
如果该元素没有任何关联的盒,返回 0 并终止这些步骤。
设置 scrollTop
属性时,必须运行以下步骤:
-
令 y 为给定值。
-
对 y 进行非有限值归一化。
-
令 document 为该元素的节点文档。
-
如果 document 不是活动文档,终止这些步骤。
-
令 window 为 document 的
defaultView
属性值。 -
如果 window 为 null,终止这些步骤。
-
如果该元素是根元素,则在 window 上以
scroll()
,第一个参数为 window 的scrollX
,第二个参数为 y,终止这些步骤。 -
如果该元素是
body
元素,document 处于怪异模式,且该元素不是潜在可滚动,则在 window 上以scroll()
,第一个参数为scrollX
,第二个参数为 y,终止这些步骤。 -
以
scrollLeft
、y 为目标,滚动行为为 "auto
",滚动该元素。
测试
scrollLeft
属性,在获取时,必须按以下步骤返回结果:
-
令 document 为该元素的 节点文档。
-
如果 document 不是 活动文档,则返回 0 并终止这些步骤。
-
令 window 为 document 的
defaultView
属性值。 -
如果 window 为 null,返回 0 并终止这些步骤。
-
如果该元素是
body
元素,document 处于 怪异模式,且该元素不是 潜在可滚动,则返回 window 的scrollX
。 -
如果该元素没有任何关联的 盒,则返回 0 并终止这些步骤。
设置 scrollLeft
属性时,必须运行以下步骤:
-
令 x 为给定值。
-
对 x 进行非有限值归一化。
-
令 document 为该元素的 节点文档。
-
如果 document 不是 活动文档,终止这些步骤。
-
令 window 为 document 的
defaultView
属性值。 -
如果 window 为 null,终止这些步骤。
-
如果该元素是 根元素,在 window 上以 x 为第一个参数、window 的
scrollY
为第二个参数调用scroll()
,终止这些步骤。 -
如果该元素是
body
元素,document 处于 怪异模式,且该元素不是 潜在可滚动,则在 window 上以 x 为第一个参数、window 的scrollY
为第二个参数调用scroll()
,终止这些步骤。
scrollWidth
属性必须按以下步骤返回结果:
-
令 document 为该元素的 节点文档。
-
如果 document 不是 活动文档,则返回 0 并终止这些步骤。
-
令 viewport width 为 视口的宽度(不包括滚动条宽度,如有),如果没有 视口则为 0。
-
如果该元素是 根元素且 document 不处于 怪异模式,则返回 max(视口 滚动区域宽度, viewport width)。
-
如果该元素是
body
元素,document 处于 怪异模式,且该元素不是 潜在可滚动,则返回 max(视口 滚动区域宽度, viewport width)。 -
如果该元素没有任何关联的 盒,则返回 0 并终止这些步骤。
-
返回该元素 滚动区域的宽度。
测试
- pt-to-px-width.html (在线测试) (源码)
- scrollWidthHeight-contain-layout.html (在线测试) (源码)
- scrollWidthHeight-negative-margin-001.html (在线测试) (源码)
- scrollWidthHeight-negative-margin-002.html (在线测试) (源码)
- scrollWidthHeight-overflow-visible-margin-collapsing.html (在线测试) (源码)
- scrollWidthHeight-overflow-visible-negative-margins.html (在线测试) (源码)
- scrollWidthHeight.xht (在线测试) (源码)
- scrollWidthHeightWhenNotScrollable.xht (在线测试) (源码)
scrollHeight
属性必须按以下步骤返回结果:
-
令 document 为该元素的 节点文档。
-
如果 document 不是 活动文档,则返回 0 并终止这些步骤。
-
令 viewport height 为 视口的高度(不包括滚动条高度,如有),如果没有 视口则为 0。
-
如果该元素是 根元素且 document 不处于 怪异模式,则返回 max(视口 滚动区域高度, viewport height)。
-
如果该元素是
body
元素,document 处于 怪异模式,且该元素不是 潜在可滚动,则返回 max(视口 滚动区域高度, viewport height)。 -
如果该元素没有任何关联的 盒,则返回 0 并终止这些步骤。
-
返回该元素 滚动区域的高度。
clientTop
属性必须按以下步骤运行:
-
如果该元素没有关联的 盒,或 盒为内联,返回 0。
-
返回 未缩放的 border-top-width 属性的计算值加上在顶部 内边距边和顶部 边框边之间渲染的任何滚动条高度,忽略应用于该元素及其祖先的任何 变换。
测试
clientLeft
属性必须按以下步骤运行:
-
如果该元素没有关联的 盒,或 盒为内联,返回 0。
-
返回 未缩放的 border-left-width 属性的计算值加上在左侧 内边距边和左侧 边框边之间渲染的任何滚动条宽度,忽略应用于该元素及其祖先的任何 变换。
clientWidth
属性必须按以下步骤运行:
-
如果该元素没有关联的 盒,或 盒为内联,返回 0。
-
如果该元素是 根元素且其 节点文档不处于 怪异模式,或该元素是
body
元素且其 节点文档处于 怪异模式,则返回 视口宽度(不包括渲染的滚动条宽度,如有)。 -
返回 未缩放的 内边距边宽度(不包括在 内边距边和 边框边之间渲染的任何滚动条宽度),忽略应用于该元素及其祖先的任何 变换。
clientHeight
属性必须按以下步骤运行:
-
如果该元素没有关联的 盒,或 盒为内联,返回 0。
-
如果该元素是 根元素且其 节点文档不处于 怪异模式,或该元素是
body
元素且其 节点文档处于 怪异模式,则返回 视口高度(不包括渲染的滚动条高度,如有)。 -
返回 未缩放的 内边距边高度(不包括在 内边距边和 边框边之间渲染的任何滚动条高度),忽略应用于该元素及其祖先的任何 变换。
currentCSSZoom
属性必须返回该元素的 有效缩放,如果该元素未被 渲染则返回 1.0。
测试
6.1.
Element
滚动成员
要确定滚动到可视区域的位置,对于一个 target,它可以是 Element、伪元素或 Range, 并且有一个滚动行为 behavior、 块流方向位置 block、 行内基准方向位置 inline, 以及一个滚动盒 scrolling box, 按以下步骤进行:
-
令 target bounding border box 为调用 Element 的
getBoundingClientRect()
返回的盒, 如果 target 是 Element,或调用 Range 的getBoundingClientRect()
, 如果 target 是 Range。 -
令 scrolling box edge A 为 scrolling box 在块流方向上的开始边,element edge A 为 target bounding border box 在同一物理边上的边。
-
令 scrolling box edge B 为 scrolling box 在块流方向上的结束边,element edge B 为 target bounding border box 在同一物理边上的边。
-
令 scrolling box edge C 为 scrolling box 在行内基准方向上的开始边,element edge C 为 target bounding border box 在同一物理边上的边。
-
令 scrolling box edge D 为 scrolling box 在行内基准方向上的结束边,element edge D 为 target bounding border box 在同一物理边上的边。
-
令 element height 为 element edge A 和 element edge B 之间的距离。
-
令 scrolling box height 为 scrolling box edge A 和 scrolling box edge B 之间的距离。
-
令 element width 为 element edge C 和 element edge D 之间的距离。
-
令 scrolling box width 为 scrolling box edge C 和 scrolling box edge D 之间的距离。
-
令 position 为 scrolling box 按如下步骤应有的滚动位置:
-
如果 block 为 "
start
",则将 element edge A 与 scrolling box edge A 对齐。 -
否则,如果 block 为 "
end
",则将 element edge B 与 scrolling box edge B 对齐。 -
否则,如果 block 为 "
center
",则将 target bounding border box 的中心与 scrolling box 的中心在块流方向对齐。 -
否则,block 为 "
nearest
":- 如果 element edge A 和 element edge B 都在 scrolling box edge A 和 scrolling box edge B 之外
- 不做任何操作。
- 如果 element edge A 在 scrolling box edge A 之外且 element
height 小于 scrolling box height
- 如果 element edge B 在 scrolling box edge B 之外且 element height 大于 scrolling box height
- 将 element edge A 与 scrolling box edge A 对齐。
- 如果 element edge A 在 scrolling box edge A 之外且 element
height 大于 scrolling box height
- 如果 element edge B 在 scrolling box edge B 之外且 element height 小于 scrolling box height
- 将 element edge B 与 scrolling box edge B 对齐。
-
如果 inline 为 "
start
",则将 element edge C 与 scrolling box edge C 对齐。 -
否则,如果 inline 为 "
end
",则将 element edge D 与 scrolling box edge D 对齐。 -
否则,如果 inline 为 "
center
",则将 target bounding border box 的中心与 scrolling box 的中心在行内基准方向对齐。 -
否则,inline 为 "
nearest
":- 如果 element edge C 和 element edge D 都在 scrolling box edge C 和 scrolling box edge D 之外
- 不做任何操作。
- 如果 element edge C 在 scrolling box edge C 之外且 element
width 小于 scrolling box width
- 如果 element edge D 在 scrolling box edge D 之外且 element width 大于 scrolling box width
- 将 element edge C 与 scrolling box edge C 对齐。
- 如果 element edge C 在 scrolling box edge C 之外且 element
width 大于 scrolling box width
- 如果 element edge D 在 scrolling box edge D 之外且 element width 小于 scrolling box width
- 将 element edge D 与 scrolling box edge D 对齐。
-
如果 target 是 Element,且目标元素定义了 滚动捕捉位置, 则如果其最近的 滚动容器是 滚动捕捉容器, 用户代理必须将结果 position 捕捉到该元素的某个 滚动捕捉位置; 即使 滚动容器样式为 scroll-snap-type: none,用户代理也可以这么做。
-
返回 position。
-
要将目标滚动到可视区域 target, 可以是 Element、伪元素或 Range, 并带有滚动行为 behavior、 块流方向位置 block、 行内基准方向位置 inline, 以及一个可选的包含 Element,用于到达 container 后停止滚动, 按以下步骤运行:
-
对每个作为祖先的元素或建立了 视口的 滚动盒 scrolling box, 按从最内到最外 滚动盒的顺序,运行以下子步骤:
-
令 position 为运行确定滚动到可视区域的位置流程的结果, 以 target、behavior、block、inline 和 scrolling box 为参数。
-
如果 position 不等于 scrolling box 当前的滚动位置, 或 scrolling box 有正在进行的平滑滚动,
-
如果 container 不为 null,且 scrolling box 是 包含 container 的 shadow-including 祖先, 或 scrolling box 是 视口,其 document 是 包含 container 的 shadow-including 祖先, 则终止这些步骤。
要滚动一个元素(或伪元素)element到x,y,可选地带有滚动行为behavior(如果未指定则为"auto
"),意味着:
7.
对 HTMLElement
接口的扩展
partial interface HTMLElement {readonly attribute Element ?scrollParent ;readonly attribute Element ?offsetParent ;readonly attribute long offsetTop ;readonly attribute long offsetLeft ;readonly attribute long offsetWidth ;readonly attribute long offsetHeight ; };
scrollParent
属性必须按以下步骤返回结果:
-
如符合下列任一条件,则返回 null 并终止本算法:
offsetParent
属性必须按以下步骤返回结果:
-
如符合下列任一条件,则返回 null 并终止本算法:
-
令 ancestor 为该元素在扁平树中的父节点,并重复以下子步骤:
测试
offsetTop
属性必须按以下步骤返回结果:
-
如果该元素的
offsetParent
为 null,则返回该元素第一个关联 边框边顶部的 未缩放 y 坐标, 相对于 初始包含块原点,忽略应用于该元素及其祖先的任何 变换,并终止算法。 -
返回以下结果:用该元素第一个关联 边框边顶部的 未缩放 y 坐标 减去
offsetParent
的第一个关联 内边距边顶部的 y 坐标, 相对于 初始包含块原点, 忽略应用于该元素及其祖先的任何 变换。注意:由多个行盒组成的内联元素,只考虑其第一个关联 盒。
测试
- offsetTop-offsetLeft-nested-offsetParents.html (在线测试) (源码)
- offsetTop-offsetLeft-with-zoom.html (在线测试) (源码)
- offsetTopLeft-border-box.html (在线测试) (源码)
- offsetTopLeft-empty-inline-offset.html (在线测试) (源码)
- offsetTopLeft-empty-inline.html (在线测试) (源码)
- offsetTopLeft-inline.html (在线测试) (源码)
- offsetTopLeft-leading-space-inline.html (在线测试) (源码)
- offsetTopLeft-table-caption.html (在线测试) (源码)
- offsetTopLeft-trailing-space-inline.html (在线测试) (源码)
- offsetTopLeftInScrollableParent.html (在线测试) (源码)
- table-offset-props.html 在线测试) (源码)
offsetLeft
属性必须按以下步骤返回结果:
-
如果该元素的
offsetParent
为 null,则返回该元素第一个关联 边框边左侧的 未缩放 x 坐标, 相对于 初始包含块原点,忽略应用于该元素及其祖先的任何 变换,并终止算法。 -
返回以下结果:用该元素第一个关联 边框边左侧的 未缩放 x 坐标 减去
offsetParent
的第一个关联 内边距边左侧的 x 坐标, 相对于 初始包含块原点, 忽略应用于该元素及其祖先的任何 变换。
offsetWidth
属性必须按以下步骤返回结果:
offsetHeight
属性必须按以下步骤返回结果:
8. 对 HTMLImageElement
接口的扩展
partial interface HTMLImageElement {readonly attribute long x ;readonly attribute long y ; };
x
属性,在获取时,必须返回该元素第一个关联 缩放后的左边 边框边的 x 坐标,
该坐标相对于 初始包含块的原点,忽略应用于该元素及其祖先的 变换,若没有 盒则返回 0。
y
属性,在获取时,必须返回该元素第一个关联 缩放后的顶部 边框边的 y 坐标,
该坐标相对于 初始包含块的原点,忽略应用于该元素及其祖先的 变换,若没有 盒则返回 0。
测试
9.
对 Range
接口的扩展
partial interface Range {DOMRectList getClientRects (); [NewObject ]DOMRect getBoundingClientRect (); };
getClientRects()
方法在调用时,如果该 range 不在文档中,必须返回一个空的 DOMRectList
对象,否则返回一个 DOMRectList
对象,
其中包含一组按内容顺序排列的 DOMRect
对象,并满足如下约束:
-
对于 range 选中的每个元素(其父元素未被 range 选中),包含对该元素调用
getClientRects()
返回的边框区域。 -
对于 range 选中或部分选中的每个
Text
节点(包括边界点相同的情况),包含一个 缩放后的DOMRect
对象(仅针对选中的部分,而不是整个行盒)。这些DOMRect
的边界通过字体度量计算; 因此,对于横向书写,每个盒子的垂直尺寸由字体的上升和下降决定,水平尺寸由文本的进宽决定。如果 range 覆盖了部分 排版字符单元(如半个代理项对或部分词素簇),则计算相关DOMRect
时必须包括完整的 排版字符单元。 [CSS-TEXT-3] 会应用祖先的 变换。
注意:DOMRect
对象由 getClientRects()
返回后不是 实时的。
测试
getBoundingClientRect()
方法在调用时,必须返回如下算法结果:
-
令 list 为对同一个 range 调用
getClientRects()
的结果。 -
如果 list 中所有矩形的宽或高都为零,则返回 list 中的第一个矩形。
-
否则,返回一个
DOMRect
对象,描述包含 list 中所有宽或高不为零的矩形的最小矩形。
注意:DOMRect
对象由 getBoundingClientRect()
返回后不是 实时的。
10.
对 MouseEvent
接口的扩展
partial interface MouseEvent {readonly attribute double screenX ;readonly attribute double screenY ;readonly attribute double pageX ;readonly attribute double pageY ;readonly attribute double clientX ;readonly attribute double clientY ;readonly attribute double x ;readonly attribute double y ;readonly attribute double offsetX ;readonly attribute double offsetY ; };partial dictionary MouseEventInit {double = 0.0;
screenX double = 0.0;
screenY double = 0.0;
clientX double = 0.0; };
clientY
screenX
属性,获取时必须返回事件发生位置相对于 Web公开屏幕区域原点的 x 坐标。
screenY
属性,获取时必须返回事件发生位置相对于 Web公开屏幕区域原点的 y 坐标。
pageX
属性必须按以下步骤:
-
如果事件的 dispatch flag 已设置,返回事件发生位置相对于 初始包含块原点的水平坐标,并终止这些步骤。
-
返回 offset 与事件的
clientX
属性值之和。
pageY
属性必须按以下步骤:
-
如果事件的 dispatch flag 已设置,返回事件发生位置相对于 初始包含块原点的垂直坐标,并终止这些步骤。
-
返回 offset 与事件的
clientY
属性值之和。
clientX
属性,获取时必须返回事件发生位置相对于 视口原点的 x 坐标。
clientY
属性,获取时必须返回事件发生位置相对于 视口原点的 y 坐标。
x
属性,获取时必须返回 clientX
的值。
y
属性,获取时必须返回 clientY
的值。
offsetX
属性必须按以下步骤:
-
如果事件的 dispatch flag 已设置,返回事件发生位置相对于目标节点 内边距边的 x 坐标,忽略应用于元素及其祖先的 变换,并终止这些步骤。
-
返回事件的
pageX
属性值。
offsetY
属性必须按以下步骤:
-
如果事件的 dispatch flag 已设置,返回事件发生位置相对于目标节点 内边距边的 y 坐标,忽略应用于元素及其祖先的 变换,并终止这些步骤。
-
返回事件的
pageY
属性值。
11. 几何
11.1.
GeometryUtils
接口
enum {
CSSBoxType ,
"margin" ,
"border" ,
"padding" };
"content" dictionary {
BoxQuadOptions CSSBoxType = "border";
box GeometryNode ; // XXX default document (i.e. viewport) };
relativeTo dictionary {
ConvertCoordinateOptions CSSBoxType = "border";
fromBox CSSBoxType = "border"; };
toBox interface mixin {
GeometryUtils sequence <DOMQuad >getBoxQuads (optional BoxQuadOptions = {});
options DOMQuad convertQuadFromNode (DOMQuadInit ,
quad GeometryNode ,
from optional ConvertCoordinateOptions = {});
options DOMQuad convertRectFromNode (DOMRectReadOnly ,
rect GeometryNode ,
from optional ConvertCoordinateOptions = {});
options DOMPoint convertPointFromNode (DOMPointInit ,
point GeometryNode ,
from optional ConvertCoordinateOptions = {}); // XXX z,w turns into 0 };
options Text includes GeometryUtils ; // like RangeElement includes GeometryUtils ;CSSPseudoElement includes GeometryUtils ;Document includes GeometryUtils ;typedef (Text or Element or CSSPseudoElement or Document );
GeometryNode
getBoxQuads(options)
方法必须运行以下步骤:
-
DOM 顺序
p1 = 即使在 RTL 下也是左上
缩放为 0 时除以零,返回 0x0
不允许跨 frame,抛出 WrongDocumentError?
点是被平面化的(3D变换),z=0。类似 getClientRect
测试块在内联
伪元素 before/after 是元素的子节点
viewport box 都一样
convertQuadFromNode(quad, from, options)
方法必须运行以下步骤:
convertRectFromNode(rect, from, options)
方法必须运行以下步骤:
convertPointFromNode(point, from, options)
方法必须运行以下步骤:
12. VisualViewport
12.1.
VisualViewport
接口
[Exposed =Window ]interface :
VisualViewport EventTarget {readonly attribute double offsetLeft ;readonly attribute double offsetTop ;readonly attribute double pageLeft ;readonly attribute double pageTop ;readonly attribute double width ;readonly attribute double height ;readonly attribute double scale ;attribute EventHandler onresize ;attribute EventHandler onscroll ;attribute EventHandler onscrollend ; };
offsetLeft
属性必须运行以下步骤:
offsetTop
属性必须运行以下步骤:
pageLeft
属性必须运行以下步骤:
pageTop
属性必须运行以下步骤:
width
属性必须运行以下步骤:
注意:由于该值以 CSS 像素返回,如果 页面缩放或 缩放因子增加,则该值会减小。
注意:固定在视觉视口上的滚动条不会随着视觉视口缩放和移动而改变尺寸或位置。由于该值是 CSS 像素,排除滚动条宽度时,用户代理必须按 CSS 像素测量滚动条大小。也就是说,排除量在放大时减少,缩小时增加。
height
属性必须运行以下步骤:
scale
属性必须运行以下步骤:
onresize
是 事件处理器 IDL 属性,用于 resize 事件。
onscroll
是 事件处理器 IDL 属性,用于 scroll
事件。
onscrollend
是 事件处理器 IDL 属性,用于 scrollend 事件。
13. 事件
13.1. 视口缩放
当要求对 Document
doc 运行缩放步骤时,执行以下步骤:
-
如果 doc 的 视口宽度或高度发生了变化 (例如用户调整了浏览器窗口大小, 或改变了 页面缩放, 或
iframe
元素的尺寸被更改), 自上次运行这些步骤以来, 触发一个名为 resize 的事件, 目标是与 doc 关联的Window
对象。 -
如果与 doc 关联的
VisualViewport
的 scale、width 或 height 属性自上次运行这些步骤以来发生了变化, 触发一个名为 resize 的事件, 目标是VisualViewport
。
测试
13.2. 滚动
每个 Document
关联一个 待触发滚动事件目标列表,初始为空。
每个 Document
关联一个 待触发滚动结束事件目标列表,初始为空。
每当 视口被滚动(无论是因用户交互还是 API),用户代理必须运行以下步骤:
-
如果 doc 是 捕捉容器, 则为 doc 以 doc的最终捕捉目标(块轴为 newBlockTarget,行内轴为 newInlineTarget)运行更新 scrollsnapchanging 目标的步骤。
-
如果 doc 已在其 待触发滚动事件目标列表中,则中止这些步骤。
-
将 doc 添加到其 待触发滚动事件目标列表。
每当一个元素被滚动(无论是因用户交互还是 API),用户代理必须运行以下步骤:
-
令 doc 为该元素的 节点文档。
-
如果该元素是 捕捉容器, 则为该元素以其最终捕捉目标(块轴为 newBlockTarget,行内轴为 newInlineTarget)运行更新 scrollsnapchanging 目标的步骤。
-
如果该元素已在 doc 的 待触发滚动事件目标列表中,则中止这些步骤。
-
将该元素添加到 doc 的 待触发滚动事件目标列表。
每当 视觉视口被滚动(无论是因用户交互还是 API),用户代理必须运行以下步骤:
-
令 vv 为被滚动的
VisualViewport
对象。 -
令 doc 为 vv 的 关联文档。
-
如果 vv 已在 doc 的 待触发滚动事件目标列表中,则中止这些步骤。
-
将 vv 添加到 doc 的 待触发滚动事件目标列表。
当要求对 Document
doc 运行滚动事件步骤时,执行以下步骤:
-
为 doc 运行分发待触发 scrollsnapchanging 事件的步骤。
-
对于 doc 的 待触发滚动事件目标列表中的每个 target,按添加顺序运行以下子步骤:
-
清空 doc 的 待触发滚动事件目标列表。
-
为 doc 运行分发待触发 scrollsnapchange 事件的步骤。
每当滚动完成时,用户代理必须运行以下步骤:
scrollend 事件的分发顺序是什么?是根据滚动开始顺序还是滚动完成顺序?
-
对于每个被滚动的滚动盒 box:
-
如果 box 属于 视口,令 doc 为 视口关联的
Document
,target 为 视口。 如果 box 属于VisualViewport
,令 doc 为VisualViewport
的 关联文档,target 为VisualViewport
。 否则,box 属于一个元素,令 doc 为元素的 节点文档,target 为该元素。 -
如果 box 属于 捕捉容器 snapcontainer, 为 snapcontainer 运行更新 scrollsnapchange 目标的步骤。
-
如果 target 已在 doc 的 待触发滚动结束事件目标列表中,则中止这些步骤。
-
将 target 添加到 doc 的 待触发滚动结束事件目标列表。
-
-
为 doc 运行分发待触发 scrollsnapchange 目标的步骤。
-
对于 doc 的 待触发滚动结束事件目标列表中的每个 target,按添加顺序运行以下子步骤:
-
清空 doc 的 待触发滚动结束事件目标列表。
13.3. 事件摘要
本节为非规范性内容。
事件 | 接口 | 关注目标 | 描述 |
---|---|---|---|
resize
| Event
| Window ,
VisualViewport
| 当 Window
的 视口被缩放时触发。VisualViewport
的 视觉视口
被缩放或 布局视口被缩放时触发。
|
scroll
| Event
| VisualViewport ,
Document ,
元素
| 当 VisualViewport 、
Document
或元素被滚动时触发,分别对应 VisualViewport 、
视口 或元素被滚动。
|
scrollend
| Event
| Document ,
元素, VisualViewport
| 当 VisualViewport 、
Document
或元素的滚动结束时触发:VisualViewport 、
视口 或元素已滚动,滚动序列已结束且所有滚动偏移变更已应用。
|
14. 布局后状态快照
部分 CSS 特性会将布局后的状态(如滚动位置)用作下一轮样式和布局更新的输入。
当要求对 Document
doc 运行布局后状态快照步骤时,执行以下步骤:
-
对每个需要快照布局后状态的 CSS 特性,在 doc 中快照相关状态。
快照的状态由其他规范定义。这些步骤不得使 doc 或其他 Document
失效,以至于其他布局后快照步骤能观察到此次快照。因此,快照的顺序不应影响结果。
15. 隐私注意事项
Screen
接口会暴露用户显示配置的信息,可能被用于指纹识别算法。用户代理可选择隐藏或量化屏幕尺寸或配置信息,以保护用户隐私。
MouseEvent
包含事件的屏幕相对坐标信息。用户代理可以将这些属性设置为模糊真实屏幕位置的值,以保护用户隐私。
16. 安全注意事项
本规范暂无新的安全注意事项被报告。
17. 变更
本节记录了本规范各版本之间的一些变更。该节并不详尽。一般不会列出 bug 修复和编辑性变更。
自 2016年3月17日工作草案之后的变更
-
增加 Simon Fraser 和 Emilio Cobos Álvarez 为现编辑,Simon Pieters 移至前编辑。
-
明确
getClientRects()
如何处理 排版字符单元。 -
更改了
getBoundingClientRect()
(针对Element
)和getBoundingClientRect()
(针对Range
)处理空矩形的方式。 -
更改了 Shadow DOM 下
offsetParent
的定义。 -
允许 UA 出于隐私原因对
Screen
属性撒谎。 -
colorDepth
和pixelDepth
改为返回真实值。 -
将“CSS 像素”定义为 [CSS-VALUES]。
-
更改了
ScrollIntoViewOptions
的默认值为start
和nearest
,并稍微调整了scrollIntoView()
行为。 -
新增
screenLeft
和screenTop
作为screenX
和screenY
的别名。 -
用 block-end 和 inline-end 重新定义溢出方向。
-
将
resizeTo()
参数重命名为 width 和 height -
将脚本触发的滚动捕捉添加到受 scroll-behavior 影响的滚动列表。
-
修正了术语章节中的逻辑错误。
-
新增“安全注意事项”和“隐私注意事项”章节
-
将 scroll-behavior 属性移至 [CSS-OVERFLOW-3]
-
调整了
offsetWidth
和offsetHeight
的算法。 -
新增
checkVisibility()
方法至Element
。 -
将 scrollend 事件从 WICG overscroll-scrollend-events 移至 [CSSOM-VIEW-1],并补充了处理细节。
-
为
getBoundingClientRect()
新增“获取包围盒”算法。 -
引入了
VisualViewport
API 及相关概念。 -
扩展了滚动到可视区域算法,使其也支持
Ranges
。 -
明确了各种 API 返回缩放或未缩放尺寸与 zoom 属性的关系。
-
在多种滚动 API 中考虑了滚动捕捉和滚动目标。
-
新增
currentCSSZoom
属性到Element
。 -
为
caretPositionFromPoint()
方法新增了 options 参数。 -
从 CaretPosition 接口中移除了 caret range 概念。
-
定义了布局后快照机制。
-
各类滚动算法现在可接受伪元素。
-
在
ScrollIntoViewOptions
中新增了 container 选项。 -
新增了
scrollParent
属性。 -
Pinch zoom 被重命名为 scale factor。
自 2013年12月17日工作草案之后的变更
-
scrollIntoView()
方法在Element
上进行了修改和扩展。 -
scrollTop
和scrollLeft
在Element
上不再接收对象参数;新增了scroll()
、scrollTo()
和scrollBy()
方法。 -
scrollWidth
、scrollHeight
、clientTop
、clientLeft
、clientWidth
、clientHeight
在Element
上改回返回整数。 -
移除了
DOMRectList
接口。 -
scrollingElement
属性新增到Document
。 -
部分
Window
上的只读属性添加了[Replaceable]
扩展属性。 -
MediaQueryList
、 scroll 事件和 resize 事件与 HTML 的 事件循环集成,因此与动画帧同步。 -
scroll-behavior 的
instant
值被重命名为 auto。 -
scrollLeft
在Element
上的原点变更(针对 RTL)。 -
scrollIntoView()
方法在Element
和scroll()
、scrollTo()
、scrollBy()
方法在Window
上,均以相关字典为第一个参数。 -
MediaQueryList
接口改为使用常规事件 API,并将addListener()
以该方式定义。 -
新增“变更历史”章节。
-
将 Glenn Adams 移至前编辑。
自 2011年8月4日工作草案之后的变更
-
新增 Simon Pieters 和 Glenn Adams 为编辑,并将 Anne van Kesteren 移至前编辑。
-
引入了 scroll-behavior CSS 属性。
-
术语中增加了 块流方向和 行内基准方向(来自 [CSS-WRITING-MODES-3])。
-
新增了关于缩放的章节。
-
为
moveTo()
、moveBy()
、resizeTo()
、resizeBy()
方法添加到Window
。 -
为
devicePixelRatio
属性添加到Window
。 -
引入了
ScrollOptions
字典,并为滚动方法增加了 options 参数。 -
为
devicePixelRatio
属性添加到Window
。 -
为
open()
方法新增 features 参数。 -
为
elementsFromPoint()
方法添加到Document
。 -
为
getClientRect()
方法添加到CaretPosition
。 -
引入了
GeometryUtils
接口的初稿。 -
更改了
innerWidth
、innerHeight
等,改用 double。 -
现在已支持 CSS 变换。
-
用
DOMRect
取代了ClientRect
。 -
更改了
colorDepth
和pixelDepth
始终返回 24。
自 2009年8月4日工作草案之后的变更
-
移除了其他规范冗余的术语定义,明确单位(例如 CSS 像素)和内容/文档内容的区别。
-
引入了
MediaQueryList
接口。 -
将
Media
的matchMedium()
方法移至Window
接口,重命名为matchMedia()
,并更改返回类型为MediaQueryList
。 -
移除了
AbstractView
和Media
接口。 -
移除了
DocumentView
接口,并将elementFromPoint()
和caretRangeFromPoint()
方法移至Document
接口。 -
将
caretRangeFromPoint()
方法重命名为caretPositionFromPoint()
。 -
引入了
CaretPosition
接口,并将caretPositionFromPoint()
的返回类型更改为 CaretPosition。 -
为
scrollIntoView()
方法添加到Element
接口。
自 2008年2月22日工作草案之后的变更
-
移除了
WindowView
接口,并将其属性和方法移至AbstractView
和继承的ScreenView
接口。 -
为
AbstractView
添加了document
IDL 属性。 -
为
scroll()
、scrollTo()
、scrollBy()
方法添加到ScreenView
接口。 -
移除了
ElementView
接口,并将其属性和方法移至Element
和HTMLElement
接口。 -
为
defaultView
IDL 属性和caretRangeFromPoint()
方法添加到DocumentView
接口。 -
移除了
RangeView
接口,改为直接扩展Range
接口。 -
移除了
MouseEventView
接口,改为直接扩展MouseEvent
接口。 -
将
TextRectangleList
接口重命名为ClientRectList
,并将item()
方法更改为索引 getter。 -
将
TextRectangle
接口重命名为ClientRect
,并添加了width
和height
属性。
18. 致谢
编辑们感谢 Alan Stearns、Alexey Feldgendler、Antonio Gomes、Björn Höhrmann、Boris Zbarsky、Chris Rebert、Corey Farwell、Dan Bates、David Vest、Elliott Sprehn、Garrett Smith、Henrik Andersson、Hallvord R. M. Steen、Kang-Hao Lu、Koji Ishii、Leif Arne Storset、Luiz Agostini、Maciej Stachowiak、Michael Dyck、Mike Wilson、Morten Stenshorne、Olli Pettay、Pavel Curtis、Peter-Paul Koch、Rachel Kmetz、Rick Byers、Robert O’Callahan、Sam Weinig、Scott Johnson、Sebastian Zartner、Stewart Brodie、Sylvain Galineau、Tab Atkins、Tarquin Wilton-Jones、Thomas Moore、Thomas Shinnick 以及 Xiaomei Ji 对本文档的贡献。
特别感谢最早在 Windows Internet Explorer 浏览器中广泛部署并实现本规范中许多特性的微软员工。