最大コンテンツの表示

W3C作業草案,

このドキュメントの詳細
このバージョン:
https://www.w3.org/TR/2026/WD-largest-contentful-paint-20260319/
最新公表バージョン:
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 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. 用語

最大 コンテンツ描画候補は、以下のメンバーを含む構造体です:

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ペイントタイミング情報 で指定して返さなければならない。

loadTime 属性は、thisloadTime の値を返さなければならない。

size 属性は、thissize の値を返さなければならない。

id 属性は、thisid の値を返さなければならない。

url 属性は、thisurl の値を返さなければならない。

element 属性のgetterは次の手順を実行しなければならない:

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

  2. thiselement を返す。

注記: 上記のアルゴリズムは、Document子孫でなくなった要素は element 属性getterによって返されなくなり、シャドウDOM内の要素も含まれることを意味します。

この仕様はさらに、Documentlargest contentful paint size(最大コンテンツペイントサイズ)概念を追加し、初期値は0とします。

4. 処理モデル

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

4.1. DOM仕様への修正

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

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

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

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

最大コンテンツ描画を報告するよう要求された場合、Document document描画タイミング情報 paintTimingInfo順序付け集合である 保留中画像レコード paintedImages、および 順序付け集合である 要素 paintedTextNodesを受け取り、次の手順を実行する:

注記: paintedImagesに含まれる各保留中画像レコードと paintedTextNodesのテキスト要素は、それぞれ一度だけ報告されます(描画タイミングのマークから)。要素が描画可能(例:不透明・可視)かつコンテンツが表示可能(画像リソースやブロックしているフォントが十分に読み込まれている)となった最初の描画でのみ対象となります。

  1. windowdocument関連グローバルオブジェクトとする。

  2. もしwindowスクロールイベントが dispatch 済みまたは入力イベントが dispatch 済みのいずれかが true なら、終了する。

  3. newCandidateSizedocument最大コンテンツ描画サイズとする。

  4. newCandidateをnullにする。

  5. paintedImagesの各 recordについて:

    1. imageElementrecord要素とする。

    2. もしimageElement描画タイミング用に公開済みでない場合(documentを指定)、次へ。

    3. intersectionRectを、intersection rect algorithm により imageElementをターゲット、viewportをルートとして返される値とする。

    4. sizeintersectionRectrecordリクエストを用いた 効果的視覚サイズとする。

    5. もしsizenewCandidateSize以下なら次へ。

    6. newCandidateSizesizeに設定する。

    7. newCandidateに新しい最大コンテンツ描画候補を設定し、その 要素imageElement, サイズsize, リクエストrecordリクエスト, ロード時間recordロード時間に設定する。

  6. paintedTextNodesの各 textNodeについて:

    1. もしtextNode描画タイミング用に公開済みでない場合(documentを指定)、次へ。

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

      1. もしtextNodetext-shadow値がnoneかつ textNodestroke-color値が transparenttextNodestroke-image値が none なら次へ。

    3. intersectionRectを、textNode所有テキストノード集合内の全ての Text ノードの border box の合計を ビジュアルビューポートと重ね合わせたものとする。

    4. sizeintersectionRectとnullを用いた 効果的視覚サイズによって算出する。

    5. もしsizenewCandidateSize以下なら次へ。

    6. newCandidateSizesizeに設定する。

    7. newCandidateに新しい最大コンテンツ描画候補を設定し、その 要素textNode, サイズsize, リクエストをnull、 ロード時間を0に設定する。

  7. もしnewCandidateがnullでなければ:

    1. LargestContentfulPaintエントリーを作成するnewCandidate, paintTimingInfo, documentを指定)。

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

要素の効果的視覚サイズを決定するには、次の手順を実行します:

入力

intersectionRectDOMRectReadOnly

imageRequestRequest または null

element要素

document文書

出力

Largest Contentful Paint に報告するサイズ(ピクセル単位)、または要素がLCP候補でなければnull。

  1. widthintersectionRect横幅とする。

  2. heightintersectionRect縦幅とする。

  3. sizewidth * heightとする。

  4. rootdocument閲覧コンテキストトップレベル閲覧コンテキストアクティブ文書とする。

  5. rootWidthroot視覚ビューポートの横幅(スクロールバーを除く)とする。

  6. rootHeightroot視覚ビューポートの高さ(スクロールバーを除く)とする。

  7. もし sizerootWidth × rootHeight に等しいなら、null を返す。

  8. imageRequest が null でない場合、画像の位置や拡大調整のため次の手順を実行:

    1. imageRequestレスポンスのバイト長が size * 0.004 より小さいなら、null を返す。

      注記: このヒューリスティックはユーザにとって十分コンテンツとなる画像データ量か判定する。転送されたファイルサイズ(バイト数)と実際生成されるピクセル数を比較する。非常に少ないバイト数で大量のピクセルをエンコードしている画像は、低コンテンツ背景やグラデーション等であり、LCP候補と見なされません。

    2. concreteDimensionsimageRequest具体オブジェクトサイズelement内)とする。

    3. visibleDimensionsconcreteDimensionsの位置調整結果とし、object-position または background-positionelementコンテンツボックスを使って調整。

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

    1. clientContentRectvisibleDimensions を含む最小の DOMRectReadOnlyelementtransformを適用)とする。

    2. intersectingClientContentRectclientContentRectintersectionRect の重なり部分とする。

    3. sizeintersectingClientContentRect横幅 * intersectingClientContentRect高さとする。

    注記: 画像本体のみと要素装飾部を区別し画像本体部分のみ重なりを取っています。

    1. naturalAreaimageRequest自然横幅 * imageRequest自然高さとする。

    2. naturalArea が 0 なら、null を返す。

    3. boundingClientAreaclientContentRect横幅 * clientContentRect高さとする。

    4. scaleFactorboundingClientArea / naturalAreaとする。

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

  9. size を返す。

4.4. LargestContentfulPaint エントリーを作成する

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

入力

candidate最大コンテンツ描画候補

paintTimingInfo描画タイミング情報

documentDocument

出力

なし

  1. document最大コンテンツ描画サイズcandidateサイズに設定する。

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

  3. candidateリクエスト が null でなければ、 urlcandidateリクエストリクエスト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]

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

これは参考用の例です。

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

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

準拠アルゴリズム

アルゴリズムの一部として命令形で記述されている要件(例: "先頭の空白文字を取り除く"、"falseを返してこれらのステップを中止する")は、アルゴリズムの導入で使われているキーワード("must"、"should"、"may" など)に従って解釈されます。

アルゴリズムや特定手順として記述された適合要件は、結果が同等であれば、どのような方法で実装されても構いません。 とくに、この仕様で定義されるアルゴリズムは理解しやすいことを目的としており、性能最適化を意図するものではありません。 実装者は最適化することが推奨されます。

索引

本仕様で定義される用語

参照による用語

参考文献

規範参考文献

[CSS-BACKGROUNDS-3]
Elika Etemad; Brad Kemper. CSS 背景と境界線モジュール レベル3. 2024年3月11日. CRD. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS-BOX-4]
Elika Etemad. CSS ボックスモデル モジュール レベル4. 2024年8月4日. WD. URL: https://www.w3.org/TR/css-box-4/
[CSS-COLOR-3]
Tantek Çelik; Chris Lilley; David Baron. CSS カラーモジュール レベル3. 2022年1月18日. REC. URL: https://www.w3.org/TR/css-color-3/
[CSS-COLOR-4]
Tab Atkins Jr.; Chris Lilley; Lea Verou. CSS カラーモジュール レベル4. 2026年2月27日. CRD. URL: https://www.w3.org/TR/css-color-4/
[CSS-IMAGES-3]
Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS イメージモジュール レベル3. 2023年12月18日. CRD. URL: https://www.w3.org/TR/css-images-3/
[CSS-TEXT-DECOR-4]
Elika Etemad; Koji Ishii. CSS テキスト装飾 モジュール レベル4. 2022年5月4日. WD. URL: https://www.w3.org/TR/css-text-decor-4/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS 値と単位 モジュール レベル4. 2024年3月12日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSSOM-VIEW-1]
Simon Fraser; Emilio Cobos Álvarez. CSSOM ビューモジュール. 2025年9月16日. WD. URL: https://www.w3.org/TR/cssom-view-1/
[DOM]
Anne van Kesteren. DOM 標準. Living Standard. URL: https://dom.spec.whatwg.org/
[EVENT-TIMING]
Michal Mocny. イベントタイミングAPI. 2026年3月19日. WD. URL: https://www.w3.org/TR/event-timing/
[FETCH]
Anne van Kesteren. Fetch 標準. Living Standard. URL: https://fetch.spec.whatwg.org/
[FILL-STROKE-3]
Elika Etemad; Tab Atkins Jr.. CSS 塗りとストロークモジュール レベル3. 2017年4月13日. FPWD. URL: https://www.w3.org/TR/fill-stroke-3/
[GEOMETRY-1]
Sebastian Zartner; Yehonatan Daniv. ジオメトリ インターフェース モジュール レベル1. 2025年12月4日. CRD. URL: https://www.w3.org/TR/geometry-1/
[HR-TIME-3]
Yoav Weiss. 高解像度タイム. 2026年3月2日. WD. URL: https://www.w3.org/TR/hr-time-3/
[HTML]
Anne van Kesteren; et al. HTML 標準. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 標準. Living Standard. URL: https://infra.spec.whatwg.org/
[PAINT-TIMING]
Ian Clelland; Noam Rosenthal. ペイントタイミング. 2026年1月7日. WD. URL: https://www.w3.org/TR/paint-timing/
[PERFORMANCE-TIMELINE]
Nicolas Pena Moreno. パフォーマンス タイムライン. 2025年5月21日. CRD. URL: https://www.w3.org/TR/performance-timeline/
[RFC2119]
S. Bradner. RFCで要求レベルを示す際のキーワード. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[STREAMS]
Adam Rice; et al. Streams 標準. Living Standard. URL: https://streams.spec.whatwg.org/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 標準. 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;