遅延読み込み

画像とiframeの遅延読み込みがCore Web Vitalsを改善する仕組み、loading属性、ファーストビューの遅延読み込みのSEOリスク、そしてGooglebotが遅延コンテンツをレンダリングする方法。

初回公開:2026年7月2日 · 最終更新:2026年8月21日 · Advanced
言語

遅延読み込みは、画面外の画像とiframeをスクロールで表示されるまで延期し、初期ページの重さを削減してCore Web Vitalsを改善します。ネイティブな方法は、<img>と<iframe>にloading="lazy"属性を付けることです。JavaScriptは不要です。大きな間違いは、ヒーロー画像やLCP画像を遅延読み込みすることであり、Largest Contentful Paintを遅延させます。Googlebotはスクロールやクリックをしないため、スクロールやクリックイベントの背後にあるものは見られない可能性があります。これは直接のランキング要因ではなく、Core Web Vitalsとクロール可能性を通じて影響します。Search ConsoleのURL検査ツールで実際にレンダリングされるものを確認してください。画像URLはレンダリングされたHTMLのsrc属性にあるべきです。

TL;DR — 遅延読み込みは、画面外の画像とiframeがビューポートに近づくまで読み込みを延期し、初期転送量(LCPの改善に有効)と読み込み開始時のメインスレッド処理(INPの改善に有効)を減らします。<img>/<iframe> のネイティブな loading="lazy" 属性は、ほとんどのJSライブラリに取って代わりました。意味のある値は lazyeager のみです(auto は非推奨)。避けるべきなのは、LCP候補やファーストビューの画像を遅延読み込みしてLCP自体を遅らせることと、コンテンツをスクロールやクリックの操作後にしか読み込めないようにすることです。Googlebotはページを操作しないため、こうしたイベントを発生させません。遅延読み込みは直接のランキング要因ではなく、Core Web Vitalsとクロール可能性を介して影響します。Search ConsoleのURL検査ツールで、画像URLがレンダリング後のHTMLの src 属性に入っていることを確認してください。

遅延読み込みが実際に行うこと

考え方はシンプルです。すべてを一度に読み込むのではなく、必要なときにだけリソースを読み込むことです。メディアが多いページでは、すべての画像と埋め込みを事前にダウンロードすると、訪問者がスクロールして見ることもないかもしれないものを取得するためにブラウザが忙しくなり、帯域幅、メモリ、バッテリーを無駄に消費します。画面外のものを延期することで、ファーストビューのコンテンツをより早く描画できます。Martin Splitt氏は、Googleの Search Off the Record エピソード「Lazy loading demystified」 でまさにこの点を指摘しています。目標は、何も生み出さない作業を避けることです。ページがなくても問題ない重要でない画像は、ブラウザを占有し続けるだけだからです。

これは、多くの人が追い求めているCore Web Vitalsにつながります。ネットワークをめぐって最初に競合するバイト数が少なければ、Largest Contentful Paint要素をより早くレンダリングできます。iframe(広告、ソーシャルウィジェット、コメントセクション、マップ)の場合、それらを遅延させることで、起動時のメインスレッドの作業も削減され、これはLCPだけでなくInteraction to Next Paintの改善にもなります。Google自身のweb.devガイダンスでは、遅延読み込みのiframeをページ読み込み中のINP改善として位置づけています。

ネイティブ vs. JavaScript駆動の遅延読み込み

数年前にブラウザが画像とiframe向けのネイティブなloading属性へ対応し、JavaScript APIを組み込まなくても処理をブラウザに任せられるようになりました。Ahrefsの私のJavaScript SEOガイド でも同じ変化を取り上げています。私がその記事を最初に書いて以降、遅延読み込みの中心はJavaScriptによる制御からブラウザのネイティブ処理へ移りました。JSで制御する実装もまだあり、画像だけなら通常は問題ありません。私が確認するのは、画像だけでなく実際のコンテンツまで遅延読み込みしていないかです。そうした実装では、コンテンツが適切に認識されないことがあるためです。

ネイティブ版:

<!-- Below-the-fold image: defer it -->
<img src="gallery-07.jpg" loading="lazy" width="800" height="600" alt="…">

<!-- Off-screen embed: defer it -->
<iframe src="https://www.youtube.com/embed/…" loading="lazy" title="…"></iframe>

遅延画像には常に明示的なwidth/height(またはアスペクト比)を設定して、画像が読み込まれる前にブラウザがスペースを確保するようにしてください。これが遅延画像における最大のレイアウトシフトのリスクです。ただし、予約済みの寸法はCLSの絶対的な保証ではありません。周囲のレイアウトやレスポンシブなクロップが画像の読み込み後にまだ変更される場合、シフトが発生する可能性があります。固定された寸法だけで解決すると想定せず、実際のレイアウトシフトのトレースで確認してください。

遅延読み込みとiframeにはもう1つの区別が必要です。<iframe>loading="lazy"は、埋め込みのフェッチと作成が行われるタイミングを遅らせるだけです。title、フォーカス動作、sandboxallow/権限ポリシー、referrerpolicy、同意処理、または寸法を設定するわけではありません。これらはそれぞれ独自の注意が必要であり、埋め込みは読み込み可能になると(スクリプト、トラッキングピクセル、レイアウトなどの)作業を続けることができます。また、「フォールドの下」がどこでも同じように動作するとは想定しないでください。display: noneコンテンツ、画面外のカルーセルスライド、変換された要素、ネストされたスクロールコンテナは、プレーンなフォールド下の要素とは異なる方法でビューポートと交差する可能性があるため、同等性を想定せずに実際のレイアウトとナビゲーションコントロールをテストしてください。

loading属性の値

今日重要となる値は2つだけです:

  • loading="lazy" — リソースがビューポートに近づくまで遅延させます。
  • loading="eager" — すぐに読み込みます。これがデフォルトの動作です。フォールド上の画像について明示するために使用します。
Evidence for this claim The native loading attribute supports lazy loading for images and iframes without a JavaScript lazy-loading library. Scope: Browser-level lazy loading behavior; browser heuristics decide the fetch distance. Confidence: high · Verified: web.dev: Browser-level image lazy loading

古い記事ではloading="auto"を見かけるかもしれませんが、Chromeでは非推奨なので、使用しないでください。その必要はありません。属性を省略すれば、すでにデフォルト(eager)の動作が得られます。

「近い」とはどのくらい近いのでしょうか?loading="lazy"はヒントであり、実装者が距離を制御できる保証ではありません。仕様では、実際のビューポート近接の判定をブラウザに委ねています。Chromiumは、ユーザーがスクロールして到達するまでに表示準備が整うよう、遅延リソースを十分早く取得しようとします。トリガー距離はブラウザ、接続速度、リソースの種類によって異なり、ブラウザやバージョンをまたいで依存したり再現したりできる固定ピクセル値ではありません。「ビューポートのNピクセル手前で読み込む」といった特定の数値を公開したり信頼したりしないでください。ビューポート近傍の範囲は実装依存として扱い、定数を仮定せず、対象のブラウザと接続条件でNetworkトレースを取り、実際の動作を確認してください。

ネイティブの遅延読み込みは、レスポンシブ画像とも問題なく動作します。通常の srcsrcset/sizes の選択にも適用されるため、loading="lazy" を追加しても レスポンシブ画像の動作が失われることはありません。代わりに、実際のURLを data-* 属性にのみ隠して 後でスクリプトに差し替えさせる場合、読み込みはそのスクリプトに依存するようになります。レンダリングされた HTMLと、スクリプトが失敗した場合の挙動をテストしてください(詳細は「スクリプト」および 「トラブルシューティング」タブを参照)。

Evidence for this claim Native lazy loading works with ordinary src and responsive srcset/sizes selection; hiding the real URL only in data-* attributes makes loading dependent on script and should be tested in rendered HTML and under script failure. Scope: responsive image fetching and layout Confidence: high · Verified: HTML Standard: img

最大の間違い:LCP / ファーストビュー画像の遅延読み込み

これは私が最もよく目にする失敗で、参照した情報源の見解も一致しています。ヒーロー画像やLCP要素になり得る画像を遅延読み込みすると、体感速度を左右する最も重要なピクセルをブラウザに待たせることになります。また、ブラウザは画像がページ上のどこに配置されるかを把握するまで遅延読み込みできないため、ファーストビューの遅延画像は、即時読み込みする画像よりも遅く表示される傾向があります。これはLargest Contentful Paintを直接遅らせます。GoogleはLCPを読み込み開始から2秒半以内に表示する ことを目標としています。

Do not lazy-load the observed or likely LCP image; confirm the actual request and paint timing in a trace. 出典: Lazy Loading

The eager path discovers the likely LCP image in HTML and starts its request promptly. The lazy path waits for browser loading heuristics before request start. The comparison uses no fixed timing values and notes that actual LCP must be measured.

© Patrick Stox LLC · CC BY 4.0 ·

Splitt氏はSOTRエピソードでその逆を明確に述べています。遅延読み込みを使うべき場面で使っていない場合、それはおそらくCore Web Vitalsの何らかの側面(おそらくLCP)を損なうでしょう。つまり、これは両刃の剣です。ルールは次の通りです:

  • 可能性が高い、または観測されたLCP候補 → 即時読み込み(loading="lazy" を省略するか、eager を設定)。LCP画像には fetchpriority="high" を検討してください。
  • ファーストビュー外 → loading="lazy"

ファーストビュー上のすべての画像がLCP候補であるとは限りません。実際のLCP要素を特定し(PerformanceトレースやPageSpeed Insightsで特定できます)、すべてのファーストビュー画像を同じように扱うのではなく、そのリクエストのタイミングを確認してください。また、これらは別々のヒントであり、1つの設定ではありません。loading="eager"(または loading を省略)は、ブラウザがリソースの発見を遅延させないという意味だけで、それ自体がフェッチの優先度を上げるわけではありません。fetchpriority はその上に重ねる、別個のアドバイザリーヒントです。同じリソースに <link rel="preload">loading="lazy" を併用すると、ブラウザに矛盾した意図を送ることになるため、組み合わせが期待通りに動作すると想定するのではなく、実際のネットワークウォーターフォールを確認してください。

包括的なアンチパターンは、サイト全体のすべての画像に対して遅延読み込みを有効にすることです。これは一般的なCMSのデフォルト設定です。Splitt氏が指摘したように、すべての画像が遅延読み込みされると、すぐに表示される(または表示されるべき)画像も遅延読み込みされることになり、これはまさに避けたいケースです。

Googlebotが遅延読み込みコンテンツをレンダリングする仕組み

ここで見落とされやすいクロール上の事実があります。Googlebotはスクロールもクリックもしません。 ヘッドレスブラウザでページをレンダリングしますが、ユーザー操作までは再現しません。Googleもこれを明記しています。Google検索はページを操作しない ため、Googleが推奨する遅延読み込み方法は、スクロールやクリックなどのユーザー操作に依存しません。

Evidence for this claim Google Search does not scroll or click to trigger lazy-loaded content, so implementations should not depend on user interaction and should expose resource URLs in rendered HTML. Scope: Google Search guidance for JavaScript-driven lazy loading. Confidence: high · Verified: Google Search Central: Lazy-load content

だからこそ、実装の方法が重要です。Googleのドキュメントには、安全と見なされる3つの実装が記載されています:画像とiframe用のブラウザ組み込みの遅延読み込み、IntersectionObserver API(ポリフィル付き)、またはビューポートに入る際にデータを読み込むJavaScriptライブラリです。これら3つはすべてビューポートとの交差に基づいており、Googlebotが決して発生させないスクロールやクリックイベントには依存していません。

高リスクのパターンは、カスタムまたはサードパーティ製のJS遅延読み込みライブラリです。ライブラリが誤動作し、画像URLがsrc属性に入らなければ、Googleはその画像を取得できません。Splitt氏はSOTRのエピソードで、まさにこの失敗例を説明しました。URLがなければ、インデックスに登録する対象もありません。これは私のJavaScript SEOガイド で指摘していることと同じです。画像の遅延読み込みは通常問題ありませんが、コンテンツそのものを遅延読み込みするとインデックス登録の問題が起きやすくなります。Googleが実際にレンダリングした内容を確認することが対処法です。

無限スクロールは別の問題です

基本的な画像/iframeの遅延読み込みを無限スクロールやページネーション読み込みと混同しないでください。画像の遅延読み込みは一つのことですが、ユーザーがスクロールするにつれて新しいコンテンツのチャンクを読み込むことは別のことであり、独自のアーキテクチャが必要です。Googleのガイダンス:各チャンクに永続的で一意なURLを割り当て、URLごとにコンテンツを安定させ(?date=yesterdayのような相対値ではなく、?page=12のような絶対ページ番号を使用)、各チャンクが主要な表示コンテンツになるにつれてHistory APIで表示URLを更新して、リフレッシュ、共有、リンクができるようにします。これを省略すると、無限スクロールの背後にあるより深いコンテンツが確実にクロールまたはインデックスされない可能性があります。

テスト方法

検証方法はGoogleのドキュメントと私自身の方法論で同じです:Search ConsoleのURL検査ツールを使用し、レンダリングされたHTMLを確認します。画像(または動画)のURLがそのレンダリングされたHTMLの<img>/<video>要素のsrc属性に表示されていれば、設定は機能しています。Googleはこれを明言しています — check the rendered HTML to make sure your content is in it (翻訳)「レンダリングされたHTMLを確認し、コンテンツが含まれていることを確かめてください」。URLがsrcにない場合、それが問題であり、通常はスクロール/クリックトリガーまたは壊れたライブラリに起因します。

遅延読み込みされる商品グリッドでは、この存在チェックだけで終わらせないでください。無限スクロールSEOテストマトリックスに沿って、標準と縦長のビューポート、新規ナビゲーションと読み込み後のリサイズ、操作なしと段階的スクロール、一意な商品リンク数、アクセシビリティツリーをそれぞれ検査します。初期化済みページのリサイズは、最終的なビューポートサイズで新規ナビゲーションする場合と同等ではありません。オブザーバーやバッチ計算が起動時にしか登録されないことがあるためです。 Evidence for this claim Google Search does not scroll or click to trigger lazy-loaded content, so implementations should not depend on user interaction and should expose resource URLs in rendered HTML. Scope: Google Search guidance for JavaScript-driven lazy loading. Confidence: high · Verified: Google Search Central: Lazy-load content

ウェブパフォーマンスツールも活用できます。PageSpeed Insightsは、遅延読み込みすべき画面外画像を検出します。Ahrefsの私のPageSpeed Insightsガイド では、「オフスクリーン要素を遅延読み込みする」監査が画像の遅延読み込みを促していると説明しています。普段使っている診断結果を修正へ結び付けるのに便利です。

ランキングシグナルに関する正直さ

遅延読み込みが何であり、何でないかを明確にしてください。それを使用することは直接のランキング要因ではなく、使用しないことはペナルティでもありません。ランキングとの関連は間接的です:Core Web Vitals(主にLCP、iframeの場合はINP)とクロール可能性を通じて流れます。悪い実装がコンテンツを隠す場合です。Splitt氏は、Core Web Vitalsを通じたランキング効果をほとんどの場合、微小な要因と特徴付けました。したがって、ユーザーの読み込み体験とクリーンなインデックスのために遅延読み込みを最適化してください — 属性自体からのランキング向上を期待するからではありません。

位置づけ

遅延読み込みは、より広いウェブパフォーマンスツールキットの1つのレバーです。リソースヒント(早期に必要なリソースのプリロード/プリコネクト)、フォント読み込み戦略、キャッシュCDNと組み合わせて使用され、最終的にはCore Web Vitalsを通じて評価されます。above-the-fold/below-the-foldの分割を正しく行えば、利用可能な最も安価な勝利の1つです。

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.