ペイントタイミング

W3C作業草案,

この文書の詳細
このバージョン:
https://www.w3.org/TR/2026/WD-paint-timing-20261014/
最新公開バージョン:
https://www.w3.org/TR/paint-timing/
編集者草案:
https://w3c.github.io/paint-timing/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/paint-timing/
フィードバック:
GitHub
仕様内インライン
編集者:
(Google)
(Google)
以前の編集者:
(Google)
(Google)

概要

本ドキュメントは、ページロード中に開発者が関心を持つ主要な瞬間(最初のペイント、最初の内容ペイント)を記録するために使用できるAPIを定義します。

この文書の位置付け

このセクションでは、この文書が公開された時点でのステータスについて説明します。 現在のW3Cの出版物およびこの技術報告書の最新改訂版のリストは、W3C標準と草案のインデックスで確認できます。

この文書は、Web Performance Working Group によって勧告トラックを使用して作業草案として公開されました。 作業草案としての公開は、 W3Cおよびそのメンバーによる承認を意味するものではありません。

これは草案文書であり、他の文書によって随時更新、置換、または廃止される可能性があります。 この文書を進行中の作業以外のものとして引用することは不適切です。

GitHub Issuesは、この仕様について議論するための優先手段です。

この文書は、 2025年8月18日版のW3Cプロセス文書 に準拠しています。

この文書は、W3C特許方針の下で活動するグループによって作成されました。 W3Cは、このグループの成果物に関連して行われた特許開示の公開リストを維持しています。 そのページには、特許を開示するための手順も含まれています。 個人が、必須クレームを含むと信じる特許に関する実際の知識を持っている場合、 当該個人はW3C特許方針の第6節に従って情報を開示する必要があります。

1. はじめに

このセクションは規定ではありません。

ウェブブラウザの主な目的は、HTML、CSS、画像リソースをユーザーのために画面上のピクセルへ変換することです。ウェブページのパフォーマンス測定は、多くの場合、これらの作業(テキストや画像などのコンテンツを画面に描画する)の所要時間を計測することに関係します。こうしたタイミングの使い方には、ページのパフォーマンスやロード時のユーザー体験を評価する様々な方法がありますが、根本的にはどれも時間を測定する共通の手段から始まります。

これはペイントタイミングを一般的な仕組みとして測定する方法を定める基礎的なドキュメントです。この基盤を用いて、First Paint(最初のペイント)およびFirst Contentful Paint(最初の内容ペイント)の指標を定義します。ペイント測定の他の具体的な事例については、他の文書で定められる場合があります。

具体的に、本仕様では以下を扱います:

1.1. 最初のペイントおよび最初の内容ペイント

ロードは単一の瞬間ではなく、単一の指標で完全に捉えられるものではありません。ロード体験には、ユーザーが「速い」と感じるか「遅い」と感じるかに影響する複数の瞬間があります。

First Paint(FP)はその重要な瞬間の最初であり、続いてFirst Contentful Paint(FCP)が続きます。これらの指標は、ブラウザが指定されたドキュメントを描画するタイミングを示します。これはユーザーにとって「何かが起きているか?」という疑問に答える重要な瞬間です。

両指標の主な違いは、FPがブラウザがそのドキュメントで何かを初めて描画した時点を示すのに対し、FCPはDOMから最初の画像またはテキストコンテンツが描画された時点を示すことです。

1.2. 使用例

const observer = new PerformanceObserver(function(list) {
    const perfEntries = list.getEntries();
    for (const perfEntry of perfEntries) {
        // エントリーの処理
        // 分析や監視のための報告
        // ...
    }
});

// ペイントタイミング通知のためのオブザーバ登録
observer.observe({entryTypes: ["paint"]});

2. 用語

ペイント:ユーザーエージェントが「ペイント」(または「レンダー」)を実行したとは、レンダーツリーを画面上のピクセルに変換したことを指します。正式には、ユーザーエージェントがイベントループのレンダリングの更新ステップを実行したときに「レンダー」されたとみなします。

注意: レンダリング処理は非常に複雑であり、タイムスタンプはユーザーエージェントがこのパイプラインで記録できる最新のタイムスタンプ(ベストエフォート)であるべきです。通常、このAPIではフレームがOSへ表示のため送信される時刻が推奨されます。

生成コンテンツ疑似要素は、以下すべてを満たす場合ペイント可能疑似要素です:

CSS画像 imgは、以下すべてを満たす場合内容画像です:

DOMString は、非空であるとは、文書の空白文字以外の文字を1文字以上含む場合です。

要素 targetは、次のいずれかを満たす場合内容有りです:

要素は、以下のいずれかの場合タイミング対象です:

ペイント可能境界矩形を要素targetで計算するには、次の手順を実行します:

  1. boundingRectをgetBoundingClientRect() をtargetで実行した結果とする。

  2. boundingRect を document の スクロール領域 でクリップする。

  3. boundingRectを返す。

注意: overflow: scrollやoverflow: hiddenなボックスに含まれる要素は、ペイント可能境界矩形がクリップされません。どちらの場合でも、要素はスクロール操作で可視化できるためです。

要素 elは、次の全てを満たす場合ペイント可能です:

初回ペイントエントリーには、 DOMHighResTimeStamp ナビゲーション後にユーザーエージェントが初めてレンダリングした時刻を報告するものが含まれる。これには既定の背景の ペイントは含まれないが、既定以外の背景のペイントと、ペイント可能な iframe の包含ボックスが含まれる。これは、開発者が ページの読み込み時に重視する最初の重要な時点、すなわちユーザーエージェントがページのレンダリングを開始した時点である。

ブラウジングコンテキスト ctxは、以下のいずれかを満たす場合ペイントタイミング対象です:

3. ペイントタイミングミキシン

このセクションは規範的ではありません。

PaintTimingMixin インターフェイスは、レンダリングサイクルに関連するタイムスタンプを公開する。 これは、PerformanceEntry を拡張するプラットフォームオブジェクトに含まれ、 具体的には PerformanceElementTiming、 LargestContentfulPaint、 PerformanceEventTiming、 PerformancePaintTiming、 および PerformanceLongAnimationFrameTiming によって含まれる。

paintTime 属性は、レンダリングの更新ループの終了時点のタイムスタンプを表し、 presentationTime は、フレームがユーザーに提示される際にマークされる実装固有のタイムスタンプを表します。 HTML標準でレンダリングの更新から呼び出されるペイントタイミングのマークアルゴリズムが両方の属性を設定します。

塗りタイミングに依存するエントリの属性、たとえば LargestContentfulPaint の renderTime (および startTime)は、 通常、各個別のタイムスタンプではなくデフォルト塗りタイムスタンプを返すため、 presentationTime の実装依存な性質に左右されません。

3.1. PaintTimingMixin インターフェース

[Exposed=Window]
interface mixin PaintTimingMixin {
    readonly attribute DOMHighResTimeStamp paintTime;
    readonly attribute DOMHighResTimeStamp? presentationTime;
};

PaintTimingMixin インターフェースミキシンを含むオブジェクトには、関連付けられたペイントタイミング情報(nullまたはペイントタイミング情報)があります。

ペイントタイミング情報は、 構造体です。以下の項目を持ちます:

レンダリング更新終了時刻

DOMHighResTimeStamp

実装依存のプレゼンテーション時刻

Null または DOMHighResTimeStamp

paintTime 属性のゲッターステップは、this の ペイントタイミング情報 の レンダリング更新終了時間 を返します。

presentationTime 属性のゲッターステップは、存在する場合、this の ペイントタイミング情報 の 実装依存の提示時間 を返します。

ペイントタイミング情報 paintTimingInfo のデフォルトペイントタイムスタンプを取得するには、 paintTimingInfo の 実装依存の提示時間 が null でない場合はそれを返し、それ以外の場合は paintTimingInfo の レンダリング更新終了時間 を返します。

4. PerformancePaintTiming インターフェイス

[Exposed=Window]
interface PerformancePaintTiming : PerformanceEntry {
    [Default] object toJSON();
};
PerformancePaintTiming includes PaintTimingMixin;

PerformancePaintTiming は PerformanceEntry インターフェイスの下記属性を拡張します:

NOTE: PerformancePaintTiming を実装するユーザーエージェントは、"paint" を supportedEntryTypes に含める必要があります。 グローバルオブジェクト の ブラウジングコンテキスト が paint-timing eligible である場合です。 これにより、開発者は特定の ブラウジングコンテキスト に対してペイントタイミングのサポートを検出できます。

5. 処理モデル

5.1. 関連付けられた画像リクエスト

各 Element には 関連付けられた画像リクエスト があり、これは 画像リクエスト または null で、初期値は null です。

Element 型の element の処理モデルが HTMLImageElement, SVGImageElement, または HTMLVideoElement が新しい画像リソース(例:画像やポスター画像として表示されるため)を作成するとき、 element の 関連付けられた画像リクエスト は作成された画像リソースの 画像リクエスト に設定されます。

Note: URLの scheme が "data" である画像リソースは、取得されませんが依然として読み込む必要がある 画像リクエスト を持ちます。このリクエストは Element の 関連付けられた画像リクエスト となり得ます。

Note: 現在の記述は具体的な アルゴリズムには言及していないため曖昧です。該当する処理モデルがより統一された処理モデルを持つ場合、より厳密に記述できます。

全ての Element は 関連付けられた背景画像リクエスト のリストを持ち、初期値は空の配列です。Element element のスタイルが新しい画像リソース(背景画像として表示されるため)を必要とする場合、新しいリソースによって作成された 画像リクエスト が element の 関連付けられた背景画像リクエスト に追加されます。

NOTE: Element は複数の 画像リクエスト を持つことができます。例えば、 background-image プロパティが複数値を持つ場合です。下記例では、一つの background-image プロパティが4つの 画像リクエスト を生成し、それぞれが下記アルゴリズムで記録・報告されます。

<!DOCTYPE html>
<style>
div {
  background-image: url(https://images.example/background1.png),
                    url(https://images.example/background2.png);
}
</style>
<div></div>
<div></div>

5.2. ペイントタイミングの記録

pending image record は、以下の 構造体の 要素を持つものです。

Element は所有テキストノード集合(初期値は空の順序付き集合で、Text ノードを含む)を持ちます。

Document は過去に報告されたペイント集合(初期値は空の順序付き集合で、文字列を含む)を持ちます。

Document はレンダリング待ち画像(初期値は空のリストで、保留画像レコードを含む)を持ちます。

Document は描画済みテキストを持つ要素集合(初期値は空の順序付き集合で、Elementを含む)を持ちます。

5.2.1. CSS仕様への修正

画像リクエストがElementelementの関連背景画像リクエスト内で完全に利用可能となった場合、elementおよび画像リクエストを入力として読み込み完了画像の処理アルゴリズムを実行します。

5.2.2. HTML仕様への修正

Element elementの関連画像リクエストが完全に利用可能となった場合、elementとその関連画像リクエストを入力として読み込み完了画像の処理アルゴリズムを実行します。

ユーザーエージェントがText ノードtextを初めてペイントしたとき、次の手順を実行してください:

5.2.3. 読み込み完了画像の処理

読み込み完了画像の処理を、Element elementと画像リクエスト imageRequestを入力として実行するには:
  1. rootをelementのルートとする。

  2. rootがDocumentでなければ、戻る。

  3. nowをelementの現在の高精度時刻(elementの関連グローバルオブジェクトに基づく)とする。

  4. recordを保留画像レコード(element element、request imageRequest、loadTime now)とする。

  5. recordをrootのレンダリング待ち画像に追加する。

5.3. ペイントタイミングの報告

5.3.1. 最初の内容ペイント

Document document が first contentful paint を報告すべきかを知るには、次の手順を実行する:
  1. もし document の これまでに報告されたペイントの集合 が "first-contentful-paint" を含む場合、false を返す。

  2. もし document が 要素を1つ以上保持しており、そのどれかが paintable かつ contentful であれば、true を返す。

  3. それ以外の場合、false を返す。

5.3.2. ペイントタイミングのマーク

ペイントタイミングを 記録するよう求められ、Document document が入力として与えられた場合、次の手順を実行する:
  1. 文書の閲覧コンテキストがペイントタイミングの対象でない場合、 戻る。

  2. paintTimingInfo を新しいペイントタイミング情報とし、そのレンダリング更新終了時刻を 現在の高分解能時刻とする。この時刻は documentの関連するグローバルオブジェクトを指定して取得する。

  3. paintedImages を新しい順序付き集合とする

  4. paintedTextNodes を新しい順序付き集合とする

  5. 各recordについて、docのレンダリング待ちの 画像リストを反復する:

    1. recordのリクエストが利用可能でペイントの準備が整っている場合、次の 手順を実行する:

      1. recordをpaintedImagesに追加する。

      2. recordをdocのレンダリング待ちの画像リストから削除する。

  6. 各Element elementについて、docの子孫を反復する:

    1. elementがdocのレンダリングされた テキストを持つ要素の集合に含まれる場合、次に進む。

    2. elementの所有するテキストノードの集合が空の場合、 次に進む。

    3. 追加する。elementをdocのレンダリングされた テキストを持つ要素の集合に。

    4. 追加する。elementを paintedTextNodesに。

  7. reportedPaintsをdocumentの以前に報告されたペイントの集合とする。

  8. frameTimingInfoをdocumentの現在のフレームタイミング情報とする。

  9. documentの現在のフレームタイミング情報を null に設定する。

  10. flushPaintTimingsを次の手順とする:

    1. reportedPaintsに"first-paint"が含まれず、ユーザーエージェントが 初回 ペイントを記録するよう設定されている場合、ペイントタイミングを報告する。document、 "first-paint"、およびpaintTimingInfoを指定する。

      注: 初回ペイントには既定の 背景のペイントは含まれないが、既定以外の背景のペイントは含まれる。

      これは 規範的な注記に変更すべきである。

    2. documentが初回コンテンツフル ペイントを報告すべき場合、次を実行する:

      1. ペイントタイミングを報告する。指定するのは document、"first-contentful-paint"、および paintTimingInfo。

      注: 親フレームは 子 iframe のペイントイベントを認識すべきではなく、その逆も同様である。これは、 iframe のみを含むフレームには初回ペイント(ペイント可能な iframe の包含ボックスによる)が発生するが、初回コンテンツフルペイントは発生しないことを意味する。

      注: 文書が"first-paint"または"first-contentful-paint"を記録することは保証されない。完全に空白の文書は初回ペイントを記録しない場合があり、文書にコンテンツフルでない要素のみが含まれる場合、 初回コンテンツフルペイントが記録されないことがある。

      注: 初回ペイントの 記録は任意である。ペイントタイミングを実装するユーザーエージェントは、少なくとも初回コンテンツフルペイントを記録すべきである。

    3. 最大コンテンツフルペイントを報告する。 document、paintTimingInfo、 paintedImagesおよびpaintedTextNodesを指定する。

    4. 要素タイミングを報告する。指定するのは document、paintTimingInfo、 paintedImagesおよびpaintedTextNodes。

    5. frameTimingInfoが null でない場合、長いアニメーションフレームの エントリーをキューに入れる。document、frameTimingInfo、および paintTimingInfoを指定する。

  11. ユーザーエージェントが実装定義の表示時刻をサポートしない場合、 flushPaintTimingsを呼び出して戻る。

  12. 次の手順を並列に実行する:

    1. 現在のフレームがユーザーに表示された時点を表す実装定義の時刻になるまで 待機する。

    2. paintTimingInfoの実装定義の 表示時刻を、現在の高分解能時刻に設定する。 この時刻はdocumentの関連するグローバルオブジェクトを指定して取得する。

    3. documentのオリジン間 分離機能が false の場合、次を実行する:

      1. paintTimingInfoの実装定義の 表示時刻を、次の4ミリ秒の倍数、またはそれより粗い精度に丸める。

      2. 現在の高分解能 時刻がpaintTimingInfoの実装定義の 表示時刻になるまで待機する。

    4. グローバルタスクをキューに入れる。対象となるパフォーマンスタイムラインのタスク ソースに、documentの関連するグローバルオブジェクトを指定し、 flushPaintTimingsを実行する。

5.3.3. ペイントタイミングの報告

ペイントタイミングの報告をdocument、paintType、ペイントタイミング情報paintTimingInfoで行うには、以下の手順を実行します:
  1. 新しいPerformancePaintTiming オブジェクトnewEntryをdocumentの関連レルムで作成し、以下の属性を設定する:

    1. newEntryのname 属性にpaintTypeを設定。

    2. newEntryのentryType 属性に"paint"を設定。

    3. newEntryのstartTime 属性にデフォルトペイントタイムスタンプ(paintTimingInfoで取得)を設定。

    4. newEntryのduration 属性に0を設定。

  2. newEntryのペイントタイミング情報にpaintTimingInfoを設定。

  3. キューにnewEntryをdocumentの関連レルムで追加。

  4. 追加としてpaintTypeをdocumentの過去に報告されたペイント集合に加える。

5.4. 共通アルゴリズム

5.4.1. ペイントタイミング向け公開

要素elementがペイントタイミングのために露出されているかどうか判定するには、Documentまたはnullであるdocumentを使い、次の手順を実行する:

  1. elementが接続済みでなければ、falseを返す。

  2. documentがnullの場合、documentをelementの関連設定オブジェクトの関連グローバルオブジェクトの関連付けられたdocumentとする。

  3. documentが完全にアクティブでなければ、falseを返す。

  4. elementのルートがdocumentと一致しなければ、falseを返す。

  5. trueを返す。

6. 謝辞

この仕様の技術的な貢献・提案を通じて改善に導いてくださった全てのコントリビューターに特別な感謝を表します。

適合性

文書記法

適合性要件は記述的な断定や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" によって規定文から区別されています。例えば:

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-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS カスケードおよび継承 レベル 5. 2022年1月13日. CR. URL: https://www.w3.org/TR/css-cascade-5/
[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-DISPLAY-4]
Elika Etemad; Tab Atkins Jr.. CSS ディスプレイモジュール レベル 4. 2025年11月6日. WD. URL: https://www.w3.org/TR/css-display-4/
[CSS-FONTS-4]
Chris Lilley. CSS フォントモジュール レベル 4. 2026年 9月13日. WD. URL: https://www.w3.org/TR/css-fonts-4/
[CSS-TEXT-4]
Elika Etemad; et al. CSS テキストモジュール レベル 4. 2026年8月14日. WD. URL: https://www.w3.org/TR/css-text-4/
[CSS2]
Bert Bos; et al. カスケーディングスタイルシート レベル 2 改訂 1 (CSS 2.1) 仕様. 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS2/
[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 標準. 現行標準. URL: https://dom.spec.whatwg.org/
[ELEMENT-TIMING]
Element Timing API. 編集者草案. URL: https://w3c.github.io/element-timing/
[HR-TIME-3]
Yoav Weiss. 高精度時刻. 2026年9月1日. WD. URL: https://www.w3.org/TR/hr-time-3/
[HTML]
Anne van Kesteren; et al. HTML 標準. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 標準. 現行標準. URL: https://infra.spec.whatwg.org/
[PERFORMANCE-TIMELINE]
Nicolas Pena Moreno. Performance Timeline. 2025年5月21日. CRD. URL: https://www.w3.org/TR/performance-timeline/
[RFC2119]
S. Bradner. 要求レベルを示すために RFC で使用する キーワード. 1997年3月. 現行のベストプラクティス. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. セレクター レベル 4. 2026年1月22日. WD. URL: https://www.w3.org/TR/selectors-4/
[SVG2]
Karl Dubost; ほか。スケーラブルベクターグラフィックス (SVG) 2。 2026年10月6日。CR。URL: https://www.w3.org/TR/SVG2/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 標準. 現行 標準. URL: https://webidl.spec.whatwg.org/

情報参考文献

[EVENT-TIMING]
Michal Mocny. Event Timing API. 2026年10月13日. WD. URL: https://www.w3.org/TR/event-timing/
[LARGEST-CONTENTFUL-PAINT]
Yoav Weiss. 最大コンテンツフル ペイント. 2026年8月26日. WD. URL: https://www.w3.org/TR/largest-contentful-paint/
[LONG-ANIMATION-FRAMES]
Noam Rosenthal. Long Animation Frames API. 2026年4月28日. FPWD. URL: https://www.w3.org/TR/long-animation-frames/
[URL]
Anne van Kesteren. URL 標準. 現行標準. URL: https://url.spec.whatwg.org/

IDL索引

[Exposed=Window]
interface mixin PaintTimingMixin {
    readonly attribute DOMHighResTimeStamp paintTime;
    readonly attribute DOMHighResTimeStamp? presentationTime;
};

[Exposed=Window]
interface PerformancePaintTiming : PerformanceEntry {
    [Default] object toJSON();
};
PerformancePaintTiming includes PaintTimingMixin;

課題索引

This should be turned into a normative note. ↵
✔MDN