最大コンテンツの表示

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 Performance作業グループによって 作業草案として勧告トラックを用いて公開されました。 作業草案として公開されていることは、 W3Cおよびそのメンバーによる承認を意味しません。

これはドラフト文書であり、今後随時、 更新・差し替え・廃止される可能性があります。 作業中の文書であることを除き、本ドキュメントを引用するのは不適切です。

GitHub Issuesで本仕様の議論を行うことを推奨します。

本ドキュメントは 2025年8月18日版W3Cプロセス文書によって管理されています。

本ドキュメントは W3C特許ポリシーの下で運用されているグループによって作成されました。 W3Cはグループの成果物に関連して提出された 特許開示の公開リストを管理しています。 そのページには特許開示の手順も記載されています。 実際に特許に関する知識を有し、 必須クレームが含まれていると考える個人は、 W3C特許ポリシー第6節に従って情報を開示する必要があります。

1. 導入

このセクションは規範的ではありません。 LargestContentfulPaint APIは、開発者がウェブページの読み込みおよび描画プロセスを可視化し、最適化できるようにします。

開発者は、ユーザーの視覚的レンダリング体験と相関する信頼性ある指標を必要としています。First PaintやFirst Contentful Paintのような描画指標は初期のレンダリングに焦点を当てていますが、描画されたコンテンツの重要性を考慮していないため、ユーザーがまだそのページを有用だと感じていない時点を示す場合もあります。

Largest 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. 用語

largest contentful paint candidateは、以下のメンバーを含む構造体です:

largest contentful paint candidate candidateは、以下の条件を満たす場合にlargest contentful paintの対象です:

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でなければその値を、0の場合はloadTimeの値を返します。

duration 属性のgetterは0を返さなければなりません。

renderTime 属性は default paint timestamp (引数にthispaint timing infoを与える)を返す。

loadTime 属性はthisloadTimeの値を返します。

size 属性はthissizeの値を返します。

id 属性はthisidの値を返します。

url 属性はthisurlの値を返します。

element 属性のgetterは次の手順を実行します:

  1. thiselementpaint timing用に公開されていない場合、nullを返す。

  2. thiselementを返す。

備考: 上記のアルゴリズムは、documentの子孫でなくなった要素は、element属性のgetterで返されなくなることを意味します。shadow DOM内の要素も含みます。

また、本仕様はDocument を拡張しlargest contentful paint sizeという概念(初期値0)を加えます。 さらに関連付けられたcontent set(初期状態は空の集合)も加えます。content setは(ElementRequestの)タプルで埋められます。アルゴリズムがそれぞれのコンテンツを一度しか評価しないことを可能にし、パフォーマンス向上のために使われます。

備考: user agentはcontent setを管理し、削除されたコンテンツがメモリリークを引き起こさないようにする必要があります。特に、タプルの寿命をElementsへの弱参照に紐付け、Elementsが削除された後にクリーニングできるようにします。集合はweb開発者に公開されないため、ガベージコレクションのタイミングが公開されることはありません。

4. 処理モデル

Windowスクロールイベントがディスパッチされたかというブール値を持ち、初期値はfalseです。

4.1. DOM仕様への修正

このセクションは[DOM]仕様が修正され次第、削除予定です。

event dispatchアルゴリズムを次のように修正します。

ステップ1の直後に次のステップを追加:

4.2. 最大コンテンツの表示を報告する

最大コンテンツの表示を報告する際は、Document documentpaint timing info paintTimingInfo順序付きセットpending image records paintedImages、および順序付きセット要素 paintedTextNodesを引数に、次を実行:
  1. paintedImages の各 record について:

    1. imageElementrecordelementとする。

    2. imageElementpaint timing用に公開されていなければ、documentを与えて続行。

    3. requestrecordrequestとする。

    4. candidateを (imageElement, request) とする

    5. intersectionRect を intersection rectアルゴリズムの結果(targetにimageElement、rootはviewport)とする。

    6. Potentially add a LargestContentfulPaint entrycandidateintersectionRectpaintTimingInforecordloadTimedocumentを渡す。

  2. paintedTextNodes の各 textNode について、

    1. もし textNodepaint timing 用に公開されていなければdocumentを与えて続行。

    2. もし textNodeアルファチャンネル の値が0以下、または 不透明度 の値が0以下の場合:

      1. もし textNodetext-shadow の値が none、 textNodestroke-color の値が 透明 かつ textNodestroke-image の値が none なら、続行。

    3. candidate を (textNode, null) とする

    4. intersectionRect を空の矩形とする。

    5. Text ノード texttextNode所有テキストノードの集合から取り出して:

      1. intersectionRecttext のボーダーボックスと intersectionRect をともに含む最小の矩形に拡張する。

    6. intersectionRect をビジュアルビューポートと交差させる。

    7. LargestContentfulPaint エントリーの追加検討candidateintersectionRectpaintTimingInfo、0、document で実行する。

4.3. 要素の実効視覚サイズの判定

実効視覚サイズ要素に対して判定するには、次の手順を実行する:

入力

intersectionRectDOMRectReadOnly

imageRequestRequest

element要素

documentDocument

出力

Largest Contentful Paintとして報告するサイズ(ピクセル単位)。要素がLCPの候補でない場合はnull。

  1. widthintersectionRectwidthとする。

  2. heightintersectionRectheightとする。

  3. sizewidth * heightとする。

  4. rootdocument閲覧コンテキスト最上位閲覧コンテキストアクティブドキュメントとする。

  5. rootWidthrootvisual viewportの横幅(スクロールバーを除く)とする。

  6. rootHeightrootvisual viewportの縦幅(スクロールバーを除く)とする。

  7. sizerootWidth×rootHeightと等しければ、nullを返す。

  8. imageRequestlargest contentful paintの候補として適格でなければnullを返す。

  9. imageRequestがnullでない場合は、画像の位置やアップスケーリングに対応するため次を実行:

    1. concreteDimensionsを、imageRequestconcrete object sizeelement内)とする。

    2. visibleDimensionsconcreteDimensions に、 object-position または background-position および elementcontent box による位置調整を加えたものとする。

    備考: これらのアルゴリズムの一部はCSSで厳密には定義されていません。期待される結果は、element内の画像の実際の位置とサイズをDOMRectReadOnlyとして得ることです。

    1. clientContentRectDOMRectReadOnlyのうち、 visibleDimensionselementtransformを適用した最小矩形とする。

    2. intersectingClientContentRectclientContentRectintersectionRectの交差部分とする。

    3. sizeintersectingClientContentRectwidth * intersectingClientContentRectheightとする。

    備考: これは要素の装飾部分ではなく画像そのものとの交差だけを考慮するためです。

    1. naturalAreaimageRequestnatural width * imageRequestnatural heightとする。

    2. naturalAreaが0の場合はnullを返す。

    3. boundingClientAreaclientContentRectwidth * clientContentRectheightとする。

    4. scaleFactorboundingClientArea / naturalAreaとする。

    5. scaleFactorが1より大きければ、sizescaleFactorで割る。

  10. sizeを返す。

4.4. LargestContentfulPaintエントリーの追加検討

備考: Largest Contentful Paint APIを実装するユーザーエージェントは、"largest-contentful-paint"supportedEntryTypes にWindowコンテキストで含める必要がある。 これにより開発者はAPIサポートを検出できる。

LargestContentfulPaint エントリーの追加検討を行うには、ユーザーエージェントは次の手順を実行する:

入力

candidatelargest contentful paint候補

intersectionRectDOMRectReadOnly

paintTimingInfopaint timing info

loadTime、DOMHighResTimestamp

documentDocument

出力

なし

  1. documentcontent setcandidate含んでいればリターン。

  2. appendcandidatedocumentcontent setに追加。

  3. windowdocumentrelevant global objectとする。

  4. windowスクロールイベントがディスパッチされたかまたは入力イベントがディスパッチされたかがtrueなら、リターン。

  5. sizecandidateelementintersectionRectを与えて実効視覚サイズで算出。

  6. sizedocumentlargest contentful paint size 以下ならリターン。

  7. urlを空文字列とする。

  8. candidaterequestがnullでなければ、 urlcandidaterequestrequest URLにする。

  9. idcandidateelementelement idとする。

  10. contentInfocontentInfo["size"] = size, contentInfo["url"] = url, contentInfo["id"] = id, contentInfo["loadTime"] = loadTime, contentInfo["element"] = candidateelementとするmapとする。

  11. LargestContentfulPaintエントリーの作成contentInfo, paintTimingInfo, documentで実行する。

4.5. LargestContentfulPaintエントリーの作成

LargestContentfulPaint エントリーの作成を行うには、ユーザーエージェントは次の手順を実行する:

入力

contentInfomap

paintTimingInfopaint timing info

documentDocument

出力

なし

  1. documentlargest contentful paint sizecontentInfo["size"]をセットする。

  2. entryを新しいLargestContentfulPaint エントリーとする。documentrelevant realmで、paint 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]

この仕様における例は、「例えば」などの語句で導入されるか、または class="example" のように規範的なテキストから区別されます。

これは参考用の例です。

参考注記は「注」などの語で始まり、規範的なテキストから class="note" で区別されます。

注:これは参考用の注記です。

準拠アルゴリズム

アルゴリズムの一部として命令形で記述されている要件(例: "先頭の空白文字を取り除く"、"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. Living 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. Living 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. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living 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月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[STREAMS]
Adam Rice; et al. Streams Standard. Living Standard. URL: https://streams.spec.whatwg.org/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living 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;