ペイントタイミング

W3C作業草案,

この文書の詳細
このバージョン:
https://www.w3.org/TR/2026/WD-paint-timing-20260324/
最新公開バージョン:
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. boundingRectdocumentスクロール領域 でクリップする。

  3. boundingRectを返す。

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

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

First paint エントリは、 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 documentfirst contentful paint を報告すべきかを知るには、次の手順を実行する:
  1. もし documentこれまでに報告されたペイントの集合"first-contentful-paint" を含む場合、false を返す。

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

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

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

ペイントタイミングをマークするよう求められ、Document document が入力の場合、次の手順を実行する:
  1. documentブラウジングコンテキストペイントタイミング対応でない場合、return する。

  2. paintTimingInfo を新しい paint timing info とし、その レンダリング更新終了時刻document関連グローバルオブジェクトでの current high resolution time の値とする。

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

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

  5. docimages pending rendering リストの各 record について:

    1. recordrequestavailable かつペイント可能な場合、次を行う:

      1. recordpaintedImages に追加する。

      2. recorddocimages pending rendering リストから削除する。

  6. Element elementdoc子孫それぞれについて:

    1. もし elementdocset of elements with rendered text に含まれていれば続行。

    2. elementset of owned text nodes が空であれば続行。

    3. set-appendelementdocset of elements with rendered text に追加する。

    4. set-appendelementpaintedTextNodes に追加する。

  7. reportedPaintsdocumentこれまでに報告されたペイントの集合とする。

  8. frameTimingInfodocumentcurrent frame timing infoとする。

  9. documentcurrent frame timing info を null に設定する。

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

    1. もし reportedPaints"first-paint" が含まれず、かつユーザーエージェントが first paint をマークする設定になっていれば、report paint timingdocument"first-paint"paintTimingInfo で呼び出す。

      注: first paint はデフォルトの背景の塗りを除外しますが、非デフォルトの背景の塗りは含みます。

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

    2. もし documentfirst contentful paint を報告すべき であれば:

      1. report paint timingdocument"first-contentful-paint"paintTimingInfo で呼び出す。

      注: 親フレームは子iframeのペイントイベントを認識せず、逆も同様です。つまりiframeのみを含むフレームでは(iframeの外枠ボックスにより)first paint は起きても、first contentful paint は起きません。

      注: document"first-paint""first-contentful-paint" を必ずマークするとは限りません。完全に空白な documentfirst paint をマークしないことがあり、 非contentful要素のみを含むドキュメントも first contentful paint をマークしないことがある。

      注: first paint のマークは任意です。paint timing を実装するユーザーエージェントは最低でも first contentful paint をマークすべきです。

    3. report largest contentful paintdocumentpaintTimingInfopaintedImagespaintedTextNodes で呼び出す。

    4. report element timingdocumentpaintTimingInfopaintedImagespaintedTextNodes で呼び出す。

    5. もし frameTimingInfo が null でない場合、queue a long animation frame entrydocumentframeTimingInfopaintTimingInfo で呼び出す。

  11. ユーザーエージェントが実装依存の presentation time をサポートしない場合は flushPaintTimings を呼び出して return する。

  12. 次の手順を並列で実行:

    1. 現在のフレームがユーザーにpresentationされたタイミングで実装依存の適切な時刻まで待つ。

    2. paintTimingInfo実装依存のプレゼンテーション時刻document関連グローバルオブジェクトでの current high resolution time で設定する。

    3. documentcross-origin isolated capability が false の場合:

      1. paintTimingInfo実装依存のプレゼンテーション時刻 を4ミリ秒の倍数またはそれ以上粗視化した値にする。

      2. current high resolution time の値が paintTimingInfo実装依存のプレゼンテーション時刻 になるまで待つ。

    4. グローバルタスクをキューし、performance timeline task source にて 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ペイントタイミングのために露出されているかどうか判定するには、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.2025年11月6日.WD.URL: https://www.w3.org/TR/css-display-4/
[CSS-FONTS-4]
Chris Lilley. CSS Fonts Module Level 4.2026年3月3日.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/
[CSS2]
Bert Bos; 他. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification.2011年6月7日.REC.URL: https://www.w3.org/TR/CSS2/
[CSSOM-VIEW-1]
Simon Fraser; Emilio Cobos Álvarez. CSSOM View Module.2025年9月16日.WD.URL: https://www.w3.org/TR/cssom-view-1/
[DOM]
Anne van Kesteren. DOM Standard.Living Standard. URL: https://dom.spec.whatwg.org/
[ELEMENT-TIMING]
Element Timing API.Editor's Draft.URL: https://w3c.github.io/element-timing/
[HR-TIME-3]
Yoav Weiss. High Resolution Time.2026年3月2日. WD.URL: https://www.w3.org/TR/hr-time-3/
[HTML]
Anne van Kesteren; 他. 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/
[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.2026年1月22日.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.Living Standard.URL: https://webidl.spec.whatwg.org/

情報参考文献

[EVENT-TIMING]
Michal Mocny.Event Timing API.2026年3月19日.WD.URL: https://www.w3.org/TR/event-timing/
[LARGEST-CONTENTFUL-PAINT]
Yoav Weiss.Largest Contentful Paint.2026年3月19日.WD.URL: https://www.w3.org/TR/largest-contentful-paint/
[LONG-ANIMATION-FRAMES]
Long Animation Frames API.Editor's Draft.URL: https://w3c.github.io/long-animation-frames/
[URL]
Anne van Kesteren.URL Standard.Living Standard.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?