First Contentful Paint(FCP)

対応ブラウザ

  • Chrome: 60。
  • Edge: 79.
  • Firefox: 84。
  • Safari: 14.1。

ソース

FCP とは

First Contentful Paint(FCP)は、ユーザーが最初にページに移動してから、ページのコンテンツの一部が画面に表示されるまでの時間を測定します。この指標の「コンテンツ」とは、テキスト、画像(背景画像を含む)、<svg> 要素、白以外の <canvas> 要素のことです。

google.com の FCP タイムライン
この読み込みタイムラインでは、FCP は 2 番目のフレームで発生します。これは、最初のテキスト要素と画像要素が画面にレンダリングされるタイミングであるためです。

上の画像に示されている読み込みタイムラインでは、FCP は 2 番目のフレームで発生します。このとき、最初のテキストと画像要素が画面にレンダリングされます。

一部のコンテンツはレンダリングされていますが、すべてがレンダリングされているわけではありません。この点が、First Contentful Paint と Largest Contentful Paint(LCP)の重要な違いです。LCP はページのメイン コンテンツの読み込みが完了したタイミングを測定することを目的としています。

適切な FCP スコアとは

優れたユーザー エクスペリエンスを提供するため、サイトは First Contentful Paint を 1.8 秒以下にする必要があります。ほとんどのユーザーに対してこの目標値を確実に達成するには、モバイル デバイスとデスクトップ デバイスで分けたページ読み込みの 75 パーセンタイルをしきい値として測定することをおすすめします。

FCP の良好な値は 1.8 秒以下で、低い値は 3.0 秒を上回っており、その中間値は改善が必要です。
適切な FCP 値は 1.8 秒以下です。低速な値は 3.0 秒を超えます

FCP を測定する方法

FCP は、ラボまたは現場で測定でき、以下のツールで利用できます。

フィールド ツール

ラボツール

JavaScript で FCP を測定する

JavaScript で FCP を測定するには、Paint Timing API を使用します。次の例は、first-contentful-paint という名前の paint エントリをリッスンし、コンソールにログに記録する PerformanceObserver を作成する方法を示しています。

new PerformanceObserver((entryList) => {
  for (const entry of entryList.getEntriesByName('first-contentful-paint')) {
    console.log('FCP candidate:', entry.startTime, entry);
  }
}).observe({type: 'paint', buffered: true});

前のコード スニペットでは、ログに記録された first-contentful-paint エントリから、最初のコンテンツ要素がいつ描画されたかがわかります。ただし、このエントリは FCP の測定に有効でない場合もあります。

次のセクションでは、API が報告する内容と指標の計算方法の違いについて説明します。

指標と API の違い

  • API は、バックグラウンド タブで読み込まれたページに対して first-contentful-paint エントリをディスパッチしますが、FCP の計算時にはこれらのページを無視する必要があります(First Paint のタイミングは、ページがずっとフォアグラウンドにあった場合のみ考慮する必要があります)。
  • ページがバックフォワード キャッシュから復元された場合、API は first-contentful-paint エントリを報告しませんが、このようなケースでは、ユーザーが個別のページ訪問として認識されるため、FCP を測定する必要があります。
  • API はクロスオリジンの iframe からのペイント タイミングを報告しない場合がありますが、FCP を適切に測定するには、すべてのフレームを考慮する必要があります。サブフレームは API を使用して、集約のためにペイントのタイミングを親フレームに報告できます。
  • API はナビゲーション開始から FCP を測定しますが、事前レンダリングされたページの場合は、ユーザーが認識する FCP 時間に対応するため、activationStart から FCP を測定する必要があります。

このような微妙な違いをすべて覚えておくのではなく、web-vitals JavaScript ライブラリを使用して FCP を測定すると、これらの違いが自動的に処理されます(可能であれば。iframe の問題は対象外です)。

import {onFCP} from 'web-vitals';

// Measure and log FCP as soon as it's available.
onFCP(console.log);

JavaScript で FCP を測定する方法の完全な例については、onFCP() のソースコードをご覧ください。

FCP を改善する方法

特定のサイトの FCP を改善する方法については、Lighthouse パフォーマンス監査を実行し、監査で提案される特定の最適化案診断結果に注目してください。

サイトを問わず FCP 全般を改善する方法については、次のパフォーマンス ガイドをご覧ください。

変更履歴

指標の測定に使用される API でバグが見つかることがありますが、指標自体の定義に見つかることもあります。そのため、変更が必要となることがあり、こうした変更は社内のレポートやダッシュボードに改善や回帰として表示されることがあります。

管理しやすくするために、これらの指標の実装または定義に対するすべての変更は、こちらの変更履歴で確認できます。

これらの指標についてフィードバックがある場合は、web-vitals-feedback Google グループからお寄せください。