サイト速度を向上!jQueryで画像を先読み(プリロード)する効果的な方法

この記事は約9分で読めます。

まずは、画像先読み方法を。

基本的な画像プリロード

$(function() {
  var img = new Image();
  img.src = "path/to/your/image.jpg"; // プリロードする画像のパス
});

このコードは、Imageオブジェクトを生成し、src属性に画像のパスを設定することで、画像をプリロードします。
プリロードが正しく行われているかを確認するには、ブラウザの開発者ツールを使用します。

1. 開発者ツールを開く: ChromeならF12キー、FirefoxならCtrl+Shift+Iキーを押します。
2. ネットワークタブを開く: 開発者ツールのネットワークタブを開きます。
3. プリロード対象の画像を確認: ページをリロードし、ネットワークタブにプリロード対象の画像が表示されているか確認します。画像が表示されていれば、プリロードが成功しています。

プリロードのメリット

その他ページのトップ画像などを先読みさせておくと、ページ遷移時にスムーズな挙動を実現できます。
表示速度の向上: 画像が事前に読み込まれているため、ユーザーが画像を閲覧する際に、読み込み時間を短縮できます。
スムーズなユーザー体験: 画像の読み込み遅延によるストレスを軽減し、スムーズなユーザー体験を提供できます。

プリロードの注意点

過度なプリロード: すべての画像をプリロードする必要はありません。特に、初期表示に必要な画像や、ユーザーが閲覧する可能性が高い画像に絞りましょう。
ネットワーク負荷: プリロードは、ネットワーク負荷を増加させる可能性があります。画像のサイズや数を適切に調整しましょう。

複数の画像をプリロード

$(function() { // プリロードする画像のパスを配列に格納
  var images = [ // プリロードする画像のパスの配列
    "path/to/image1.jpg",
    "path/to/image2.png",
    "path/to/image3.gif"
  ];

  // 配列に格納された画像のパスを順番に処理
  for (var i = 0; i < images.length; i++) {
    var img = new Image(); // 新しいImageオブジェクトを生成
    img.src = images[i]; // Imageオブジェクトのsrc属性に画像のパスを設定し、プリロードを開始
  }
});

このコードは、画像のパスを配列に格納し、ループ処理で複数の画像をプリロードします。

プリロード完了時の処理

$(function() {
  // Imageオブジェクトを生成し、画像をプリロードする
  var img = new Image();
  // 画像のロードが完了した時の処理を定義
  img.onload = function() { // コンソールにプリロード完了メッセージと画像のパスを出力
    console.log("画像のプリロードが完了しました: " + img.src);
    // プリロード完了後の処理を記述
  };

  // Imageオブジェクトのsrc属性に画像のパスを設定し、プリロードを開始
  img.src = "path/to/your/image.jpg";
});

onloadイベントを使用することで、画像のプリロード完了時に特定の処理を実行できます。

プリロードの進捗状況を表示

$(function() {
  // Imageオブジェクトを生成し、画像をプリロードする
  var img = new Image();
  img.onload = function() { // 画像のロードが完了した時の処理を定義
    // プリロード完了時に進捗状況を100%に設定
    $("#progress").text("100%");
  };

  // 画像のロード中に進捗状況を更新するイベントリスナーを追加
  img.addEventListener("progress", function(e) {
    // ロード可能なデータサイズが計算できる場合
    if (e.lengthComputable) {
      // ロード済みのデータサイズと全体のデータサイズから進捗率を計算
      var percent = (e.loaded / e.total) * 100;
      // 進捗率を#progress要素に表示
      $("#progress").text(percent + "%");
    }
  });

  // Imageオブジェクトのsrc属性に画像のパスを設定し、プリロードを開始
  img.src = "path/to/your/image.jpg";
});

progressイベントを使用することで、画像の読み込み進捗状況を取得し、表示できます。

遅延読み込みとの組み合わせ

$(function() {
  // 初期表示時に遅延読み込みを実行
  $("img.lazy").each(function() {
    // 現在のimg要素をjQueryオブジェクトとして取得
    var $this = $(this);
    // data-src属性から画像のパスを取得
    var src = $this.data("src");
    if (isElementInViewport($this[0])) { // 要素がビューポート内にあるか確認
      // 画像のsrc属性をdata-src属性の値に設定し、lazyクラスを削除
      $this.attr("src", src).removeClass("lazy");
    }
  });

  // ウィンドウのスクロールまたはリサイズ時に遅延読み込みを実行
  $(window).on("scroll resize", function() {
    $("img.lazy").each(function() {
      var $this = $(this);
      var src = $this.data("src");
      if (isElementInViewport($this[0])) {
        $this.attr("src", src).removeClass("lazy");
      }
    });
  });

  // 要素がビューポート内にあるかを判定する関数
  function isElementInViewport(el) {
    // 要素のgetBoundingClientRect()メソッドで要素の位置情報を取得
    var rect = el.getBoundingClientRect();
    return ( // 要素がビューポート内にあるかを判定し、結果を返す
      rect.top >= 0;
      rect.left >= 0;
      rect.bottom <= (window.innerHeight || document.documentElement.clientHeight);
      rect.right <= (window.innerWidth || document.documentElement.clientWidth)
    );
  }
});

このコードは、lazyクラスを持つ<img>タグを遅延読み込みします。data-src属性に画像のパスを設定し、スクロールして表示領域に入った時点でsrc属性に設定します。

レスポンシブイメージへの対応

<picture>
  <source srcset="small.jpg 480w, large.jpg 1024w" sizes="100vw">
  <img src="fallback.jpg" alt="レスポンシブイメージ">
</picture>
<script>
$(function() {
  // <picture>要素内の<source>要素をすべて取得
  var sources = $("picture source");
  // 各<source>要素に対して処理を実行
  sources.each(function() {
    // srcset属性の値をカンマ区切りで分割し、画像のパスと幅の配列を取得
    var source = $(this).attr("srcset").split(", ");
    // 分割された画像のパスと幅の配列をループ処理
    for (var i = 0; i < source.length; i++) {
      // 各画像のパスを取得(幅の情報は不要なので、スペースで分割して最初の要素を取得)
      var img = new Image();
      // 新しいImageオブジェクトを生成し、画像のパスを設定してプリロード
      img.src = source[i].split(" ")[0];
    }
  });
});
</script>

要素とsrcset属性を使用することで、レスポンシブイメージに対応したプリロードが可能です。

エラーハンドリング

$(function() {
  // Imageオブジェクトを生成し、画像をプリロードする
  var img = new Image();
  // 画像のロードが完了した時の処理を定義
  img.onload = function() {
    // コンソールにプリロード完了メッセージを出力
    console.log("画像のプリロードが完了しました。");
  };
  // 画像のロードに失敗した時の処理を定義
  img.onerror = function() {
    // コンソールにプリロード失敗メッセージと画像のパスを出力
    console.error("画像のプリロードに失敗しました: " + img.src);
    // 代替画像のパスを設定し、代替画像を表示
    this.src = "path/to/fallback.jpg"; // 代替画像を表示
  };
  // Imageオブジェクトのsrc属性に画像のパスを設定し、プリロードを開始
  img.src = "path/to/your/image.jpg";
});

onerrorイベントを使用することで、画像の読み込みに失敗した場合に代替画像を表示したり、エラーメッセージを表示したりできます。
これらのコード例は、画像プリロードの実装方法の一部です。実際のサイトに合わせて、これらのコードを参考に、より高度なプリロードを実装してください。

コメント

タイトルとURLをコピーしました