ユーザーが画像をスクロールして表示するときに、動的に(または遅延して)画像を読み込む方法


97

私は、これが多数の「モダン」ウェブサイト(facebookやgoogle画像検索など)で気づきました。この場合、スクロールせずに見える画像は、ユーザーがページを下にスクロールして表示可能なビューポート領域(ソースを表示すると、X個の<img>タグがありますが、サーバーからすぐにフェッチされません)。この手法は何と呼ばれ、どのように機能し、いくつのブラウザで機能します。そして、最小限のコーディングでこの動作を実現できるjQueryプラグインがあります。

編集する

おまけ:HTML要素に「onScrolledIntoView」または同様のイベントがあるかどうか誰かが説明できますか。そうでない場合、これらのプラグインはどのように機能しますか?


画像の遅延読み込みのみが必要ですか?あなたがコンテンツの遅延ロードが必要な場合は、無限スクロールプラグインは正しい答えである
焼酎

@rsp @jwegner @Nicholasは申し訳ありませんが、Salmanが求めていることではありません。
Alec Smart、

@soju:画像の遅延読み込みのみに関心があります。しかし、私は(かなり遠い)将来のいつか他の可能性を見るかもしれません。
Salman A

21
ブラウザーのデフォルトの動作が、表示されている画像のみをロードするのではない理由を不思議に思います。その場合、過去18年間にどれだけの帯域幅が節約されたか想像してみてください。
マシューロック

2
遅延読み込みの理由は理解していますが...その方法を利用しているサイトにアクセスすると、正直、我慢できません。画像の点滅は私を狂わせます!:)
Booski 2013

回答:


64

ここでの回答の一部は、無限ページに関するものです。Salmanが求めているのは、画像の遅延読み込みです。

プラグイン

デモ

編集:これらのプラグインはどのように機能しますか?

これは簡単な説明です:

  1. ウィンドウサイズを見つけ、すべての画像の位置とそのサイズを見つける
  2. 画像がウィンドウサイズ内にない場合は、同じサイズのプレースホルダーに置き換えます
  3. ユーザーが下にスクロールすると、画像の位置<スクロール+ウィンドウの高さ、画像が読み込まれます

アプリケーションでは、それらは同じように機能しませんか?画像の単一の列の無限スクロールは、それらを遅延ロードするのと同じですよね?おそらく私は混乱しています。
jwegner '25

1
@jwegner無限スクロールを使用すると、ユーザーがページの下部に到達した(または近づいた)ときに、ページの下部に新しいアイテムを追加できます。遅延読み込みされた画像は、ページ上で同じサイズのプレースホルダーを持つことができ、画像自体がスクロールで読み込まれます。したがって、後者はページレイアウトに影響を与えることなく遅延読み込みを行うことができます。
Annika Backstrom、2011

これはデスクトップブラウザとiOSでは正常に機能しますが、Android(3.x / 4.xを含む)では機能しません。なぜだろう?スクロールイベントはサポートされていませんか?
lahsrah

私はこのプラグインのドキュメントを調べていましたが、それはかなり素晴らしいようです。次のプロジェクトでこれを使用します。
マフィンマン

これはおそらく同じように機能する関連プラグインです:afarkas.github.io/lazysizesははるかに堅牢で、既存のものをより多く使用していることを除いてです(たとえば、プレースホルダーは必要ありませんが、欲しいです)。
cregox

10

AOLのDave Artzが昨年のjQuery Conference Bostonで最適化について素晴らしい講演を行いました。AOLは、Sonarと呼ばれるツールを使用して、スクロール位置に基づいたオンデマンドロードを行います。要素の一部またはすべてが表示されているかどうかを検出するために、scrollTop(およびその他)を要素のオフセットと比較する方法の詳細についてコードを確認します。

jQueryソナー

デイブはこれらのスライドでソナーについて語っています。ソナーはスライド46から始まり、全体的な「ロードオンデマンド」の議論はスライド33から始まります。


これはAppelsiniiの遅延ロードとどのように比較されるのでしょうか。より軽量ですか?すべてのブラウザで動作しますか?lazyloadがChromeで機能しないことを覚えています。
デスロック2012

8

私は自分の基本的な方法を思い付きました。おそらく、私が考えていなかった、人気のあるスクリプトのいくつかが扱っているものは十数あります。

-このソリューションは高速で実装が簡単ですが、もちろんパフォーマンスには優れていません。Apoorvが言及、パフォーマンスに問題がある場合はdeveloper.googleが説明するように、新しいIntersection Observer必ず確認してください

JQuery

$(window).scroll(function() {
    $.each($('img'), function() {
        if ( $(this).attr('data-src') && $(this).offset().top < ($(window).scrollTop() + $(window).height() + 100) ) {
            var source = $(this).data('src');
            $(this).attr('src', source);
            $(this).removeAttr('data-src');
        }
    })
})

サンプルHTMLコード

<div>
    <img src="" data-src="pathtoyour/image1.jpg">
    <img src="" data-src="pathtoyour/image2.jpg">
    <img src="" data-src="pathtoyour/image3.jpg">
</div>

説明しました

ページがスクロールされると、ページ上の各画像がチェックされます。

$(this).attr('data-src') -画像に属性がある場合 data-src

そして、それらの画像がウィンドウの下部からどれだけ離れているか。

$(this).offset().top < ($(window).scrollTop() + $(window).height() + 100)

+ 100を好きなように調整します(たとえば-100)

var source = $(this).data('src');- data-src=別名画像URLの値を取得します

$(this).attr('src', source); -その値を src=

$(this).removeAttr('data-src'); -data-src属性を削除します(ブラウザが、すでにロードされている画像をいじるリソースを浪費しないようにします)

既存のコードへの追加

エディタで、あなたのhtmlを変換するには、単に検索と置換src="src="" data-src="


完璧。🙏FAMを祝福
LifterCoder

5

ここにはかなり素晴らしい無限スクロールプラグインがあります

私は自分でプログラムしたことはありませんが、これがどのように機能するか想像します。

  1. イベントはウィンドウのスクロールにバインドされています

    $(window).scroll(myInfinteScrollFunction);
  2. 呼び出された関数は、スクロールトップがウィンドウサイズより大きいかどうかを確認します

    function myInfiniteScrollFunction() {  
        if($(window).scrollTop() == $(window).height())  
        makeAjaxRequest();  
    }
    
  3. AJAX要求が作成され、開始する結果#、取得する数、およびデータプルに必要なその他のパラメーターが指定されます。

    $.ajax({
        type: "POST",
        url:  "myAjaxFile.php",
        data: {"resultNum": 30, "numPerPage": 50, "query": "interesting%20icons" },
        success: myInfiniteLoadFunction(msg)
    });
    
  4. ajaxはいくつかの(JSON形式の可能性が最も高い)コンテンツを返し、それらをloadnig関数に渡します。

それが理にかなっていると思います。


3

getBoundingClientRect()を呼び出すたびにブラウザがページ全体を再レイアウトし、ウェブサイトにかなりのジャンクを導入するため、リスナーをスクロールイベントにアタッチするか、setIntervalを使用して画像を遅延読み込みすることは、非常に非パフォーマンスです。

使用Lozad.js使用しています(依存性のないちょうど569バイト)、IntersectionObserverを performantly遅延ロードイメージに。


ブラウザのサポートが利用できない場合に備えて、ポリフィルを動的に追加できます
Apoorv Saxena '11

最近のブラウザのサポートははるかに優れています
Hastig Zusammenstellen

1

画像遅延読み込みのスイスアーミーナイフは、YUIのImageLoaderです。

この問題には、単にスクロール位置を監視するだけではありません。


0

このリンクはデモ用に機能します

1. jQueryライブラリの後で、本文の終了タグの前にjQuery loadScrollプラグインをロードします。

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script><script src="jQuery.loadScroll.js"></script>

2.Html5 data-src属性を使用して画像をウェブページに追加します。通常のimgのsrc属性を使用してプレースホルダーを挿入することもできます。

<img data-src="1.jpg" src="Placeholder.jpg" alt="Image Alt"><img data-src="2.jpg" src="Placeholder.jpg" alt="Image Alt"><img data-src="3.jpg" src="Placeholder.jpg" alt="Image Alt">

3. imgタグのプラグインを呼び出して、画像が表示されるように、fadeInエフェクトの期間を指定します

$('img').loadScroll(500); // in ms

0

私はjQuery Lazyを使用しています。テストに約10分、私のWebサイト(CollegeCarePackages.com)のほとんどの画像リンクに追加するのに1〜2時間かかりました。私が持っているNO(なし/ゼロ) DEVにどのような種類の関係を、それは私に多くの時間を保存し、基本的には、モバイルユーザーのための私達の直帰率を向上させる助けと私はそれを感謝しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.