最大内容绘制

W3C 工作草案,

关于本文档的更多细节
本版本:
https://www.w3.org/TR/2025/WD-largest-contentful-paint-20250911/
最新发布版本:
https://www.w3.org/TR/largest-contentful-paint/
编辑草稿:
https://w3c.github.io/largest-contentful-paint/
历史版本:
历史记录:
https://www.w3.org/standards/history/largest-contentful-paint/
测试套件:
https://github.com/web-platform-tests/wpt/tree/master/largest-contentful-paint
反馈:
GitHub
编辑者:
(Google)
(Google)

摘要

本文档定义了一个 API,用于监测元素在屏幕上触发的最大绘制。

本文档状态

本节描述了本文档在发布时的状态。 当前 W3C 发布物列表 和本技术报告的最新修订版 可在 W3C 标准与草案索引中找到。

本文档由Web 性能工作组 作为推荐路线下的工作草案发布。 作为工作草案发布 并不意味着 W3C 及其成员的认可。

这是一个草案文档 可能随时被其他文档更新、替换或废弃。 除作为进行中的工作外,不适合引用本文档。

GitHub Issues 是讨论本规范的推荐方式。

本文档受 2025年8月18日 W3C 流程文档管理。

本文档由 W3C 专利政策下运作的组织产生。 W3C 维护着 与工作组交付物相关的任何专利披露的公共列表; 该页面还包含专利披露的说明。 如果个人已实际知晓包含必要权利要求的专利, 则必须根据 W3C 专利政策第6节披露信息。

1. 引言

本节为非规范性内容。 LargestContentfulPaint API 使开发者能够了解网页的加载和渲染过程,从而优化此过程。

开发者需要一个能够与用户视觉渲染体验相关联的可靠指标。像 First Paint 和 First Contentful Paint 这样的绘制加载指标侧重于初始渲染,但没有考虑被绘制内容的重要性,因此可能指示用户仍然认为页面无用的时间。

最大内容绘制(LCP)旨在成为一个页面加载指标:

页面加载过程中最大的绘制通常代表了用户视角下的一个重要事件,因此我们希望默认向开发者公开该事件,使性能团队、分析提供商和实验室测量工具能够收集这些指标,无需内容创建者额外标注。

该 API 依赖于 [PAINT-TIMING] 中定义的概念,可以视为该高级特性构建在其之上的低级原语。对于内容创建者愿意标注其内容并指明页面加载周期重要节点的情况,[ELEMENT-TIMING] API 能为其提供更多可控性。

注意:Largest Contentful Paint API 只会公开符合计时条件的元素。与 Element Timing 不同,无需对元素进行标注即可让其参与 Largest Contentful Paint 的评测。

1.1. 最大内容

此 API 所用的算法持续追踪迄今为止出现过的内容,每当发现新的最大内容时即为其创建新条目。被移除的内容算法仍会考虑。特别地,如果被移除的是最大内容,只有在添加了更大内容时才会新建条目。当发生滚动或输入事件时(通常会引入新内容),算法即终止。

1.2. 用法示例

下例展示了一张图片和大量文本。开发者注册了一个观察者,在页面加载期间获取最大绘制候选条目。

<img src="large_image.jpg">
<p id='large-paragraph'>This is large body of text.</p>
...
<script>
const observer = new PerformanceObserver((list) => {
  let perfEntries = list.getEntries();
  let lastEntry = perfEntries[perfEntries.length - 1];
  // Process the latest candidate for largest contentful paint
});
observer.observe({entryTypes: ['largest-contentful-paint']});
</script>

1.3. 限制

LargestContentfulPaint API 基于启发式,因此易受误差影响,存在以下问题:

2. 术语

最大内容绘制候选是包含以下成员的结构体

最大内容绘制候选 candidate 满足如下条件,则有资格成为最大内容绘制

3. 最大内容绘制

最大内容绘制涉及以下新接口:

3.1. LargestContentfulPaint 接口

[Exposed=Window]
interface LargestContentfulPaint : PerformanceEntry {
    readonly attribute DOMHighResTimeStamp loadTime;
    readonly attribute DOMHighResTimeStamp renderTime;
    readonly attribute unsigned long size;
    readonly attribute DOMString id;
    readonly attribute DOMString url;
    readonly attribute Element? element;
    [Default] object toJSON();
};

LargestContentfulPaint includes PaintTimingMixin;

每个LargestContentfulPaint 对象都关联如下概念:

entryType 属性的 getter 必须返回DOMString "largest-contentful-paint"

name 属性的 getter 必须返回空字符串。

startTime 属性的 getter 必须返回thisrenderTime 值(若非0),否则返回thisloadTime 值。

duration 属性的 getter 必须返回 0。

renderTime 属性必须返回给定默认绘制时间戳this绘制时间信息

loadTime 属性必须返回thisloadTime

size 属性必须返回thissize

id 属性必须返回thisid

url 属性必须返回thisurl

element 属性的 getter 必须执行以下步骤:

  1. 如果thiselement在给定 null 时不对绘制计时透明暴露,返回 null。

  2. 返回thiselement

注意: 上述算法规定,若元素已不再是Document派生树节点,则element 属性的 getter 不再返回该元素,包括 Shadow DOM 内的元素。

本规范还通过为Document 增加最大内容绘制尺寸(初始值为 0)的概念进行扩展。同时增加了相关的内容集合,其初值为空集合内容集合将以 (Element, Request) 元组 方式填充。该机制用于性能,保证算法只对每份内容处理一次。

注意: 用户代理需要维护内容集合,避免已移除内容造成内存泄漏。可使用弱指针来关联元素的生命周期, 撤除元素后延迟清理相关元组。因集合未对开发者暴露,因此不会暴露垃圾回收时机。

4. 处理模型

每个Window 具备已触发滚动事件,布尔值,初始为 false。

4.1. 对 DOM 规范的修改

本节将在 [DOM] 规范完成修改后移除。

我们如下修改事件分发算法

在第1步之后添加如下步骤:

4.2. 报告最大内容绘制

请求报告最大内容绘制时,给定Document document绘制时间信息 paintTimingInfo有序集合等待绘制图像记录 paintedImages 以及 有序集合元素 paintedTextNodes,执行如下步骤:
  1. 对每个 record 属于 paintedImages

    1. imageElementrecordelement

    2. imageElement未在 document对绘制计时透明暴露,则继续。

    3. requestrecordrequest

    4. candidate 为 (imageElement, request)

    5. intersectionRect 为交集矩形算法以 imageElement 为目标、以 viewport 为根返回的值。

    6. 可能添加 LargestContentfulPaint 条目,带 candidateintersectionRectpaintTimingInforecordloadTimedocument

  2. 对每个 textNode 属于 paintedTextNodes

    1. textNode未在document对绘制计时透明暴露,则继续。

    2. textNodeα通道值 ≤0,或不透明度值 ≤0:

      1. textNodetext-shadow值为none,且textNodestroke-color值为透明,以及 textNodestroke-image值为none,则继续。

    3. candidate 为 (textNode, null)

    4. intersectionRect 为空矩形。

    5. 对每个 Text 节点 text 属于 textNode所拥有文本节点集合

      1. 扩展 intersectionRect 为包含 textintersectionRect 边框盒的最小矩形。

    6. intersectionRect 与可视 viewport 做交集。

    7. 可能添加 LargestContentfulPaint 条目,带 candidateintersectionRectpaintTimingInfo、0 和 document

4.3. 确定元素的有效视觉尺寸

为了确定有效视觉尺寸,请对元素执行以下步骤:

输入

intersectionRect,一个DOMRectReadOnly

imageRequest,一个Request

element,一个元素

document,一个文档

输出

要汇报为最大内容绘制的尺寸(像素),如果该元素不应成为LCP候选则为null。

  1. widthintersectionRectwidth

  2. heightintersectionRectheight

  3. size等于width * height

  4. rootdocument浏览上下文顶层浏览上下文活动文档

  5. rootWidthroot可视视口的宽度(不包括任何滚动条)。

  6. rootHeightroot可视视口的高度(不包括任何滚动条)。

  7. 如果size等于rootWidthrootHeight,返回null。

  8. 如果imageRequest有资格成为最大内容绘制,返回null。

  9. 如果imageRequest不为null,则执行以下步骤以校正图片位置和放大:

    1. concreteDimensionsimageRequestelement中的具体对象尺寸

    2. visibleDimensions为调整定位后的concreteDimensions,通过object-positionbackground-positionelement内容盒

    注意: 其中某些算法在CSS中未严格定义。预期结果是获得element中图片实际位置和尺寸,返回DOMRectReadOnly

    1. clientContentRect为应用element变换后的visibleDimensions最小DOMRectReadOnly

    2. intersectingClientContentRectclientContentRectintersectionRect的交集。

    3. sizeintersectingClientContentRectwidth * intersectingClientContentRectheight

    注意: 此举确保仅与图片自身(不含元素装饰)求交。

    1. naturalArea等于imageRequest自然宽度 * imageRequest自然高度

    2. 如果naturalArea为0,则返回null。

    3. boundingClientAreaclientContentRectwidth * clientContentRectheight

    4. scaleFactorboundingClientArea / naturalArea

    5. scaleFactor大于1,则size除以scaleFactor

  10. 返回size

4.4. 可能添加 LargestContentfulPaint 条目

注意: 实现最大内容绘制API的用户代理需为"largest-contentful-paint"supportedEntryTypes中,在Window上下文下包含该项。 这样有助于开发者检测对该API的支持。

为了可能添加一个LargestContentfulPaint 条目,用户代理必须执行以下步骤:

输入

candidate,一个最大内容绘制候选

intersectionRect,一个DOMRectReadOnly

paintTimingInfo,一个绘制计时信息

loadTime,一个DOMHighResTimestamp

document,一个文档

输出

  1. 如果document内容集合已包含candidate,则返回。

  2. 添加candidatedocument内容集合

  3. windowdocument相关全局对象

  4. 如果window已触发滚动事件已触发输入事件为true,则返回。

  5. size为以intersectionRect给定candidateelement有效视觉尺寸

  6. 如果size小于等于document最大内容绘制尺寸,返回。

  7. url为空字符串。

  8. candidaterequest非null,则将url设为candidaterequest请求URL

  9. idcandidateelement元素id

  10. contentInfo为一个映射,使contentInfo["size"] = sizecontentInfo["url"] = urlcontentInfo["id"] = idcontentInfo["loadTime"] = loadTime,contentInfo["element"] = candidateelement

  11. 创建LargestContentfulPaint条目,输入为contentInfopaintTimingInfodocument

4.5. 创建 LargestContentfulPaint 条目

为了创建一个LargestContentfulPaint 条目,用户代理必须执行以下步骤:

输入

contentInfo,一个映射

paintTimingInfo,一个绘制计时信息

document,一个文档

输出

  1. document最大内容绘制尺寸设为contentInfo["size"]。

  2. entry为新的LargestContentfulPaint条目,其使用document相关realmpaint timing infopaintTimingInfo,并按如下设值:

    • sizecontentInfo["size"],

    • urlcontentInfo["url"],

    • idcontentInfo["id"],

    • loadTimecontentInfo["loadTime"],

    • 以及elementcontentInfo["element"]。

  3. 队列该PerformanceEntry entry

5. 安全与隐私注意事项

该API底层依赖Paint Timing。与类似的Element Timing API不同,若某些元素尺寸尽管较小但在当前为“最大”,LCP仍可能暴露其计时细节。但这不会泄露比Element Timing已暴露更多的敏感信息。

一致性

文档约定

一致性要求通过描述性断言和 RFC 2119 术语的组合表达。 本文档规范性部分中的关键词 “MUST”(必须)、“MUST NOT”(禁止)、“REQUIRED”(要求)、“SHALL”(应)、“SHALL NOT”(不得)、“SHOULD”(应该)、“SHOULD NOT”(不应)、“RECOMMENDED”(推荐)、“MAY”(可以)、和 “OPTIONAL”(可选) 均按 RFC 2119 说明理解。为了易读,这些词并非在本规范中全部大写。

除特别标记为非规范性、示例和注释的部分外,本文档的所有内容均为规范性的。[RFC2119]

本规范中的示例以“For example(例如)”开头,或通过class="example"设置,与规范性文本区分,如下所示:

这是一个说明性示例。

说明性注释以“Note(注释)”开头,并通过 class="note"设置,与规范性文本区分,如下所示:

注释:这是一个说明性注释。

一致性算法

以命令式表达的算法要求(如“strip any leading space characters(去除所有前导空格字符)”或“return false and abort these steps(返回false并终止这些步骤)”)应结合引入算法时使用的关键词(如must、should、may等)来理解。

以算法或具体步骤表述的一致性要求,可以通过任何方式实现,只要最终结果等效。尤其是,本规范中定义的算法旨在便于理解,并未保证高效。鼓励实现者进行优化。

索引

本规范定义的术语

引用定义的术语

参考文献

规范性参考文献

[CSS-BACKGROUNDS-3]
Elika Etemad; Brad Kemper. CSS Backgrounds and Borders Module Level 3. 2024年3月11日. CRD. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS-BOX-4]
Elika Etemad. CSS Box Model Module Level 4. 2024年8月4日. WD. URL: https://www.w3.org/TR/css-box-4/
[CSS-COLOR-3]
Tantek Çelik; Chris Lilley; David Baron. CSS Color Module Level 3. 2022年1月18日. REC. URL: https://www.w3.org/TR/css-color-3/
[CSS-COLOR-4]
Chris Lilley; Tab Atkins Jr.; Lea Verou. CSS Color Module Level 4. 2025年4月24日. CRD. URL: https://www.w3.org/TR/css-color-4/
[CSS-IMAGES-3]
Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS Images Module Level 3. 2023年12月18日. CRD. URL: https://www.w3.org/TR/css-images-3/
[CSS-TEXT-DECOR-4]
Elika Etemad; Koji Ishii. CSS Text Decoration Module Level 4. 2022年5月4日. WD. URL: https://www.w3.org/TR/css-text-decor-4/
[CSSOM-VIEW-1]
Simon Pieters. CSSOM View Module. 2016年3月17日. WD. URL: https://www.w3.org/TR/cssom-view-1/
[DOM]
Anne van Kesteren. DOM Standard. 活标准. URL: https://dom.spec.whatwg.org/
[EVENT-TIMING]
Michal Mocny. Event Timing API. 2025年5月26日. WD. URL: https://www.w3.org/TR/event-timing/
[FETCH]
Anne van Kesteren. Fetch Standard. 活标准. URL: https://fetch.spec.whatwg.org/
[FILL-STROKE-3]
Elika Etemad; Tab Atkins Jr.. CSS Fill and Stroke Module Level 3. 2017年4月13日. FPWD. URL: https://www.w3.org/TR/fill-stroke-3/
[GEOMETRY-1]
Simon Pieters; Chris Harrelson. Geometry Interfaces Module Level 1. 2018年12月4日. CR. URL: https://www.w3.org/TR/geometry-1/
[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; et al. HTML Standard. 活标准. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. 活标准. URL: https://infra.spec.whatwg.org/
[PAINT-TIMING]
Ian Clelland; Noam Rosenthal. Paint Timing. 2025年5月17日. WD. URL: https://www.w3.org/TR/paint-timing/
[PERFORMANCE-TIMELINE]
Nicolas Pena Moreno. Performance Timeline. 2025年5月21日. CRD. URL: https://www.w3.org/TR/performance-timeline/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. 最佳现行实践. URL: https://datatracker.ietf.org/doc/html/rfc2119
[STREAMS]
Adam Rice; et al. Streams Standard. 活标准. URL: https://streams.spec.whatwg.org/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. 活标准. URL: https://webidl.spec.whatwg.org/

参考性引用

[ELEMENT-TIMING]
Element Timing API. Editor's Draft. URL: https://w3c.github.io/element-timing/

IDL 索引

[Exposed=Window]
interface LargestContentfulPaint : PerformanceEntry {
    readonly attribute DOMHighResTimeStamp loadTime;
    readonly attribute DOMHighResTimeStamp renderTime;
    readonly attribute unsigned long size;
    readonly attribute DOMString id;
    readonly attribute DOMString url;
    readonly attribute Element? element;
    [Default] object toJSON();
};

LargestContentfulPaint includes PaintTimingMixin;