ペイントタイミング

W3C作業草案,

この文書の詳細
このバージョン:
https://www.w3.org/TR/2025/WD-paint-timing-20251020/
最新公開バージョン:
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. boundingRectgetBoundingClientRect()targetで実行した結果とする。

  2. boundingRect文書スクロール領域でクリップする。

  3. boundingRectを返す。

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

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

最初のペイントエントリには、ユーザーエージェントがナビゲーション後に初めてレンダーした時刻を示すDOMHighResTimeStampが含まれます。これはデフォルトの背景ペイントを除外しますが、非デフォルトの背景ペイントやiframeの囲みボックスは含みます。これはページロードで開発者が関心を持つ最初の重要な瞬間、すなわちユーザーエージェントがページのレンダリングを開始した瞬間です。

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

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

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

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

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

ペイントタイミングに依存するエントリーの属性、例えばLargestContentfulPaintrenderTime (およびその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;

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

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. rootelementルートとする。

  2. rootDocumentでなければ、戻る。

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

  4. record保留画像レコードelement elementrequest imageRequestloadTime now)とする。

  5. recordrootレンダリング待ち画像に追加する。

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

5.3.1. 最初の内容ペイント

Document document最初の内容ペイントを報告すべきかを知るには、以下の手順を実行します:
  1. document過去に報告されたペイント集合"first-contentful-paint"が含まれていれば、falseを返す。

  2. document要素を1つ以上含み、その要素がペイント可能かつ内容有りなら、trueを返す。

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

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

ペイントタイミングのマークを、Document documentを入力として求められた場合、以下の手順を実行します:
  1. documentブラウジングコンテキストペイントタイミング対象でない場合は戻る。

  2. paintTimingInfoを新しいペイントタイミング情報(そのレンダリング更新終了時刻document現在の高精度時刻)とする。(document関連グローバルオブジェクトに基づく)

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

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

  5. docレンダリング待ち画像リストの各recordについて:

    1. recordrequest利用可能かつペイント準備ができていれば、次の手順を実行:

      1. recordpaintedImagesに追加。

      2. recorddocレンダリング待ち画像リストから削除。

  6. Element elementdoc子孫の各要素について:

    1. elementdoc描画済みテキストを持つ要素集合に含まれていれば、続行。

    2. element所有テキストノード集合が空なら、続行。

    3. 追加としてelementdoc描画済みテキストを持つ要素集合に加える。

    4. 追加としてelementpaintedTextNodesに加える。

  7. reportedPaintsdocument過去に報告されたペイント集合とする。

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

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

  10. flushPaintTimingsを以下の手順とする:

    1. reportedPaints"first-paint"を含まず、ユーザーエージェントが最初のペイントのマークを設定している場合、ペイントタイミングを報告document"first-paint"paintTimingInfoを指定して呼び出す。

      注意: 最初のペイントはデフォルト背景ペイントを除外しますが、非デフォルト背景ペイントは含みます。

      これは規定ノートにすべきです。

    2. document最初の内容ペイントを報告すべきなら:

      1. ペイントタイミングを報告document"first-contentful-paint"paintTimingInfoを指定して呼び出す。

      注意: 親フレームは子iframeのペイントイベントを認識せず、逆も同様です。つまりiframeのみを含むフレームは最初のペイント(iframeの囲みボックスによる)を持ちますが、最初の内容ペイントは持ちません。

      注意: document"first-paint""first-contentful-paint"を必ずしもマークするとは限りません。完全に空のdocument最初のペイントをマークしない場合があり、documentが内容有りでない要素のみを含む場合は最初の内容ペイントをマークしない場合があります。

      注意: 最初のペイントのマークは任意です。ペイントタイミングを実装するユーザーエージェントは、少なくとも最初の内容ペイントはマークすべきです。

    3. 最大内容ペイントの報告documentpaintTimingInfopaintedImagespaintedTextNodesで呼び出す。

    4. 要素タイミングの報告documentpaintTimingInfopaintedImagespaintedTextNodesで呼び出す。

    5. frameTimingInfoがnullでなければ、長いアニメーションフレームエントリをキューdocumentframeTimingInfopaintTimingInfoで呼び出す。

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

  12. 以下の手順を並行して実行:

    1. 現在のフレームがユーザーに表示された実装定義タイミングまで待機。

    2. paintTimingInfo実装定義の表示時刻document現在の高精度時刻に設定。

    3. documentクロスオリジン分離能力がfalseなら:

      1. paintTimingInfo実装定義の表示時刻を4ミリ秒の倍数またはそれ以上に粗くする。

      2. 現在の高精度時刻paintTimingInfo実装定義の表示時刻になるまで待機。

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

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

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

    1. newEntryname 属性にpaintTypeを設定。

    2. newEntryentryType 属性に"paint"を設定。

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

    4. newEntryduration 属性に0を設定。

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

  3. キューnewEntrydocument関連レルムで追加。

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

5.4. 共通アルゴリズム

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

Element elementペイントタイミング向け公開かどうかを、Documentまたはnull documentを入力として判定するには、以下の手順を行う:

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

  2. documentがnullの場合、documentelement関連設定オブジェクト関連グローバルオブジェクト関連付けられた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 Backgrounds and Borders Module Level 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 Cascading and Inheritance Level 5. 2022年1月13日. CR. URL: https://www.w3.org/TR/css-cascade-5/
[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-DISPLAY-4]
Elika Etemad; Tab Atkins Jr.. CSS Display Module Level 4. 2024年12月19日. FPWD. URL: https://www.w3.org/TR/css-display-4/
[CSS-FONTS-4]
Chris Lilley. CSS Fonts Module Level 4. 2024年2月1日. WD. URL: https://www.w3.org/TR/css-fonts-4/
[CSS-TEXT-4]
Elika Etemad; 他. CSS Text Module Level 4. 2024年5月29日. WD. URL: https://www.w3.org/TR/css-text-4/
[CSSOM-VIEW-1]
Simon Fraser; Emilio Cobos Álvarez. CSSOM View モジュール。2025年9月16日。作業草案(WD)。URL: https://www.w3.org/TR/cssom-view-1/
[DOM]
Anne van Kesteren. DOM Standard. 現行標準. URL: https://dom.spec.whatwg.org/
[ELEMENT-TIMING]
Element Timing API. 編集者草案. URL: https://w3c.github.io/element-timing/
[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; 他. HTML Standard. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. 現行標準. 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. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4. 2022年11月11日. WD. URL: https://www.w3.org/TR/selectors-4/
[SVG2]
Amelia Bellamy-Royds; 他. Scalable Vector Graphics (SVG) 2. 2018年10月4日. CR. URL: https://www.w3.org/TR/SVG2/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. 現行標準. URL: https://webidl.spec.whatwg.org/

情報参考文献

[EVENT-TIMING]
Michal Mocny. イベントタイミングAPI。2025年10月17日。作業草案(WD)。URL: https://www.w3.org/TR/event-timing/
[LARGEST-CONTENTFUL-PAINT]
Yoav Weiss; Nicolas Pena Moreno. 最大コンテンツ描画。2025年9月11日。作業草案(WD)。URL: https://www.w3.org/TR/largest-contentful-paint/
[LONG-ANIMATION-FRAMES]
ロングアニメーションフレームAPI。編集者草案。URL: https://w3c.github.io/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;

課題索引

これは規定ノートにすべきです。
MDN

PerformancePaintTiming

In all current engines.

Firefox84+Safari14.1+Chrome60+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?