最大内容绘制

W3C 工作草案,

关于本文件的更多信息
本版本:
https://www.w3.org/TR/2026/WD-largest-contentful-paint-20260326/
最新发布版本:
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
编辑:
(Shopify)
前任编辑:
(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 基于启发式方法。因此,它容易出错。它存在以下问题:

LargestContentfulPaint API 以文档加载为基础。因此,它不会在以下情况下重置:

在使用 LargestContentfulPaint API 时,你可能需要考虑如何在该 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 的值。

duration 属性的 getter 必须返回 0。

renderTime 属性必须返回在 默认绘制时间戳this绘制计时信息(paint timing info)

loadTime 属性必须返回 thisloadTime

size 属性必须返回 thissize

id 属性必须返回 thisid

url 属性必须返回 thisurl

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

  1. 如果 thiselement 在给定 null 的情况下未被 为绘制计时代码暴露,则返回 null。

  2. 返回 thiselement

注:以上算法规定,已经不再是 Document 后代的元素不会再被 element 属性 getter 返回(包括 shadow DOM 内的节点)。

本规范还扩展了 Document, 为其添加了 最大内容绘制尺寸(largest contentful paint size)概念,初始值为 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,一个 Element

document,一个 Document

输出

要用于 Largest Contentful Paint 报告的像素数,或者如果该元素不应作为 LCP 候选,则为 null。

  1. widthintersectionRectwidth

  2. heightintersectionRectheight

  3. sizewidth * height

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

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

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

  7. 如果 size 等于 rootWidth 乘以 rootHeight,则返回 null。

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

    1. 如果 imageRequestresponse 的内容字节数小于 size * 0.004,则返回 null。

      注:该启发式方法用于判断图片资源是否包含足够多的数据以被用户视为内容。它比较传输文件的大小与实际解码和缩放后产生的像素数。极少字节编码大量像素的图片通常是低内容背景或渐变等,这类不会作为 LCP 候选。

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

    3. visibleDimensionsconcreteDimensions,基于 object-positionbackground-positionelement内容框 进行位置调整。

      注:这些算法在 CSS 规范中并未严格定义。预期结果是获得 element 中图片的实际位置和大小,并表示为 DOMRectReadOnly

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

    5. intersectingClientContentRectclientContentRectintersectionRect 的交集。

    6. size 设为 intersectingClientContentRectwidth * intersectingClientContentRectheight

      注:这样可保证只与图片本身而非元素装饰部分做相交。

    7. naturalAreaimageRequestnatural width * imageRequestnatural height

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

    9. boundingClientAreaclientContentRectwidth * clientContentRectheight

    10. scaleFactorboundingClientArea / naturalArea

    11. 如果 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]
Tab Atkins Jr.;Chris Lilley;Lea Verou。CSS 颜色模块 4 级。2026年3月25日。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。2026年3月19日。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。高精度时间。2026年3月24日。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。绘制计时(Pain Timing)。 2026年3月24日。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;