1. 背景
本规范中定义的许多功能已得到浏览器长时间的支持。本规范的目标是以一种所有浏览器都能以互操作方式实现这些功能的方式定义它们。本规范还定义了一些允许自定义滚动的新功能。
2. 术语
本规范使用的术语来自 DOM、CSSOM 和 HTML。[DOM] [CSSOM] [HTML]
如果以下所有条件均为真,则元素 body(即 body 元素)是潜在可滚动的:
-
body 具有一个关联的 框 (box)。
-
body 的 父元素的 overflow-x 或 overflow-y 属性的计算值既不是 visible 也不是 clip。
-
body 的 overflow-x 或 overflow-y 属性的计算值既不是 visible 也不是 clip。
注:一个潜在可滚动的 body 元素可能没有滚动框。例如,它的 overflow 属性的实际值可能是 auto,但其内容并未溢出内容区域。
视口或元素的滚动框 (scrolling box)具有两个溢出方向 (overflow directions),即该视口或元素的块结束和内联结束方向。请注意,初始滚动位置可能不与滚动区域原点对齐,具体取决于内容分布属性,请参阅 CSS 框对齐 3 § 5.3 对齐溢出和滚动容器。
术语滚动区域 (scrolling area)指视口或元素的一个框,它具有以下边缘,具体取决于该视口或元素的滚动框的溢出方向。
| 如果溢出方向是…… | 对于视口 | 对于元素 |
|---|---|---|
| 向右和向下 | ||
| 向左和向下 | ||
| 向左和向上 | ||
| 向右和向上 |
滚动区域的原点 (origin),如果是视口,则为初始包含块的原点;否则为元素处于默认滚动位置时的顶部左侧内边距边缘。x 坐标向右增加,y 坐标向下增加。
框或元素的一组特定边缘的起始边缘 (beginning edges)是指以下边缘
- 如果溢出方向是向右和向下
- 顶部和左侧边缘。
- 如果溢出方向是向左和向下
- 顶部和右侧边缘。
- 如果溢出方向是向左和向上
- 底部和右侧边缘。
- 如果溢出方向是向右和向上
- 底部和左侧边缘。
框或元素的一组特定边缘的结束边缘 (ending edges)是指以下边缘
- 如果溢出方向是向右和向下
- 底部和右侧边缘。
- 如果溢出方向是向左和向下
- 底部和左侧边缘。
- 如果溢出方向是向左和向上
- 顶部和左侧边缘。
- 如果溢出方向是向右和向上
- 顶部和右侧边缘。
可视视口 (visual viewport)是一种视口,其滚动区域是另一个视口,称为布局视口 (layout viewport)。
除了滚动之外,可视视口还可以对其布局视口应用缩放变换。此变换应用于布局视口的画布,并且不影响其内部坐标空间。
注:可视视口的缩放变换通常被称为“捏合缩放 (pinch-zoom)”。在概念上,此变换改变了 CSS 参考像素的大小,但按比例改变了布局视口的大小,因此不会导致页面内容的重排。
缩放变换的大小被称为可视视口的缩放因子 (scale factor)。
此动画展示了一个缩放后的可视视口被“平移”(例如,通过用户进行触摸拖动)的示例。页面被缩放,使得布局视口大于可视视口。
滚动增量首先应用于可视视口。当可视视口处于其范围边界时,滚动增量将应用于布局视口。此行为由执行滚动步骤实现。
VisualViewport 对象具有一个关联文档,这是一个 Document 对象。它是 VisualViewport 的所有者 Window 的关联文档。布局视口是所有者 Window 的视口。
为了满足本规范中的要求,display 属性的计算值为 table-column 或 table-column-group 的元素必须被视为具有关联的框(分别为列或列组)。
术语SVG 布局框指由 SVG 元素生成的、不对应于 CSS 定义的 display 类型的框。(例如由 rect 元素生成的框。)
术语变换 (transforms)指 SVG 变换和 CSS 变换。[SVG11] [CSS-TRANSFORMS-1]
当一个方法或属性被说成是调用另一个方法或属性时,用户代理必须为该属性或方法调用其内部 API,以便例如作者不能通过使用 ECMAScript 中的自定义属性或函数覆盖属性或方法来更改行为。
除非另有说明,所有字符串比较均使用 is。
2.1. CSS 像素
除非另有说明,本规范定义的 API 的所有坐标和尺寸均以 CSS 像素为单位。[CSS-VALUES]
注:这不适用于例如 matchMedia(),因为其单位已明确给出。
2.2. 缩放
有两种缩放类型:页面缩放 (page zoom),它影响初始视口的大小;以及可视视口缩放因子,它像放大镜一样工作,不会影响初始视口或实际视口。[CSS-DEVICE-ADAPT]
注:“缩放因子”通常被称为“捏合缩放”;然而,它可以通过捏合缩放以外的方式受到影响。例如,用户代理可能会放大聚焦的输入元素以使其清晰可见。
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 不为 null,且其 scroll-behavior 属性的计算值为 smooth - behavior 为
smooth
注:
behavior: "instant"始终通过此算法执行即时滚动。注:如果滚动位置并未因用户交互或程序调用而发生变化,且没有因操作而应用任何位移,则不会触发 scrollend 事件,因为没有发生滚动。
- behavior 为 "
当用户代理要对视口执行滚动到给定位置 position,并可选地设置滚动行为 behavior(如果省略则为“auto”)时,它必须通过以下步骤执行协调的视口滚动:
-
设 vv 为关联文档是 doc 的
VisualViewport。 -
设 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,其媒体查询列表为 parsed media query list。
screen 属性必须返回与 Window 对象关联的 Screen 对象。
注:当 Document 导航时,通过 WindowProxy 对象访问 screen 可能会产生不同的结果。
如果关联文档处于完全活动 (fully active)状态,visualViewport 属性必须返回与 Window 对象的关联文档相关联的 VisualViewport 对象。否则,它必须返回 null。
注:VisualViewport 对象仅对文档当前正在呈现的窗口返回且有用。如果保留了对文档当前未呈现的 VisualViewport 的引用,则该 VisualViewport 中的值不得泄露任何有关浏览上下文的信息。
测试
当调用 moveTo(x, y) 方法时,必须遵循以下步骤:
-
可选地,返回。
-
如果 target 不是由脚本(而不是由用户操作)创建的辅助浏览上下文,则返回。
-
可选地,以用户代理定义的方式限制 x 和 y,使窗口不会移出可用空间。
-
移动 target 的窗口,使窗口的左上角位于相对于输出设备左上角的坐标 (x, y) 处,以 target 的 CSS 像素为单位。正轴方向为向右和向下。
当调用 moveBy(x, y) 方法时,必须遵循以下步骤:
-
可选地,返回。
-
如果 target 不是由脚本(而不是由用户操作)创建的辅助浏览上下文,则返回。
-
可选地,以用户代理定义的方式限制 x 和 y,使窗口不会移出可用空间。
-
将 target 的窗口向右移动 x 个 target 的 CSS 像素,向下移动 y 个 target 的 CSS 像素。
当调用 resizeTo(width, height) 方法时,必须遵循以下步骤:
-
可选地,返回。
-
如果 target 不是由脚本(而不是由用户操作)创建的辅助浏览上下文,则返回。
-
可选地,以用户代理定义的方式限制 width 和 height,使窗口不会变得太小或超过可用空间。
-
通过移动其右侧和底部边缘来调整 target 的窗口大小,使得视口左右边缘之间的距离为 width 个 target 的 CSS 像素,视口顶部和底部边缘之间的距离为 height 个 target 的 CSS 像素。
-
可选地,以用户代理定义的方式移动 target 的窗口,使其不会增长到可用空间之外。
当调用 resizeBy(x, y) 方法时,必须遵循以下步骤:
-
可选地,返回。
-
如果 target 不是由脚本(而不是由用户操作)创建的辅助浏览上下文,则返回。
-
可选地,以用户代理定义的方式限制 x 和 y,使窗口不会变得太小或超过可用空间。
-
通过将右侧边缘向右移动 x 个 target 的 CSS 像素,将底部边缘向下移动 y 个 target 的 CSS 像素来调整 target 的窗口大小。
-
可选地,以用户代理定义的方式移动 target 的窗口,使其不会增长到可用空间之外。
innerWidth 属性必须返回包含呈现的滚动条(如有)尺寸的视口宽度,如果没有视口,则返回零。
innerHeight 属性必须返回包含呈现的滚动条(如有)尺寸的视口高度,如果没有视口,则返回零。
scrollX 属性必须返回相对于初始包含块原点的视口左侧 x 坐标,如果没有视口,则返回零。
pageXOffset 属性必须返回由 scrollX 属性返回的值。
scrollY 属性必须返回相对于初始包含块原点的视口顶部 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字典成员的值。
测试
当 scrollTo() 方法被调用时,用户代理必须表现为调用了带有相同参数的 scroll() 方法。
当 scrollBy() 方法被调用时,用户代理必须执行以下步骤
-
如果使用两个参数调用,请遵循以下子步骤:
-
令 options 为 转换为
ScrollToOptions字典的 null 值。[WEBIDL] -
设 x 和 y 分别为这两个参数。
-
令 options 的
left字典成员的值为 x。 -
令 options 的
top字典成员的值为 y。
-
-
表现为调用了以 options 为唯一参数的
scroll()方法。
screenX 和 screenLeft 属性必须返回客户端窗口左侧相对于网络公开屏幕区域原点的 x 坐标(以 CSS 像素为单位),如果不存在则返回 0。
screenY 和 screenTop 属性必须返回客户端窗口顶部相对于网络公开屏幕区域的屏幕原点的 y 坐标(以 CSS 像素为单位),如果不存在则返回 0。
outerWidth 属性必须返回客户端窗口的宽度。如果没有客户端窗口,则此属性必须返回 0。
outerHeight 属性必须返回客户端窗口的高度。如果没有客户端窗口,则此属性必须返回 0。
devicePixelRatio 属性必须返回执行以下确定设备像素比算法的结果。
-
如果没有输出设备,则返回 1 并中止这些步骤。
-
令 device pixel size 为输出设备一个设备像素的垂直尺寸。
-
返回 CSS pixel size 除以 device pixel size 的结果。
4.1. open() 方法的 features 参数
HTML 定义了 open() 方法。本节定义了 features 参数中给出的位置和大小的行为。[HTML]
针对给定映射 tokenizedFeatures 的浏览上下文 target,设置浏览上下文特性
-
令 x 为 null。
-
令 y 为 null。
-
令 width 为 null。
-
令 height 为 null。
-
如果 tokenizedFeatures["left"] 存在
-
如果 x 是一个错误,则将 x 设置为 0。
-
可选地,以用户代理定义的方式对 x 进行钳制,以使窗口不会移出网络公开可用屏幕区域。
-
可选地,移动 target 的窗口,使其左边缘位于相对于网络公开屏幕区域左边缘的水平坐标 x 处,该坐标以 target 的CSS 像素测量。正轴向右。
-
如果 tokenizedFeatures["top"] 存在
-
如果 y 是一个错误,则将 y 设置为 0。
-
可选地,以用户代理定义的方式对 y 进行钳制,以使窗口不会移出网络公开可用屏幕区域。
-
可选地,移动 target 的窗口,使其顶部边缘位于相对于网络公开屏幕区域顶部边缘的垂直坐标 y 处,该坐标以 target 的CSS 像素测量。正轴向下。
-
如果 tokenizedFeatures["width"] 存在
-
如果 width 是一个错误,则将 width 设置为 0。
-
如果 width 不为 0
-
可选地,以用户代理定义的方式对 width 进行钳制,以使窗口不会变得太小或大于网络公开可用屏幕区域。
-
可选地,通过移动其右边缘来调整 target 窗口的大小,使得视口左右边缘之间的距离为 target 的 width 个CSS 像素。
-
可选地,以用户代理定义的方式移动 target 的窗口,使其不会增长到网络公开可用屏幕区域之外。
-
-
如果 tokenizedFeatures["height"] 存在
-
如果 height 是一个错误,则将 height 设置为 0。
-
如果 height 不为 0
-
可选地,以用户代理定义的方式对 height 进行钳制,以使窗口不会变得太小或大于网络公开可用屏幕区域。
-
可选地,通过移动其底边来调整 target 窗口的大小,使得视口顶部和底部边缘之间的距离为 target 的 height 个CSS 像素。
-
可选地,以用户代理定义的方式移动 target 的窗口,使其不会增长到网络公开可用屏幕区域之外。
-
支持的 open() 特性名称 是以下之一:
- width
- 视口的宽度。
- height
- 视口的高度。
- left
- 窗口的左侧位置。
- top
- 窗口的顶部位置。
4.2. MediaQueryList 接口
MediaQueryList 对象在创建时拥有一个关联的媒体查询列表和一个关联的文档。
MediaQueryList 对象有一个关联的媒体,它是关联媒体查询列表的序列化形式。
MediaQueryList 对象有一个关联的匹配状态,如果关联的媒体查询列表与文档的状态匹配,则为 true,否则为 false。
当被要求为 Document doc 评估媒体查询并报告更改时,运行以下步骤:
-
对于每个以 doc 作为其文档的
MediaQueryList对象 target,按它们创建的顺序(最旧的优先)运行以下子步骤:
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 属性必须返回关联的媒体。
matches 属性必须返回关联的匹配状态。
addListener(callback) 方法在被调用时必须运行以下步骤:
removeListener(callback) 方法在被调用时必须运行以下步骤:
注意:本规范最初有一种自定义回调机制,使用 addListener() 和 removeListener(),并以关联的媒体查询列表作为参数调用回调。现在改用常规的事件机制。为了向后兼容,addListener() 和 removeListener() 方法基本上分别别名为 addEventListener() 和 removeEventListener(),且 change 事件假装为一个 MediaQueryList。
以下是所有实现 MediaQueryList 接口的对象必须支持的事件处理器(及其对应的事件处理器事件类型),作为事件处理器 IDL 属性。
| 事件处理器 | 事件处理器事件类型 |
|---|---|
onchange
| change |
测试
- 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. 事件摘要
本节是非规范性的。
| Event | Interface | 感兴趣的目标 | 描述 |
|---|---|---|---|
change
| MediaQueryListEvent
| MediaQueryList
| 当匹配状态发生变化时,在 MediaQueryList 上触发。 |
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 属性必须返回网络公开可用屏幕区域的宽度。
availHeight 属性必须返回网络公开可用屏幕区域的高度。
width 属性必须返回网络公开屏幕区域的宽度。
height 属性必须返回网络公开屏幕区域的高度。
colorDepth 和 pixelDepth 属性应返回为输出设备中的像素分配的颜色位数,不包括 alpha 通道。如果用户代理无法返回输出设备使用的位数,则应返回最接近的估计值,例如,发送到显示器的帧缓冲使用的位数或任何最接近输出设备将使用的值的内部表示。用户代理对于这些属性返回的值必须至少等于color媒体特性值乘以 3。如果不同的颜色分量不是用相同数量的位数表示的,则返回值可能大于color媒体特性值的 3 倍。如果用户代理不知道色深或者出于隐私考虑不想返回该值,则应返回 24。
注意:出于兼容性原因,colorDepth 和 pixelDepth 属性返回相同的值。
注意:已知一些不符合规范的实现返回 32 而不是 24。
测试
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 并终止这些步骤。
-
如果视口中存在一个盒子,在应用适用于视口后代的变换时,该盒子在坐标 x,y 处是点击测试的目标,则返回关联的元素并终止这些步骤。
-
如果文档有根元素,则返回根元素并终止这些步骤。
-
返回 null。
注意:elementFromPoint() 方法不一定返回最顶层的绘制元素。例如,可以使用 pointer-events CSS 属性将元素排除在点击测试目标之外。
测试
- 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 的根是一个影子根,且 startNode 的根不是 options["
shadowRoots"] 中任何一项的包含影子根的包含祖先时,重复执行这些步骤: -
返回一个插入符号位置,并设置其属性如下:
-
注意:点击测试的具体细节超出了本规范的范围,因此 elementFromPoint() 和 caretPositionFromPoint() 的确切细节也超出范围。点击测试有望在 CSS 或 HTML 的未来版本中定义。
Document 接口上的 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对象,其中包含一个描述 SVG 规范定义的元素边框盒子的DOMRect对象,并应用适用于该元素及其祖先的变换。 -
返回一个
DOMRectList对象,按内容顺序包含为每个盒子片段准备的DOMRect对象,描述其边框区域(包括高度或宽度为零的区域),并带有以下约束:
注意:getClientRects() 返回的 DOMRect 对象不是实时的。
测试
- 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 调用时,必须返回获取边框盒 element 的结果。
注意:getBoundingClientRect() 返回的 DOMRect 对象不是实时的。
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() 方法提供了一组简单的检查,用于判断元素是否潜在地“可见”。它默认基于盒模型树采用一种非常简单直接的方法,但同时也允许根据所期望的“可见性”精确概念,选择加入若干额外的检查。当在元素 this 上调用时,checkVisibility(options) 方法必须执行以下步骤
-
如果 this 没有关联的盒模型,则返回 false。
-
如果 this 在扁平树中的祖先元素具有 content-visibility: hidden,则返回 false。
-
如果 options 的
opacityProperty或checkOpacity字典成员中任意一个为 true,且 this(或 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 correctly aligns target item respecting scroll-snap-align,
// scroll-margin, and the scroll container’s scroll-padding.
target. scrollIntoView({
// Only scroll the nearest scroll container.
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 上调用scroll(),以 options 作为唯一参数,并终止这些步骤。
当 scrollTo() 方法被调用时,用户代理必须表现得如同 scroll() 方法以相同的参数被调用一样。
当 scrollBy() 方法被调用时,用户代理必须执行以下步骤
-
如果使用一个参数调用,请遵循以下子步骤:
-
如果使用两个参数调用,请遵循以下子步骤:
-
将
scrollLeft的值加到left字典成员中。 -
表现得如同
scroll()方法以 options 作为唯一参数被调用一样。
当获取 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(),以 window 上的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 上调用
scroll(),以 x 作为第一个参数,以 window 上的scrollY作为第二个参数,并终止这些步骤。 -
如果该元素是
body元素,document 处于怪异模式,且该元素不是潜在可滚动的,则在 window 上调用scroll(),以 x 作为第一个参数,以 window 上的scrollY作为第二个参数,并终止这些步骤。
当获取 scrollWidth 属性时,必须返回运行以下步骤的结果
-
令 document 为该元素的节点文档。
-
如果 document 不是活动文档,则返回 0 并终止这些步骤。
-
令 视口宽度 为视口的宽度,不包含滚动条宽度(如果有),或者如果不存在视口,则为 0。
-
如果该元素是
body元素,document 处于怪异模式,且该元素不是潜在可滚动的,则返回 max(视口 滚动区域宽度, 视口宽度)。 -
如果该元素没有关联的盒模型,则返回 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 并终止这些步骤。
-
令 视口高度 为视口的高度,不包含滚动条高度(如果有),或者如果不存在视口,则为 0。
-
如果该元素是
body元素,document 处于怪异模式,且该元素不是潜在可滚动的,则返回 max(视口 滚动区域高度, 视口高度)。 -
如果该元素没有关联的盒模型,则返回 0 并终止这些步骤。
-
返回该元素滚动区域的高度。
当获取 clientTop 属性时,必须执行以下步骤
-
如果该元素没有关联的盒模型,或者盒模型是内联的,则返回 0。
-
返回未缩放的 border-top-width 属性的计算值,加上在顶部内边距边缘与顶部边框边缘之间渲染的任何滚动条高度,同时忽略应用于该元素及其祖先的任何变换。
测试
当获取 clientLeft 属性时,必须执行以下步骤
-
如果该元素没有关联的盒模型,或者盒模型是内联的,则返回 0。
-
返回未缩放的 border-left-width 属性的计算值,加上在左侧内边距边缘与左侧边框边缘之间渲染的任何滚动条宽度,同时忽略应用于该元素及其祖先的任何变换。
当获取 clientWidth 属性时,必须执行以下步骤
-
如果该元素没有关联的盒模型,或者盒模型是内联的,则返回 0。
-
如果该元素是根元素且该元素的节点文档不处于怪异模式,或者该元素是
body元素且该元素的节点文档确实处于怪异模式,则返回视口宽度(排除渲染的滚动条大小,如果有)。 -
返回未缩放的内边距边缘宽度,排除在内边距边缘和边框边缘之间渲染的任何滚动条宽度,同时忽略应用于该元素及其祖先的任何变换。
当获取 clientHeight 属性时,必须执行以下步骤
-
如果该元素没有关联的盒模型,或者盒模型是内联的,则返回 0。
-
如果该元素是根元素且该元素的节点文档不处于怪异模式,或者该元素是
body元素且该元素的节点文档确实处于怪异模式,则返回视口高度(排除渲染的滚动条大小,如果有)。 -
返回未缩放的内边距边缘高度,排除在内边距边缘和边框边缘之间渲染的任何滚动条高度,同时忽略应用于该元素及其祖先的任何变换。
当获取 currentCSSZoom 属性时,必须返回该元素的有效缩放比例;如果该元素未被渲染,则返回 1.0。
测试
6.1. Element 滚动成员
要为元素、伪元素或范围(即目标 target)确定滚动到视图中的位置,其中包含滚动行为 behavior、块流方向位置 block、内联基准方向位置 inline 以及一个滚动盒模型 scrolling box,需运行以下步骤
-
令 target bounding border box 为调用元素
getBoundingClientRect()的返回值所表示的盒模型(如果 target 是一个元素),或者为范围getBoundingClientRect()的返回值(如果 target 是一个范围)。 -
令 scrolling box edge A 为 scrolling box 在块流方向上的起始边缘,令 element edge A 为 target bounding border box 与 scrolling box edge A 在同一物理侧的边缘。
-
令 scrolling box edge B 为 scrolling box 在块流方向上的结束边缘,令 element edge B 为 target bounding border box 与 scrolling box edge B 在同一物理侧的边缘。
-
令 scrolling box edge C 为 scrolling box 在内联基准方向上的起始边缘,令 element edge C 为 target bounding border box 与 scrolling box edge C 在同一物理侧的边缘。
-
令 scrolling box edge D 为 scrolling box 在内联基准方向上的结束边缘,令 element edge D 为 target bounding border box 与 scrolling box edge D 在同一物理侧的边缘。
-
令 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",则在 scrolling box 的块流方向上,将 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",则在 scrolling box 的内联基准方向上,将 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 是一个元素,且目标元素定义了一些滚动捕捉位置,那么当其最近的滚动容器是一个滚动捕捉容器时,用户代理必须将所得的 position 滚动捕捉到该元素的其中一个滚动捕捉位置。即使在滚动容器具有 scroll-snap-type: none 时,用户代理也可以这样做。
-
返回 position。
-
-
按照从最内层到最外层滚动盒模型的顺序,对于每个建立滚动盒模型 scrolling box 的祖先元素或视口,运行以下子步骤
-
如果与 target 关联的
Document与与该元素或与 scrolling box 关联的视口关联的Document不是同源的,则终止这些步骤。 -
令 position 为通过运行确定滚动到视图中的位置的步骤所得到的滚动位置,其中使用 behavior 作为 滚动行为,block 作为 块流位置,inline 作为 内联基准方向位置,以及 scrolling box 作为 滚动盒模型。
-
如果 position 与 scrolling box 当前的滚动位置不相同,或者 scrolling box 正在进行平滑滚动,
-
如果 container 不为 null,且 scrolling box 或者是 container 的包含阴影树的包含祖先,或者是其文档为 container 的包含阴影树的包含祖先的视口,则中止剩余步骤。
-
要滚动元素(或伪元素)element 至 x,y,并可选地伴随滚动行为 behavior(如果省略则为 "auto"),意味着要
-
令 box 为 element 关联的滚动盒模型。
-
令 position 为 box 通过将滚动区域的 x 坐标 x 与 box 的左侧对齐,并将滚动区域的 y 坐标 y 与 box 的顶部对齐所能达到的滚动位置。
-
如果 position 与 box 当前的滚动位置相同,且 box 没有进行中的平滑滚动,则中止这些步骤。
-
执行 box 的滚动至 position,以 element 作为关联元素,并以 behavior 作为滚动行为。
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 并终止此算法
-
令 ancestor 为该元素在扁平树中的包含块,并重复这些子步骤
-
如果 ancestor 是初始包含块,若该元素的文档的
scrollingElement对该元素而言不是的,则返回该元素文档的scrollingElement,否则返回 null。 -
如果 ancestor 对该元素而言不是的,且是一个滚动容器,则终止此算法并返回 ancestor。
-
如果 ancestor 的 position 属性的计算值为 fixed,且没有任何祖先元素建立固定定位的 包含块(containing block),则终止此算法并返回 null。
-
令 ancestor 为 ancestor 在 平铺树(flat tree) 中的 包含块。
-
offsetParent 属性必须返回运行这些步骤的结果。
-
如果满足以下任一条件,则返回 null 并终止此算法:
-
令 ancestor 为该元素在 平铺树 中的父级,并重复这些子步骤:
测试
offsetTop 属性必须返回运行这些步骤的结果。
-
如果该元素的
offsetParent为 null,则返回该元素关联的第一个 盒子 的顶部 边框边缘(border edge) 相对于 初始包含块 原点的 未缩放 y 坐标,忽略应用于该元素及其祖先的任何 变换(transforms),并终止此算法。 -
返回该元素关联的第一个 盒子 的顶部 边框边缘 y 坐标,减去该元素的
offsetParent关联的第一个 盒子 的顶部 内边距边缘(padding edge) 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 属性必须返回运行这些步骤的结果。
-
如果该元素没有任何关联的 盒子,则返回 0 并终止此算法。
-
返回该元素 主体盒子(principal box) 生成的所有片段的 边框盒子(border boxes) 的轴对齐外接矩形的 未缩放 宽度,忽略应用于该元素及其祖先的任何 变换。
如果该元素的 主体盒子 是被 块级(block-level) 后代“分割”的 行内级盒子,则还应包含该 块级 后代生成的片段,除非它们的宽度或高度为零。
offsetHeight 属性必须返回运行这些步骤的结果。
-
如果该元素没有任何关联的 盒子,则返回 0 并终止此算法。
-
返回该元素 主体盒子 生成的所有片段的 边框盒子 的轴对齐外接矩形的 未缩放 高度,忽略应用于该元素及其祖先的任何 变换。
如果该元素的 主体盒子 是被 块级 后代“分割”的 行内级盒子,则还应包含该 块级 后代生成的片段,除非它们的宽度或高度为零。
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() 方法在调用时,如果该范围不在文档中,则必须返回一个空的 DOMRectList 对象,否则返回一个 DOMRectList 对象,其中包含按内容顺序排列并符合以下约束的 DOMRect 对象列表:
-
对于范围选择的每个元素,如果其父级未被该范围选择,则包含通过在该元素上调用
getClientRects()所返回的边框区域。 -
对于被范围选择或部分选择的每个
Text节点(包括边界点相同的情况),包含一个 已缩放 的DOMRect对象(针对选择的部分,而非整个行框)。这些DOMRect对象的边界是使用字体指标计算的;因此,对于水平书写,每个盒子的垂直维度由字体上升(ascent)和下降(descent)确定,水平维度由文本推进宽度确定。如果范围覆盖了部分 排版字符单元(typographic character unit)(例如,代理对的一半或字位簇的一部分),则为了计算相关DOMRect的边界,必须包含完整的 排版字符单元。 [CSS-TEXT-3] 祖先元素应用的 变换 将被应用。
注意:由 getClientRects() 返回的 DOMRect 对象不是 实时的(live)。
测试
getBoundingClientRect() 方法在调用时,必须返回以下算法的结果。
-
令 list 为在该方法被调用的同一范围上调用
getClientRects()的结果。 -
如果 list 中的所有矩形宽度或高度均为 0,则返回 list 中的第一个矩形。
-
否则,返回一个
DOMRect对象,描述包含 list 中所有高度或宽度不为 0 的矩形的最小矩形。
注意:由 getBoundingClientRect() 返回的 DOMRect 对象不是 实时的。
10. MouseEvent 接口的扩展
对象 IDL 片段重定义了一些成员。我们能以某种方式解决这个问题吗?
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 属性必须遵循以下步骤:
-
返回 offset 与事件
clientY属性值的总和。
clientX 属性必须返回事件发生位置相对于 视口(viewport) 原点的 x 坐标。
clientY 属性必须返回事件发生位置相对于 视口 原点的 y 坐标。
offsetX 属性必须遵循以下步骤:
offsetY 属性必须遵循以下步骤:
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
不允许跨框架,抛出 WrongDocumentError?
点被平坦化(3D 变换),z=0,类似于 getClientRect
测试块级元素在行内元素中
伪元素 before/after 是元素的子级
视口盒子都是一样的
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 属性必须运行这些步骤:
-
如果 视觉视口(visual viewport) 的 关联文档 不是 完全活动(fully active) 的,则返回 0。
-
否则,返回 视觉视口 左边缘相对于 布局视口(layout viewport) 左边缘的偏移量。
offsetTop 属性必须运行这些步骤:
pageLeft 属性必须运行这些步骤:
pageTop 属性必须运行这些步骤:
width 属性必须运行这些步骤:
-
否则,返回 视觉视口 的宽度,减去任何固定在视觉视口上的已渲染垂直 经典滚动条(classic scrollbar) 的宽度。
注意:由于此值是以 CSS 像素返回的,因此如果增加 页面缩放(page zoom) 或 缩放因子(scale factor),该值的大小将会减小。
注意:固定在视觉视口上的滚动条是指在缩放和平移视觉视口时不会改变大小或位置的滚动条。由于此值是以 CSS 像素为单位的,因此在排除滚动条宽度时,UA 必须考虑滚动条在 CSS 像素中的大小。也就是说,当放大时,排除的数量会减少;当缩小时,排除的数量会增加。
height 属性必须运行这些步骤:
scale 属性必须运行这些步骤:
onresize 是 resize 事件的 事件处理程序 IDL 属性。
onscroll 是 scroll 事件的 事件处理程序 IDL 属性。
onscrollend 是 scrollend 事件的 事件处理程序 IDL 属性。
13. 事件
13.1. 调整视口大小
本节与 HTML 中定义的 事件循环(event loop) 集成。 [HTML]
当被要求为 Document doc 运行调整大小步骤(run the resize steps) 时,运行以下步骤:
-
如果 doc 的 视口 自上次运行这些步骤以来,其宽度或高度发生了变化(例如由于用户调整了浏览器窗口,或更改了 页面缩放,或
iframe元素的尺寸发生了变化),则在与 doc 关联的Window对象上 触发(fire) 一个名为 resize 的事件。 -
如果与 doc 关联的
VisualViewport的 scale、width 或 height 属性自上次运行这些步骤以来发生了变化,则在VisualViewport上 触发 一个名为 resize 的事件。
测试
13.2. 滚动
每个 Document 都有一个关联的 待处理滚动事件目标列表(pending scroll event targets),最初为空。
每个 Document 都有一个关联的 待处理 scrollend 事件目标列表,最初为空。
每当 视口 发生滚动(无论是响应用户交互还是通过 API),用户代理都必须运行以下步骤:
-
如果 doc 是一个 滚动捕捉容器(snap container),则运行 更新 scrollsnapchanging 目标 的步骤,其中 doc 在块轴方向的 最终捕捉目标 为 newBlockTarget,doc 在内联轴方向的 最终捕捉目标 为 newInlineTarget。
-
如果 doc 已经在 doc 的 待处理滚动事件目标列表 中,则终止这些步骤。
-
将 doc 添加到 doc 的 待处理滚动事件目标列表 中。
每当元素发生滚动(无论是响应用户交互还是通过 API),用户代理都必须运行以下步骤:
-
令 doc 为该元素的 节点文档(node document)。
-
如果该元素是 滚动捕捉容器,则运行 更新 scrollsnapchanging 目标 的步骤,其中该元素在块轴方向的 最终捕捉目标 为 newBlockTarget,该元素在内联轴方向的 最终捕捉目标 为 newInlineTarget。
-
如果该元素已经在 doc 的 待处理滚动事件目标列表 中,则终止这些步骤。
-
将该元素添加到 doc 的 待处理滚动事件目标列表 中。
每当 视觉视口 发生滚动(无论是响应用户交互还是通过 API),用户代理都必须运行以下步骤:
-
令 vv 为滚动的
VisualViewport对象。 -
令 doc 为 vv 的 关联文档。
-
如果 vv 已经在 doc 的 待处理滚动事件目标列表 中,则终止这些步骤。
-
将 vv 添加到 doc 的 待处理滚动事件目标列表 中。
当被要求为 Document doc 运行滚动步骤(run the scroll steps) 时,运行以下步骤:
-
运行为 doc 分发待处理 scrollsnapchanging 事件 的步骤。
-
对于 doc 的 待处理滚动事件目标列表 中的每个项目 target,按添加到列表的顺序,运行以下子步骤:
-
清空 doc 的 待处理滚动事件目标列表。
-
运行为 doc 分发待处理 scrollsnapchange 事件 的步骤。
每当滚动 完成(completed) 时,用户代理必须运行以下步骤:
scrollend 事件的触发顺序是什么?是基于滚动开始还是滚动完成?
-
对于每个已滚动的滚动盒子 box:
-
如果 box 属于一个 视口,令 doc 为 视口 的关联
Document,target 为该 视口。如果 box 属于一个VisualViewport,令 doc 为VisualViewport的 关联文档,target 为该VisualViewport。否则,box 属于一个元素,令 doc 为该元素的 节点文档,target 为该元素。 -
如果 box 属于一个 滚动捕捉容器 snapcontainer,则运行 snapcontainer 的 更新 scrollsnapchange 目标 步骤。
-
如果 target 已经在 doc 的 待处理 scrollend 事件目标列表 中,则终止这些步骤。
-
将 target 添加到 doc 的 待处理 scrollend 事件目标列表 中。
-
-
运行为 doc 分发待处理 scrollsnapchange 目标 的步骤。
-
对于 doc 的 待处理 scrollend 事件目标列表 中的每个项目 target,按添加到列表的顺序,运行以下子步骤:
-
清空 doc 的 待处理 scrollend 事件目标列表。
13.3. 事件摘要
本节是非规范性的。
| Event | Interface | 感兴趣的目标 | 描述 |
|---|---|---|---|
resize
| Event
| Window, VisualViewport | 当 视口 大小调整时,在 Window 上触发。当 视觉视口 大小调整或 布局视口 被缩放时,在 VisualViewport 上触发。 |
scroll
| Event
| VisualViewport, Document, 元素 | 当 VisualViewport、视口 或元素分别发生滚动时,分别在 VisualViewport、Document 或元素上触发。 |
scrollend
| Event
| Document, 元素, VisualViewport | 当滚动 完成 时,在 VisualViewport、Document 或元素上触发:VisualViewport、视口 或元素已滚动,滚动序列已结束,并且任何滚动偏移量的更改均已应用。 |
14. 布局后状态快照
一些 CSS 特性使用布局后的状态(如滚动位置)作为下一次样式和布局更新的输入。
当被要求为 Document doc 运行快照布局后状态步骤(run snapshot post-layout state steps) 时,运行以下步骤:
-
对于每个需要对布局后状态进行快照的 CSS 特性,拍摄 doc 中相关状态的快照。
拍摄快照的状态在其他规范中定义。这些步骤绝不能以其他布局后快照步骤能够观察到该快照发生的方式使 doc 或任何其他 Document 失效。因此,此类快照进行的顺序必须无关紧要。
15. 隐私考量
Screen 接口公开了有关用户显示配置的信息,这些信息可能被用作指纹算法的输入。用户代理可以选择隐藏或量化有关屏幕大小或配置的信息,以保护用户的隐私。
MouseEvent 包含有关事件相对于屏幕的坐标信息。用户代理可以将这些属性设置为掩盖事件实际屏幕相对位置的值,以保护用户的隐私。
16. 安全考量
本规范未报告任何新的安全考量。
17. 变更
本节记录了本规范各个版本之间的一些变更。本节并不详尽。错误修复和编辑性更改通常不会列出。
自 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-snap)添加到受 scroll-behavior 影响的滚动列表中。
-
修复了术语部分的一个逻辑错误。
-
添加了“安全考量”和“隐私考量”部分。
-
将 scroll-behavior 属性移至 [CSS-OVERFLOW-3]。
-
调整了
offsetWidth和offsetHeight的算法。 -
向
Element添加了checkVisibility()方法。 -
将 scrollend 事件从 WICG overscroll-scrollend-events 移至 [CSSOM-VIEW-1] 并添加了处理细节。
-
向
getBoundingClientRect()添加了一个“获取外接矩形”算法。 -
引入了
VisualViewportAPI 及相关概念。 -
扩展滚动到视图算法,使其也能作用于
Ranges。 -
阐明了各种 API 相对于 zoom 属性返回的是缩放后还是未缩放的尺寸。
-
在各种滚动 API 中考虑了滚动捕捉和滚动目标。
-
向
Element添加了currentCSSZoom属性。 -
向
caretPositionFromPoint()方法添加了 options 参数。 -
从 CaretPosition 接口中删除了 caret range 概念。
-
定义了布局后快照。
-
使各种滚动算法能够接受伪元素。
-
向
ScrollIntoViewOptions添加了 container 选项。 -
添加了
scrollParent属性。 -
Pinch zoom 重命名为 缩放因子(scale factor)。
自 2013 年 12 月 17 日工作草案以来的变更
-
更改并扩展了
Element上的scrollIntoView()方法。 -
Element上的scrollTop和scrollLeftIDL 属性已更改为不再接受对象;改为添加了scroll()、scrollTo()和scrollBy()方法。 -
Element上的scrollWidth、scrollHeight、clientTop、clientLeft、clientWidth和clientHeightIDL 属性已改回返回整数。 -
删除了
DOMRectList接口。 -
添加了
Document上的scrollingElementIDL 属性。 -
Window上的某些只读属性被标记为[Replaceable]IDL 扩展属性。 -
MediaQueryList、scroll 事件和 resize 事件与 HTML 中的 事件循环 集成,以便它们与动画帧同步。 -
scroll-behavior 的
instant值重命名为 auto。 -
更改了
Element上scrollLeft的原点(针对 RTL)。 -
Element上的scrollIntoView()方法,以及Window上的scroll()、scrollTo()和scrollBy()方法现在将相关字典作为第一个参数。 -
MediaQueryList接口已更改为使用常规事件 API,并据此定义addListener()。 -
添加了“变更历史”部分。
-
将 Glenn Adams 移至前任编辑。
自 2011 年 8 月 4 日工作草案以来的变更
-
添加 Simon Pieters 和 Glenn Adams 为编辑,并将 Anne van Kesteren 移至前任编辑。
-
引入了 scroll-behavior CSS 属性。
-
从 [CSS-WRITING-MODES-3] 中添加了 块流方向(Block flow direction) 和 行内基准方向(inline base direction) 到术语表。
-
添加了关于缩放的部分。
-
向
Window添加了moveTo()、moveBy()、resizeTo()和resizeBy()方法。 -
向
Window添加了devicePixelRatio属性。 -
引入了
ScrollOptions字典,并为滚动方法添加了一个 options 参数。 -
向
Window添加了devicePixelRatio属性。 -
向
open()方法添加了 features 参数。 -
向
Document添加了elementsFromPoint()方法。 -
向
CaretPosition添加了getClientRect()方法。 -
引入了
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。 -
向
Element接口添加了scrollIntoView()方法。
自 2008 年 2 月 22 日工作草案以来的变更
-
移除了
WindowView接口,并将其属性和方法移至AbstractView及继承的ScreenView接口。 -
向
AbstractView添加了documentIDL 属性。 -
向
ScreenView接口添加了scroll()、scrollTo()和scrollBy()方法。 -
移除了
ElementView接口,并将其属性和方法移至Element和HTMLElement接口。 -
向
DocumentView接口添加了defaultViewIDL 属性和caretRangeFromPoint()方法。 -
移除了
RangeView接口,转而直接扩展Range接口。 -
移除了
MouseEventView接口,转而直接扩展MouseEvent接口。 -
将
TextRectangleList接口重命名为ClientRectList,并将item()方法转换为索引获取器。 -
将
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 浏览器广泛部署的微软员工。