最大内容绘制

W3C 工作草案,

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

4. 处理模型

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

4.1. 对 DOM 规范的修改

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

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

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

4.2. 报告最大内容绘制

当请求 报告最大内容绘制,给定一个 Document document、一个 绘制时序信息(paint timing info) paintTimingInfo、一个 有序集合 待处理图片记录 paintedImages,以及一个 有序集合 元素 paintedTextNodes 时,执行如下步骤:

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

  1. windowdocument相关全局对象

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

  3. currentSizedocument最大内容绘制面积

  4. currentWidthdocument最大内容绘制宽度

  5. currentHeightdocument最大内容绘制高度

  6. largestSizecurrentSize

  7. newCandidate 为 null。

  8. 对于每一个 paintedImages 中的 record

    1. imageElementrecord元素

    2. 如果 imageElement 不是 对绘制时序可暴露(给定 document),则进入下一个循环。

    3. intersectionRect 为以 imageElement 为目标、视口为根执行“相交区域算法”返回的值。

    4. resultimageElement,给定 intersectionRectrecord请求有效可视尺寸

    5. 如果 result 为 null,进入下一个循环。

    6. 如果 result面积 小于或等于 largestSize,进入下一个循环。

    7. largestSizeresult面积

  9. 设置 newCandidate 为新的 最大内容绘制候选,并赋以下值:

    1. element 赋值为 imageElement

    2. size 赋值为 result面积

    3. width 赋值为 result宽度

    4. height 赋值为 result高度

    5. request 赋值为 recordrequest

    6. loadTime 赋值为 recordloadTime

  10. 对于每一个 paintedTextNodes 中的 textNode

    1. 如果 textNode 不是 对绘制时序可暴露(给定 document),则进入下一个循环。

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

      1. 如果 textNodetext-shadow 属性为 none,且 textNodestroke-color 属性为 透明,且 textNodestroke-image 属性为 none,则进入下一个循环。

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

    4. resulttextNode,给定 intersectionRect 和 null 的 有效可视尺寸

    5. 如果 result 为 null,进入下一个循环。

    6. 如果 result面积 小于或等于 largestSize,进入下一个循环。

    7. largestSizeresult面积

    8. 设置 newCandidate 为新的 最大内容绘制候选,并赋以下值:

      1. element 赋值为 textNode

      2. size 赋值为 result面积

      3. width 赋值为 result宽度

      4. height 赋值为 result高度

      5. request 赋值为 null。

      6. loadTime 赋值为 0。

  11. 如果 newCandidate 非空:

    1. 如果 currentSize 大于 0:

      1. 如果 newCandidatewidth 减去 currentWidth 的结果小于等于 3,且 newCandidateheight 减去 currentHeight 的结果小于等于 3,则返回。

    2. 创建 LargestContentfulPaint 记录,参数为 newCandidatepaintTimingInfodocument

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

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

输入

intersectionRect,一个 DOMRectReadOnly

imageRequest,一个 Request 或 null

element,一个 元素(Element)

document,一个 文档(Document)

输出

一个 有效可视尺寸结果(effective visual size result),这是一个 结构对象(struct),包含 size数字)、width数字)、以及 height数字),代表报告给最大内容绘制(Largest Contentful Paint, LCP)的有效可视面积、宽度和高度(像素),或为 null 表示该元素不应作为 LCP 候选。

  1. widthintersectionRectwidth, 向上取整。

  2. heightintersectionRectheight, 向上取整。

  3. sizewidth * height

  4. rootdocument浏览上下文(browsing context)顶层浏览上下文(top-level browsing context)活动文档(active document)

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

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

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

  8. 如果 imageRequest 不为 null,执行以下步骤以调整图片位置和放大:

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

      注意: 这个启发式方法测试图片资源是否包含足够的数据,足以让用户感知为内容。它比对了传输文件大小和实际显示像素的数量(解码与缩放后)。极少字节但像素很多的图片一般为低内容的背景、渐变等,因此不会作为 LCP 候选。

    2. concreteDimensionsimageRequestelement 内的 具体对象尺寸(concrete object size)

    3. visibleDimensionsconcreteDimensions,经 object-positionbackground-position 以及 element内容盒(content box) 调整后的位置。

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

    4. clientContentRect 为包含 visibleDimensions 且应用 element变换(transforms) 后的最小 DOMRectReadOnly

    5. intersectingClientContentRectclientContentRectintersectionRect 的交集。

    6. width 设为 intersectingClientContentRectwidth, 向上取整。

    7. height 设为 intersectingClientContentRectheight, 向上取整。

    8. size 设为 width * height

      注意: 这样可以确保我们只和图片本身相交,不和元素的装饰(decorations)相交。

    9. naturalAreaimageRequestnatural width * imageRequestnatural height

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

    11. boundingClientAreaclientContentRectwidth * clientContentRectheight

    12. scaleFactorboundingClientArea / naturalArea

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

  9. 返回一个 有效可视尺寸结果,其 size 设置为 sizewidth 设置为 widthheight 设置为 height

4.4. 创建 LargestContentfulPaint 条目

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

输入

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

paintTimingInfo,一个 绘制时序信息(paint timing info)

document,一个 Document

输出

  1. document最大内容绘制面积 设置为 candidate面积

  2. document最大内容绘制宽度 设置为 candidate宽度

  3. document最大内容绘制高度 设置为 candidate高度

  4. url 为空字符串。

  5. 如果 candidaterequest 不为 null, 将 url 设置为 candidaterequest请求 URL

  6. entry 为新的 LargestContentfulPaint 实例,使用 document相关领域(relevant realm),其 绘制时序信息paintTimingInfo,并带有如下属性:

  7. 将 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月31日。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;