最大内容绘制

W3C 工作草案,

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

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

注:可以弱引用方式存储最大内容绘制候选项元素,以防止泄漏已从 DOM 中移除的元素。

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

4. 处理模型

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

4.1. 对 DOM 规范的修改

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

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

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

4.2. 报告最大内容绘制

当要求在给定一个 Document document、一个绘制时序信息 paintTimingInfo、一个由待处理图像记录组成的有序集合 paintedImages,以及一个由元素组成的有序集合 paintedTextNodes的情况下,报告最大内容绘制时,执行以下步骤:

注: paintedImages中的每个待处理图像记录以及 paintedTextNodes中的每个文本元素, 都只会从标记绘制时序中报告恰好一次,报告发生在元素首次被视为可绘制 (即具有不透明度和可见性)且具有内容(即图像资源或阻塞字体已充分加载)的绘制中。

  1. windowdocument相关全局对象

  2. 如果 window已分派滚动事件已分派输入事件中任一者为 true,则返回。

  3. newCandidate 为在给定 documentpaintedImagespaintedTextNodes以及 document当前最大内容绘制候选项的情况下,计算新的最大内容绘制候选项的结果。

  4. 如果 newCandidate 为 null,则返回。

  5. document当前最大内容绘制候选项设置为 newCandidate

  6. entry 为使用 newCandidatepaintTimingInfodocument创建 LargestContentfulPaint 条目的结果。

  7. 将 PerformanceEntry entry入队

要在给定一个 Document document、一个由待处理图像记录组成的有序集合 paintedImages、一个由元素组成的有序集合 paintedTextNodes,以及一个最大内容绘制候选项或 null currentCandidate的情况下,计算新的最大内容绘制候选项,执行以下步骤。这些步骤 返回一个最大内容绘制候选项或 null。
  1. 如果 currentCandidate 不为 null,则令 currentSizecurrentCandidate尺寸;否则为 0。

  2. largestSizecurrentSize

  3. newCandidate 为 null。

  4. 对于 paintedImages中的每个 record

    1. imageElementrecord元素

    2. 如果在给定 document的情况下,imageElement暴露给绘制时序,则继续。

    3. intersectionRect 为以 imageElement作为目标、以视口作为根 运行交集矩形算法所返回的值。

    4. result 为在给定 intersectionRectrecord请求的情况下, imageElement有效视觉尺寸

    5. 如果 result 为 null,则继续。

    6. 如果 result尺寸小于或等于 largestSize,则继续。

    7. largestSize设置为 result尺寸

    8. newCandidate设置为一个新的最大内容绘制候选项,其值如下:

      1. 元素设置为 imageElement

      2. 尺寸设置为 result尺寸

      3. 宽度设置为 result宽度

      4. 高度设置为 result高度

      5. 请求设置为 record请求

      6. loadTime设置为 recordloadTime

  5. 对于 paintedTextNodes中的每个 textNode

    1. 如果在给定 document的情况下,textNode暴露给绘制时序,则继续。

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

      1. 如果 textNodetext-shadow值为 none, textNodestroke-color值为transparent,并且 textNodestroke-image值为 none,则继续。

    3. intersectionRecttextNode所拥有文本节点集合中所有 Text 节点的边框框并集与可视视口相交所得的结果。

    4. result 为在给定 intersectionRect和 null 的情况下, textNode有效视觉尺寸

    5. 如果 result 为 null,则继续。

    6. 如果 result尺寸小于或等于 largestSize,则继续。

    7. largestSize设置为 result尺寸

    8. newCandidate设置为一个新的最大内容绘制候选项,其值如下:

      1. 元素设置为 textNode

      2. 尺寸设置为 result尺寸

      3. 宽度设置为 result宽度

      4. 高度设置为 result高度

      5. 请求设置为 null。

      6. loadTime设置为 0。

  6. 如果 newCandidate不为 null 且 currentSize大于 0:

    1. 如果 newCandidate宽度减去 currentCandidate宽度小于或等于 3,并且 newCandidate高度减去 currentCandidate高度小于或等于 3,则返回 null。

  7. 返回 newCandidate

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

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

输入

intersectionRect,一个 DOMRectReadOnly

imageRequest,一个 Request 或 null

element,一个元素

document,一个文档

输出

一个有效视觉尺寸结果,它是一个结构体,包含尺寸(一个数值)、宽度(一个数值)以及高度(一个数值),表示要为最大内容绘制报告的有效视觉尺寸、宽度和高度, 单位为像素;如果该元素不应作为 LCP 候选项,则为 null。

  1. widthintersectionRectwidth, 向上舍入到最接近的整数。

  2. heightintersectionRectheight, 向上舍入到最接近的整数。

  3. sizewidth * height

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

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

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

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

  8. 如果 imageRequest 不为 null,则运行以下步骤以针对图像 定位和放大进行调整:

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

      注:此启发式方法用于测试 图像资源是否包含足够的数据,以便用户将其视为具有内容。它会将传输的文件大小 与解码并应用任何图像缩放后实际生成的像素数进行比较。使用极少字节 编码大量像素的图像通常是内容较少的背景、渐变等,因此不被 视为 LCP 候选项。

    2. concreteDimensionsimageRequestelement内的具体对象尺寸

    3. visibleDimensionsconcreteDimensions,并根据 object-positionbackground-position以及 element内容框针对定位进行调整。

      注:其中一些 算法在 CSS 中没有严格定义。预期结果是以一个 DOMRectReadOnly 获取图像在 element中的实际位置和尺寸。

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

    5. intersectingClientContentRectclientContentRectintersectionRect的交集。

    6. width设置为 intersectingClientContentRectwidth, 向上舍入到最接近的整数。

    7. height设置为 intersectingClientContentRectheight, 向上舍入到最接近的整数。

    8. size设置为 width * height

      注:这可确保我们 仅与图像本身相交,而不与元素的装饰相交。

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

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

    11. boundingClientAreaclientContentRectwidth * clientContentRectheight

    12. scaleFactorboundingClientArea / naturalArea

    13. 如果 scaleFactor 大于 1,则将 size除以 scaleFactor

  9. 返回一个有效视觉尺寸结果,其中尺寸设置为 size宽度设置为 width, 并且高度设置为 height

4.4. 创建 LargestContentfulPaint 条目

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

输入

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

paintTimingInfo,一个绘制时序信息

document,一个 Document

输出

一个 LargestContentfulPaint

  1. url 为空字符串。

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

  3. entry 为一个新的 LargestContentfulPaint 条目,它使用 document相关领域,其绘制时序信息paintTimingInfo, 并将其

  4. 返回 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年6月18日。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;