Chromeがネイティブlazy-loadをサポート、JSなしで画像を遅延読み込み可能に

[レベル: 上級]

Google Chrome 76 がネイティブ lazy-load をサポートするようになりました。
JavaScript のライブラリを利用することなく、ブラウザの標準機能として画像の遅延読み込みが可能になります。

ネイティブ lazy-load は開発版 Chrome (Canary) で試験運用されていました。

自動で遅延読み込み

次の動画は子猫の画像だけを掲載したデモ用ページをスクロールした様子です。
デベロッパーツールの Network パネルで見ると、スクロールに応じて画像が順に読み込まれているのがわかります。

この遅延読み込みは JavaScript で実装しているわけではなく、Chrome の標準機能として実装された lazy-load の機能で実現しています。

loading 属性でネイティブ lazy-load

ネイティブ lazy-load を利用するには、 <img> タグに loading 属性を追加します。
<iframe> タグでも loading 属性は機能します。

3種類の値を loading 属性に設定できます。

  • loading="lazy": lazy は lazy-load を必ず適用させます。Viewport(スクリーンに見えるエリア)に画像が近づくと画像を読み込みます
  • loading="eager": eager は lazy-load を適用せずに、ページのロードと同時にコンテンツを読み込みます
  • loading="auto": auto は lazy-load するかどうかの判断をブラウザに任せます。

loading 属性の値が設定されていないとき (loading 属性だけのとき) は、loading="auto" が適用されます。

全体のコード例です。

<img src="lazy-cat.png" loading="lazy" alt="かわいいネコ" height="700" width="1200" />

SEO に与える影響は?

SEO に与える影響を気にかける人がいるかもしれません。

影響はありません。

loading 属性をサポートしないブラウザ(Chrome 以外や Chrome 75 以下)は、loading 属性を無視し、単なる img タグとして扱います。
画像の表示に悪影響を与えることはありません。

Googlebot がサポートするかどうかも関係ありません。
IntersectionObserver を実装して lazy-load を構成してる場合と同様に、(非常に高い)Viewport に収まる画像を Googlebot は一度に取得します。
Googlebot にはスクロールという概念がないので、lazy-load という動きがそもそも存在しません。
通常の画像としてクロール・インデックスします。

ネイティブ lazy-load が SEO に影響を与えるとしたら、Chrome ユーザーの実際のパフォーマンスデータを用いる CrUX のレポートデータが改善する可能性があることでしょうか(改善したとしたら良い影響ですね)。

Chrome 以外のブラウザが loading 属性をサポートするようになったら、JavaScript での実装が不要になります。
Google 以外のブラウザベンダーがサポートすることを期待し、Chrome でのネイティブ lazy-load を当面は活用しましょう。