【JS】素のJSでシンプルなlazyload(画像の遅延読み込み)を実装

JSだけでLazyload実装
  • URLをコピーしました!
目次(クリックでジャンプ)

素のJSだけでシンプルなlazyloadを実装する

CDNやlazyloadのプラグインを読み込むのが面倒でしたのでJSのみで実装しました。

  • ページ内リンク等にも対応(ページの高さ計算に支障なし)
  • lazyloadクラス&data-src属性を使うのみで簡単
  • 少ないコードで実装可能
  • Webpやpictureタグにも対応

JavaScript(JS)

// 画面のスクロールを監視して、遅延読み込みを行う関数
document.addEventListener("DOMContentLoaded", function() {
    const lazyImages = document.querySelectorAll('img.lazyload');

    // プレースホルダーの高さを設定
    lazyImages.forEach(image => {
        const tempImage = new Image();
        tempImage.src = image.dataset.src;

        tempImage.onload = function() {
            const width = tempImage.width;
            const height = tempImage.height;
            const aspectRatio = height / width;

            // 画像のアスペクト比に基づいて高さを設定
            image.style.height = `${image.clientWidth * aspectRatio}px`;
        };
    });

    function lazyLoadImages() {
        const windowHeight = window.innerHeight;

        lazyImages.forEach(image => {
            const rect = image.getBoundingClientRect();
            if (rect.top < windowHeight && rect.bottom > 0) {
                image.src = image.dataset.src;
                image.onload = function() {
                    image.classList.remove('lazyload');
                    image.classList.add('lazyloaded');
                    // 読み込み後に高さの自動設定を解除
                    image.style.height = 'auto';
                };
            }
        });
    }

    window.addEventListener('load', lazyLoadImages);
    window.addEventListener('scroll', lazyLoadImages);
    window.addEventListener('resize', lazyLoadImages);
});

HTML

//通常のjpgやpngの場合
<img class="lazyload" data-src="ここに画像URL" alt="">

//WebPの場合
<picture>
   <source class="lazyload" data-srcset="ここにWEBP画像URL" type="image/webp">
   <img class="lazyload" data-src="ここに画像URL" alt="">
</picture>

lazyloadさせたい要素は、「data-src属性へ画像パスを記述」+「lazyloadクラスを付ける」をセットで行ってください。
トップビジュアルなどをlazyloadさせると、レイアウトシフト等の原因となりますので、あまり好ましくないと思います。

CSS

.lazyload {
  display: block;
  width: 100%;
  height: auto;
  background: #f0f0f0;
}
.lazyloaded {
  display: unset;
  width: inherit;
  height: inherit;
  background: none;
}

予め画像の高さ計算をただしく行う為のCSSです。出来るだけCSSファイルの上部へ配置してください。

素のJSだけでシンプルなlazyloadを実装する まとめ

こちらで簡単にlazyloadが適用されます。
サイト全体の軽量化となり良いですね。

おすすめのフリーランス向け求人・案件探しサービス

高単価案件、週3日~などフレキシブルな働きが可能な事が特徴の転職サービスです。案件をチェックするだけであれば無料の為、エンジニアやデザイナーの方は是非登録してみてください。

4275件と案件数豊富です(2024年4月現在)
JSだけでLazyload実装

この記事が気に入ったら
フォローしてね!

役に立った!と思ったらシェアお願いします
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

フリーランスのWebデザイナー「Kizineko」です。Webサイトのデザイン~コーディング、簡易的なプログラム実装等、Web制作に係る広くに携わっております。当ブログでは日々のメモ帳として便利なコードなどを共有しております。

目次(クリックでジャンプ)