绘制计时

W3C 工作草案

关于本文件的更多信息
此版本:
https://www.w3.org/TR/2025/WD-paint-timing-20250517/
最新发布版本:
https://www.w3.org/TR/paint-timing/
编辑草案:
https://w3c.github.io/paint-timing/
以往版本:
历史:
https://www.w3.org/standards/history/paint-timing/
反馈:
GitHub
规范内标注
编辑者:
(Google)
(特邀专家)
前任编辑:
(Google)
(Google)

摘要

本文档定义了一个 API,开发者可用其捕获页面加载过程中若干关键时刻(首次绘制、首次内容绘制),这些时刻对开发者具有重要意义。

文档状态

本节描述了本文件在发布时的状态。当前 W3C 出版物列表以及本技术报告的最新修订版本可在 W3C 标准与草案索引 https://www.w3.org/TR/ 查阅。

本文件由 Web 性能工作组 作为工作草案发布,遵循推荐标准流程。 工作草案的发布不代表 W3C 及其成员的认可。

本文件为草案,有可能随时被更新、替换或废弃。除作为进行中的工作外,不宜作为引用依据。

关于本规范的讨论,建议优先使用GitHub Issues

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

本文件由遵循 W3C 专利政策 的组织发布。 W3C 维护着公开专利披露列表,记录与本工作组交付物相关的专利披露; 该页面还说明了专利披露的流程。 任何个人若确知某专利包含必要声明,须依照W3C 专利政策第6节披露相关信息。

1. 简介

本节为非规范性内容。

Web 浏览器的主要作用之一是将 HTML、CSS 和图片资源转化为用户屏幕上的像素。衡量网页性能通常涉及测量完成这些任务(即将文本或图片内容渲染到屏幕)所需的时间。虽然有许多不同的方法可以利用这些计时信息来评判页面性能或加载体验,但所有这些方法本质上都依赖于统一的时间测量方式。

本文件是一个基础规范,规定了如何作为通用机制测量绘制计时(Paint Timing)。在此基础上,定义了“首次绘制(First Paint)”和“首次内容绘制(First Contentful Paint)”等指标。其它具体的绘制测量实例可能由其他文档进一步规定。

具体而言,本规范涵盖:

1.1. 首次绘制与首次内容绘制

“加载”并非单一时刻——它是一种体验,没有任何单一指标能够完全描述。加载体验过程中有多个时刻会影响用户对“快”或“慢”的感知。

首次绘制(FP)是这些关键时刻中的第一个,紧随其后的是首次内容绘制(FCP)。这些指标标记了浏览器渲染特定文档的时间点。对用户来说,这很重要,因为它回答了“页面是不是开始有动静了?”这一问题。

两者的主要区别在于:FP 标志着浏览器首次为特定文档渲染任何内容的时刻;而 FCP 标志着浏览器首次从 DOM 渲染出图片或文本内容的时刻。

1.2. 用法示例

const observer = new PerformanceObserver(function(list) {
    const perfEntries = list.getEntries();
    for (const perfEntry of perfEntries) {
        // 处理条目
        // 上报分析和监控
        // ...
    }
});

// 注册观察者以获取绘制计时通知
observer.observe({entryTypes: ["paint"]});

2. 术语

绘制(Paint):当用户代理将渲染树转换为屏幕上的像素时,即执行了“绘制”(或“渲染”)。正式地讲,当用户代理执行了事件循环中的 更新渲染步骤时,视为已“渲染”文档。

注意:渲染管线非常复杂,时间戳应为用户代理在该管线中能够记录到的最新时间戳(尽力而为)。通常建议此 API 采用提交帧给操作系统用于显示的时间。

当以下条件全部满足时,生成内容伪元素可绘制伪元素

当以下条件全部满足时,CSS 图像 img有内容的图像(contentful image)

DOMString 至少包含一个非文档空白字符的字符时,视为非空(non-empty)

当以下任一条件满足时,元素 target有内容(contentful)

当下列之一成立时,元素可计时(timing-eligible)

要计算可绘制包围矩形(paintable bounding rect),请对元素 target执行以下步骤:

  1. boundingRect 为在 target 上运行 getBoundingClientRect() 的结果。

  2. boundingRect文档滚动区域裁剪。

  3. 返回 boundingRect

注意:overflow: scrolloverflow: hidden 包含的元素,其可绘制包围矩形不会被裁剪,因为这两种情况下元素都可以通过滚动变为可见。

当以下条件全部满足时,元素 el可绘制(paintable)

首次绘制(First paint)条目包含一个 DOMHighResTimeStamp ,表示用户代理在导航后首次渲染的时间。该时间不包括默认背景绘制,但包括非默认背景绘制及 iframe 的包围框。它是开发者关心的页面加载第一个关键时刻——即用户代理开始渲染页面的时刻。

当以下任一条件满足时,浏览上下文 ctx可绘制计时(paint-timing eligible)

3. PaintTimingMixin 接口

[Exposed=Window]
interface mixin PaintTimingMixin {
    readonly attribute DOMHighResTimeStamp paintTime;
    readonly attribute DOMHighResTimeStamp? presentationTime;
};

包含 PaintTimingMixin 接口混入的对象拥有一个相关的 绘制计时信息(paint timing info)(为 null 或 绘制计时信息)。

绘制计时信息(paint timing info) 是一个 结构体(struct),包含以下

渲染更新结束时间(rendering update end time)

一个 DOMHighResTimeStamp

实现定义的呈现时间(implementation-defined presentation time)

Null 或 DOMHighResTimeStamp

paintTime 属性的 getter 步骤为返回 this绘制计时信息渲染更新结束时间

presentationTime 属性的 getter 步骤(如存在)为返回 this绘制计时信息实现定义的呈现时间

获取 默认绘制时间戳(default paint timestamp),针对 绘制计时信息 paintTimingInfo,返回 paintTimingInfo实现定义的呈现时间(如不为 null),否则返回 paintTimingInfo渲染更新结束时间

4. PerformancePaintTiming 接口

[Exposed=Window]
interface PerformancePaintTiming : PerformanceEntry {
    [Default] object toJSON();
};
PerformancePaintTiming includes PaintTimingMixin;

PerformancePaintTiming 扩展了 PerformanceEntry 接口的以下属性:

注意:实现 PerformancePaintTiming 的用户代理应在 全局对象supportedEntryTypes 中包含 "paint",且该全局对象的浏览上下文需为可绘制计时。 这样开发者可以检测特定浏览上下文是否支持绘制计时。

5. 处理模型

5.1. 关联图片请求

每个 Element 都有一个关联图片请求(associated image request),可为 图片请求(image request) 或 null,初始值为 null。

Element 类型的 elementHTMLImageElementSVGImageElementHTMLVideoElement 时,若创建了新的图片资源(如用于显示图片或封面图片),则 element关联图片请求被设置为该图片资源的 图片请求

注意:每个通过 URL 且 scheme 等于 "data" 获得的图片资源,都有一个关联 图片请求,该图片请求不会被真正抓取但仍需要加载。此请求可成为 Element关联图片请求

注意:当前措辞较为宽泛,因为并未指向具体算法。待相关处理模型更加统一后,可进一步细化。

每个 Element 还有一个 关联背景图片请求(associated background image requests)的列表,初始为空数组。当 Element element 的样式需要新的图片资源(如用作背景图片)时,新资源创建的 图片请求会被添加到 element关联背景图片请求列表中。

注意:一个 Element 可以有多个 图片请求,例如其 background-image 属性有多个值。如下例所示,一个 background-image 属性可产生多个 图片请求,每个都会被后续算法记录和上报。

<!DOCTYPE html>
<style>
div {
  background-image: url(https://images.example/background1.png),
                    url(https://images.example/background2.png);
}
</style>
<div></div>
<div></div>

5.2. 记录绘制计时

待处理图片记录(pending image record)是一个结构体,包含如下

每个 Element 都有一个拥有的文本节点集合(set of owned text nodes),为Text 节点组成的有序集合,初始为空。

每个 Document 都有一个已上报绘制集合(set of previously reported paints),为字符串有序集合,初始为空。

每个 Document 都有一个待渲染图片列表(images pending rendering),为待处理图片记录(pending image record)列表,初始为空。

每个 Document 都有一个已渲染文本元素集合(set of elements with rendered text),为Element有序集合,初始为空。

5.2.1. 对 CSS 规范的修改

每当 Element element关联背景图片请求(associated background image requests)中的某个图片请求(image request)变为完全可用时,执行处理已加载完成图片(process an image that finished loading)算法,参数为 element 和该图片请求。

5.2.2. 对 HTML 规范的修改

Element element关联图片请求(associated image request)变为完全可用时,执行处理已加载完成图片算法,参数为 element 及其关联图片请求。

当用户代理首次绘制 Text 节点 text 时,应执行以下步骤:

5.2.3. 处理已加载完成图片

处理已加载完成图片(process an image that finished loading),给定 Element element图片请求 imageRequest,按如下步骤:

  1. rootelement根节点(root)

  2. root 不是 Document,则返回。

  3. nowelement相关全局对象(relevant global object)下的当前高精度时间

  4. record待处理图片记录,其 elementelementrequestimageRequestloadTimenow

  5. record 添加到 root待渲染图片列表中。

5.3. 上报绘制计时

5.3.1. 首次内容绘制

判断Document document 是否应上报首次内容绘制(should report first contentful paint),执行如下步骤:

  1. document已上报绘制集合 包含 "first-contentful-paint",则返回 false。

  2. document 至少包含一个同时为可绘制有内容元素,则返回 true。

  3. 否则,返回 false。

5.3.2. 标记绘制计时

当要求对 标记绘制计时,并以 文档(Document) document 作为输入时,执行如下步骤:

  1. 如果 document浏览上下文不是可绘制计时,则返回。

  2. paintTimingInfo 为新的绘制计时信息,其 渲染更新结束时间document相关全局对象下的当前高精度时间

  3. paintedImages 为新的有序集合

  4. paintedTextNodes 为新的有序集合

  5. doc待渲染图片列表中的每个 record

    1. 如果 recordrequest可用且准备好被绘制,则执行:

      1. record 追加到 paintedImages

      2. doc待渲染图片列表中移除 record

  6. doc所有后代元素中的每个 Element element

    1. element 已包含于 doc已渲染文本元素集合中,则继续。

    2. element拥有的文本节点集合为空,则继续。

    3. element 添加到 doc已渲染文本元素集合中。

    4. element 添加到 paintedTextNodes

  7. reportedPaintsdocument已上报绘制集合

  8. frameTimingInfodocument当前帧计时信息

  9. document当前帧计时信息 设为 null。

  10. flushPaintTimings 为以下步骤:

    1. 如果 reportedPaints 不包含 "first-paint",且用户代理已配置为标记首次绘制,则对 document"first-paint"paintTimingInfo 执行 上报绘制计时

      注意: 首次绘制不包括默认背景绘制,但包括非默认背景绘制。

      此处应为规范性注释。

    2. 如果 document 应上报首次内容绘制,则:

      1. document"first-contentful-paint"paintTimingInfo 执行 上报绘制计时

      注意: 父 frame 不应感知子 iframe 的绘制事件,反之亦然。因此只包含 iframe 的 frame 会有首次绘制(由于 iframe 的包围框),但没有首次内容绘制

      注意: 文档不保证一定会标记 "first-paint""first-contentful-paint"。完全空白的文档可能永远不会标记首次绘制,而只包含非有内容元素的文档也可能永远不会标记首次内容绘制

      注意: 首次绘制的标记是可选的,实现绘制计时的用户代理至少应标记首次内容绘制

    3. 上报最大内容绘制(Report largest contentful paint),参数为 documentpaintTimingInfopaintedImagespaintedTextNodes

    4. 上报元素计时(Report element timing),参数为 documentpaintTimingInfopaintedImagespaintedTextNodes

    5. 如果 frameTimingInfo 不为 null,则以 documentframeTimingInfopaintTimingInfo 参数,队列一个长动画帧条目(queue a long animation frame entry)

  11. 如果用户代理不支持实现定义的呈现时间,调用 flushPaintTimings 并返回。

  12. 并行执行以下步骤:

    1. 等待当前帧被显示给用户的实现定义时刻。

    2. paintTimingInfo实现定义的呈现时间 设为 document相关全局对象下的当前高精度时间

    3. document跨域隔离能力(cross-origin isolated capability)为 false,则:

      1. paintTimingInfo实现定义的呈现时间 向上舍入到 4 毫秒的整数倍或更大。

      2. 等待,直到当前高精度时间等于 paintTimingInfo实现定义的呈现时间

    4. document相关全局对象上,向 性能时间线任务源(performance timeline task source)队列中添加全局任务,以运行 flushPaintTimings

5.3.3. 上报绘制计时

要根据参数 documentpaintType绘制计时信息(paint timing info) paintTimingInfo 执行 上报绘制计时,请执行以下步骤:
  1. 创建一个新的 PerformancePaintTiming 对象 newEntry,位于 document相关 realm,并按如下设置其属性:

    1. 设置 newEntryname 属性为 paintType

    2. 设置 newEntryentryType 属性为 "paint"

    3. 设置 newEntrystartTime 属性为 默认绘制时间戳(default paint timestamp),参数为 paintTimingInfo

    4. 设置 newEntryduration 属性为 0。

  2. 设置 newEntry绘制计时信息(paint timing info)paintTimingInfo

  3. newEntry 加入队列document相关 realm

  4. paintType 添加到 document已上报绘制集合中。

5.4. 通用算法

5.4.1. 对绘制计时暴露

要判断 元素 element 是否对绘制计时暴露(exposed for paint timing),给定 Document 或 null document,执行如下步骤:

  1. 如果 element连接,返回 false。

  2. 如果 document 为 null,则令 documentelement相关设置对象(relevant settings object)相关全局对象关联文档

  3. 如果 document 不是完全激活,返回 false。

  4. 如果 element根节点不等于 document,返回 false。

  5. 返回 true。

6. 致谢

特别感谢所有贡献者,他们的技术意见和建议促使本规范不断完善。

一致性

文档约定

一致性要求通过描述性断言和 RFC 2119 术语组合表达。 规范性部分中,“必须(MUST)”、“不得(MUST NOT)”、“要求(REQUIRED)”、“应当(SHALL)”、“不应当(SHALL NOT)”、“应该(SHOULD)”、“不应该(SHOULD NOT)”、“建议(RECOMMENDED)”、“可以(MAY)”以及“可选(OPTIONAL)”等关键词, 均应按照 RFC 2119 的定义进行解释。 但为便于阅读,本规范中未将这些词全部大写。

除非明确标注为非规范性、示例或注释,否则本规范的所有内容均为规范性内容。[RFC2119]

本规范中的示例以“例如”开头,或通过 class="example" 与规范性文本区分,形式如下:

这是一个信息性示例。

信息性注释以“注”开头,并通过 class="note" 与规范性文本区分,形式如下:

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

符合规范的算法

以命令式表述的算法要求(如“去除所有前导空格字符”或“返回 false 并中止这些步骤”), 其解释应结合引入算法时使用的关键词(如“必须”、“应该”、“可以”等)。

以算法或特定步骤形式提出的一致性要求,可以通过任何方式实现,只要最终结果等价即可。 特别地,本规范定义的算法旨在便于理解,而非强调性能。 鼓励实现者进行优化。

索引

本规范定义的术语

引用定义的术语

参考文献

规范性引用

[CSS-BACKGROUNDS-3]
Elika Etemad;Brad Kemper. CSS 背景与边框模块第 3 级(CSS Backgrounds and Borders Module Level 3)。2024 年 3 月 11 日。CRD。URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS-CASCADE-5]
Elika Etemad;Miriam Suzanne;Tab Atkins Jr. CSS 级联与继承第 5 级(CSS Cascading and Inheritance Level 5)。2022 年 1 月 13 日。CR。URL: https://www.w3.org/TR/css-cascade-5/
[CSS-COLOR-3]
Tantek Çelik;Chris Lilley;David Baron. CSS 颜色模块第 3 级(CSS Color Module Level 3)。2022 年 1 月 18 日。REC。URL: https://www.w3.org/TR/css-color-3/
[CSS-DISPLAY-4]
Elika Etemad;Tab Atkins Jr. CSS 显示模块第 4 级(CSS Display Module Level 4)。2024 年 12 月 19 日。FPWD。URL: https://www.w3.org/TR/css-display-4/
[CSS-FONTS-4]
Chris Lilley. CSS 字体模块第 4 级(CSS Fonts Module Level 4)。2024 年 2 月 1 日。WD。URL: https://www.w3.org/TR/css-fonts-4/
[CSS-TEXT-4]
Elika Etemad 等. CSS 文本模块第 4 级(CSS Text Module Level 4)。2024 年 5 月 29 日。WD。URL: https://www.w3.org/TR/css-text-4/
[CSSOM-VIEW-1]
Simon Pieters. CSSOM 视图模块(CSSOM View Module)。2016 年 3 月 17 日。WD。URL: https://www.w3.org/TR/cssom-view-1/
[DOM]
Anne van Kesteren. DOM 标准(DOM Standard)。现行标准。URL: https://dom.spec.whatwg.org/
[ELEMENT-TIMING]
Element Timing API。编辑草案。URL: https://w3c.github.io/element-timing/
[HR-TIME-3]
Yoav Weiss. 高精度时间(High Resolution Time)。2024 年 11 月 7 日。WD。URL: https://www.w3.org/TR/hr-time-3/
[HTML]
Anne van Kesteren 等. HTML 标准(HTML Standard)。现行标准。URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren;Domenic Denicola. Infra 标准(Infra Standard)。现行标准。URL: https://infra.spec.whatwg.org/
[PERFORMANCE-TIMELINE]
Nicolas Pena Moreno. 性能时间线(Performance Timeline)。2025 年 2 月 13 日。CRD。URL: https://www.w3.org/TR/performance-timeline/
[RFC2119]
S. Bradner. 在 RFC 中用于指示需求级别的关键词(Key words for use in RFCs to Indicate Requirement Levels)。1997 年 3 月。最佳当前实践。URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECTORS-4]
Elika Etemad;Tab Atkins Jr. 选择器第 4 级(Selectors Level 4)。2022 年 11 月 11 日。WD。URL: https://www.w3.org/TR/selectors-4/
[SVG2]
Amelia Bellamy-Royds 等. 可缩放矢量图(SVG)2(Scalable Vector Graphics (SVG) 2)。2018 年 10 月 4 日。CR。URL: https://www.w3.org/TR/SVG2/
[WEBIDL]
Edgar Chen;Timothy Gu. Web IDL 标准(Web IDL Standard)。现行标准。URL: https://webidl.spec.whatwg.org/

补充性引用

[URL]
Anne van Kesteren. URL 标准(URL Standard)。现行标准。URL: https://url.spec.whatwg.org/

IDL 索引

[Exposed=Window]
interface mixin PaintTimingMixin {
    readonly attribute DOMHighResTimeStamp paintTime;
    readonly attribute DOMHighResTimeStamp? presentationTime;
};

[Exposed=Window]
interface PerformancePaintTiming : PerformanceEntry {
    [Default] object toJSON();
};
PerformancePaintTiming includes PaintTimingMixin;

问题索引

此处应为规范性注释。
MDN

PerformancePaintTiming

In all current engines.

Firefox84+Safari14.1+Chrome60+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?