最大内容绘制

W3C 工作草案,

关于本文档的更多细节
本版本:
https://www.w3.org/TR/2026/WD-largest-contentful-paint-20260206/
最新发布版本:
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. 术语

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

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。

4. 处理模型

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

4.1. 对 DOM 规范的修改

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

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

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

4.2. 报告最大内容绘制

当被要求根据 报告最大内容绘制Document document绘制时序信息 paintTimingInfo、一个 有序集合待处理图片记录 paintedImages,以及一个 有序集合元素 paintedTextNodes时,执行以下步骤:

注意: paintedImages 中每个待处理图片记录和 paintedTextNodes 中的文本元素,只会被 标记绘制时序 报告一次,且仅在该元素首次被认为可绘制(即具有透明度和可见性)且可内容化(即图片资源或阻塞字体已充分加载)的绘制时进行。

  1. windowdocument相关全局对象

  2. 如果 window已派发滚动事件已派发输入事件 有一个为 true,则返回。

  3. newCandidateSizedocument最大内容绘制尺寸

  4. newCandidate 为 null。

  5. 遍历 paintedImages 中的每个 record

    1. imageElementrecord元素

    2. 如果 imageElementdocument 下不 暴露用于绘制时序,则继续。

    3. intersectionRect 为交集区域算法以 imageElement 为目标、视口为根返回的值。

    4. size有效视觉尺寸,以 intersectionRectrecord请求 为参数,针对 imageElement 计算。

    5. 如果 size 小于或等于 newCandidateSize,则继续。

    6. newCandidateSize 设置为 size

    7. newCandidate 设置为新的 最大内容绘制候选项, 其 元素imageElement尺寸size请求record请求加载时间record加载时间

  6. 遍历 paintedTextNodes 中的每个 textNode

    1. 如果 textNodedocument 下不 暴露用于绘制时序,则继续。

    2. 如果 textNodealpha通道 值 <=0 或 透明度 值 <=0:

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

    3. intersectionRect 为所有 Text 节点 的边框盒的并集,与视觉视口相交。

    4. sizetextNode有效视觉尺寸,参数为 intersectionRect 和 null。

    5. 如果 size 小于或等于 newCandidateSize,则继续。

    6. newCandidateSize 设置为 size

    7. newCandidate 设置为新的 最大内容绘制候选项, 其 元素textNode尺寸size请求 为 null, 加载时间 为 0。

  7. 如果 newCandidate 不为 null:

    1. 创建 LargestContentfulPaint 条目,参数为 newCandidatepaintTimingInfodocument

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

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

输入

intersectionRect,一个 DOMRectReadOnly

imageRequest,一个 Request 或 null

element,一个 元素

document,一个 文档

输出

用于 Largest Contentful Paint 报告的尺寸(像素),如果元素不应作为 LCP 候选项,则为 null。

  1. widthintersectionRectwidth

  2. heightintersectionRectheight

  3. sizewidth * height

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

  5. rootWidthroot视觉视口 的宽度(不含滚动条)。

  6. rootHeightroot视觉视口 的高度(不含滚动条)。

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

  8. 如果 imageRequest 不为 null,则按如下步骤调整图片位置和缩放:

    1. 如果 imageRequest响应 的内容长度(字节)小于 size * 0.004,则返回 null。

      注意: 此启发式方法测试图片资源是否包含足够数据,以便用户感知到内容。它比较传输文件的大小和实际生成的像素数量(经过解码和任意图像缩放后)。以极少字节编码大量像素的图片通常是低内容背景、渐变等,不视为 LCP 候选项。

    2. concreteDimensionsimageRequest具体对象尺寸(在 element 内)。

    3. visibleDimensionsconcreteDimensions, 按 object-positionbackground-position, 和 element内容盒进行定位调整。

    注意: 部分相关算法在 CSS 中并未严格定义。预期结果是获得 element 中图像的实际位置与尺寸,以 DOMRectReadOnly 表示。

    1. clientContentRect 为最小的 DOMRectReadOnly ,包含 visibleDimensions 并应用 element变换

    2. intersectingClientContentRectclientContentRectintersectionRect 的交集。

    3. 设置 sizeintersectingClientContentRectwidth * intersectingClientContentRectheight

    注意: 这样做确保仅与图片本身而不是元素装饰部分相交。

    1. naturalAreaimageRequest自然宽度 * imageRequest自然高度

    2. naturalArea 为 0,则返回 null。

    3. boundingClientAreaclientContentRectwidth * clientContentRectheight

    4. scaleFactorboundingClientArea / naturalArea

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

  9. 返回 size

4.4. 创建 LargestContentfulPaint 条目

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

输入

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

paintTimingInfo,一个 绘制时序信息

document,一个 文档

输出

  1. document最大内容绘制大小 设置为 candidate尺寸

  2. url 为空字符串。

  3. 如果 candidate请求 不为 null, 则将 url 设置为 candidate请求请求 URL

  4. entry 为新的 LargestContentfulPaint 条目,使用 document相关领域,其 绘制时序信息paintTimingInfo,如下设置:

  5. 队列 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 背景与边框模块 第3级。2024年3月11日。CRD。链接:https://www.w3.org/TR/css-backgrounds-3/
[CSS-BOX-4]
Elika Etemad。CSS 盒模型模块 第4级。2024年8月4日。WD。链接:https://www.w3.org/TR/css-box-4/
[CSS-COLOR-3]
Tantek Çelik;Chris Lilley;David Baron。CSS 色彩模块 第3级。2022年1月18日。REC。链接:https://www.w3.org/TR/css-color-3/
[CSS-COLOR-4]
Chris Lilley;Tab Atkins Jr.;Lea Verou。CSS 色彩模块 第4级。2025年4月24日。CRD。链接:https://www.w3.org/TR/css-color-4/
[CSS-IMAGES-3]
Tab Atkins Jr.;Elika Etemad;Lea Verou。CSS 图像模块 第3级。2023年12月18日。CRD。链接:https://www.w3.org/TR/css-images-3/
[CSS-TEXT-DECOR-4]
Elika Etemad;Koji Ishii。CSS 文本装饰模块 第4级。2022年5月4日。WD。链接:https://www.w3.org/TR/css-text-decor-4/
[CSS-VALUES-4]
Tab Atkins Jr.;Elika Etemad。CSS 数值与单位模块 第4级。2024年3月12日。WD。链接:https://www.w3.org/TR/css-values-4/
[CSSOM-VIEW-1]
Simon Fraser;Emilio Cobos Álvarez。CSSOM视图模块。2025年9月16日。WD。链接:https://www.w3.org/TR/cssom-view-1/
[DOM]
Anne van Kesteren。DOM 标准。现行标准。链接:https://dom.spec.whatwg.org/
[EVENT-TIMING]
Michal Mocny。事件时序 API。2025年10月17日。WD。链接:https://www.w3.org/TR/event-timing/
[FETCH]
Anne van Kesteren。Fetch 标准。现行标准。链接:https://fetch.spec.whatwg.org/
[FILL-STROKE-3]
Elika Etemad;Tab Atkins Jr.。CSS 填充与描边模块 第3级。2017年4月13日。FPWD。链接:https://www.w3.org/TR/fill-stroke-3/
[GEOMETRY-1]
Sebastian Zartner;Yehonatan Daniv。几何接口模块 第1级。2025年12月4日。CRD。链接:https://www.w3.org/TR/geometry-1/
[HR-TIME-3]
Yoav Weiss。高精度时间。2024年11月7日。WD。链接:https://www.w3.org/TR/hr-time-3/
[HTML]
Anne van Kesteren;等。HTML 标准。现行标准。链接:https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren;Domenic Denicola。Infra 标准。现行标准。链接:https://infra.spec.whatwg.org/
[PAINT-TIMING]
Ian Clelland;Noam Rosenthal。Paint Timing。2026年1月7日。WD。链接:https://www.w3.org/TR/paint-timing/
[PERFORMANCE-TIMELINE]
Nicolas Pena Moreno。性能时间线。2025年5月21日。CRD。链接:https://www.w3.org/TR/performance-timeline/
[RFC2119]
S. Bradner。在 RFC 中用于表述需求等级的关键词。1997年3月。最佳现行实践。链接:https://datatracker.ietf.org/doc/html/rfc2119
[STREAMS]
Adam Rice;等。Streams 标准。现行标准。链接:https://streams.spec.whatwg.org/
[WEBIDL]
Edgar Chen;Timothy Gu。Web IDL 标准。现行标准。链接: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;