Intersection Observerを使った遅延読み込みを実装してみます。
対応ブラウザ
対応ブラウザはこちら。
IE以外の主要なブラウザで使用できるようです。
サンプルコード
まずHTMLですが、遅延読み込み対象の画像にlazyを追加して、画像のパスはsrcではなくdata属性のdata-srcに設定する形にします。
<div><img class="lazy" src="" data-src="https://via.placeholder.com/300"></div> <div><img class="lazy" src="" data-src="https://via.placeholder.com/400"></div> <div><img class="lazy" src="" data-src="https://via.placeholder.com/500"></div> <div><img class="lazy" src="" data-src="https://via.placeholder.com/600"></div> <div><img class="lazy" src="" data-src="https://via.placeholder.com/700"></div> <div><img class="lazy" src="" data-src="https://via.placeholder.com/800"></div> <div><img class="lazy" src="" data-src="https://via.placeholder.com/900"></div> <div><img class="lazy" src="" data-src="https://via.placeholder.com/1000"></div>
次にJavaScriptです。
Intersection Observerで.lazyを監視して、対象がビューポートに入ったタイミングでdata-srcのパスをsrcに設定するようにしています。
document.addEventListener("DOMContentLoaded", function() { // 遅延読み込みの画像(.lazy)を取得 var lazyImages = [].slice.call(document.querySelectorAll("img.lazy")); // Intersection Observerに対応しているかどうか if("IntersectionObserver" in window) { // Intersection Observerのオブジェクトを生成 var lazyImageObserver = new IntersectionObserver(function(entries, observer) { entries.forEach(function(entry) { // 対象画像がビューポートに入った時 if (entry.isIntersecting) { var lazyImage = entry.target; // 対象画像のsrcをdata-srcの内容に変更 lazyImage.src = lazyImage.dataset.src; // 対象画像の.lazyを削除 lazyImage.classList.remove("lazy"); // 対象画像を監視から外す lazyImageObserver.unobserve(lazyImage); } }); }); // 遅延読み込みの各画像の監視を実行 lazyImages.forEach(function(lazyImage) { lazyImageObserver.observe(lazyImage); }); // Intersection Observerに対応していない場合 } else { // 対象画像のsrcをdata-srcの内容に変更 for (var i = 0; i < lazyImages.length; i++) { lazyImages[i].src = lazyImages[i].dataset.src; } } });
これで遅延読み込みの実装ができました。
画像の遅延読み込みのデモページ
Intersection Observerに対応していない場合は遅延読み込みしないようにしています。
GooglebotはIntersection Observerをサポートしているので、遅延読み込み対象の画像も認識されるようです。
コメントが承認されるまで時間がかかります。