Как загружать изображения динамически (или лениво), когда пользователи прокручивают их в поле зрения


97

Я заметил это на многочисленных «современных» веб-сайтах (например, в Facebook и поиске изображений в Google), где изображения под складкой загружаются только тогда, когда пользователь прокручивает страницу вниз достаточно, чтобы поместить их в видимую область области просмотра ( при просмотре источника на странице отображается X количество <img>тегов , но они не получены с сервера сразу ). Как называется этот метод, как он работает и в скольких браузерах работает. И есть ли плагин jQuery, который может добиться такого поведения с минимальным кодированием.

редактировать

Бонус: может кто-нибудь объяснить, есть ли событие onScrolledIntoView или подобное для элементов HTML. Если нет, то как эти плагины работают?


Вам нужна только отложенная загрузка изображений? Если вам нужна отложенная загрузка контента, правильный ответ
soju

@rsp @jwegner @Nicholas извините, но Салман спрашивает не об этом.
Алек Смарт,

@soju: меня интересует только отложенная загрузка изображений; но я могу рассмотреть другие возможности когда-нибудь в (довольно отдаленном) будущем.
Salman A

21
Заставляет задуматься, почему по умолчанию браузер не загружает только видимые изображения. Представьте, сколько полосы пропускания можно было бы сэкономить за последние 18 лет, если бы это было так!
Мэтью Лок

2
Хотя я понимаю причину отложенной загрузки ... Честно говоря, я терпеть не могу, когда захожу на сайт, использующий этот метод. Мигание изображений сводит меня с ума! :)
Booski

Ответы:


64

Некоторые из ответов здесь для бесконечной страницы. Салман спрашивает о ленивой загрузке изображений.

Плагин

Демо

РЕДАКТИРОВАТЬ: Как работают эти плагины?

Это упрощенное объяснение:

  1. Найдите размер окна и найдите положение всех изображений и их размеры
  2. Если изображение выходит за пределы размера окна, замените его заполнителем того же размера.
  3. Когда пользователь прокручивает вниз, а положение изображения <прокрутка + высота окна, изображение загружается

В приложении они не работали бы так же? Бесконечная прокрутка одного столбца изображений была бы такой же, как ленивая загрузка их, верно? Возможно я запутался.
jwegner

1
@jwegner Бесконечная прокрутка позволит вам добавлять новые элементы в нижнюю часть страницы, когда пользователь достигает (или приближается) дна. Отложенные изображения могут иметь заполнители тех же размеров на странице, а сами изображения загружаются при прокрутке. Таким образом, последний мог лениво загружаться, не влияя на макет страницы.
Анника Бэкстрем,

Это нормально работает в настольных браузерах и iOS, но не работает на Android (включая 3.x / 4.x). Есть идеи, почему? событие прокрутки не поддерживается?
lahsrah 06

Я просматривал документацию по этому плагину, и она мне показалась классной. Собираюсь использовать это в моем следующем проекте.
The Muffin Man

вот связанный плагин, который, вероятно, работает примерно так же: afarkas.github.io/lazysizes, за исключением того, что я считаю, что он гораздо более надежен и использует больше того, что уже есть (например, нет необходимости в заполнителе, но вы можете его получить, если вы хотеть).
cregox

10

Дэйв Арц из AOL в прошлом году на конференции jQuery в Бостоне подробно рассказал об оптимизации. AOL использует инструмент под названием Sonar для загрузки по запросу в зависимости от положения прокрутки. Проверьте код, чтобы узнать, как он сравнивает scrollTop (и другие) со смещением элемента, чтобы определить, видна ли часть или весь элемент.

jQuery Sonar

Дэйв рассказывает о Sonar на этих слайдах . Сонар начинается на слайде 46, а общее обсуждение «нагрузки по запросу» начинается на слайде 33.


Интересно, как это соотносится с ленивой загрузкой Аппельсини? Он легче? Это работает в каждом браузере? Я помню, что lazyload не работает в Chrome.
Deathlock

8

Я придумал свой собственный базовый метод, который, кажется, работает нормально (пока). Есть, наверное, дюжина вещей, которые затрагивают некоторые популярные скрипты, о которых я не подумал.

Примечание. Это решение быстро и легко реализовать, но, конечно, не очень хорошо для производительности. Обязательно посмотрите на новый Intersection Observer, упомянутый Апурвом и объясненный разработчиками Google , если производительность является проблемой.

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="


идеальный. bless 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

Ленивая загрузка изображений путем присоединения слушателя к событиям прокрутки или использования setInterval очень неэффективна, поскольку каждый вызов getBoundingClientRect () заставляет браузер изменять макет всей страницы и вносит значительный урон на ваш сайт.

Используйте Lozad.js (всего 569 байт без зависимостей), который использует IntersectionObserver для ленивой загрузки изображений.


Polyfill может быть добавлен динамически, если поддержка браузера недоступна
Apoorv Saxena

Поддержка
браузеров в

1

Швейцарский армейский нож для отложенной загрузки изображений - ImageLoader от YUI .

Потому что проблема не только в наблюдении за положением прокрутки.


0

Эта ссылка работает для меня демо

1. Загрузите плагин jQuery loadScroll после библиотеки jQuery, но до закрывающего тега body.

<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 минут на тестирование и час или два, чтобы добавить к большинству ссылок на изображения на одном из моих веб-сайтов ( CollegeCarePackages.com ). У меня НЕТ (нет / ноль) никаких отношений с разработчиком, но это сэкономило мне много времени и в основном помогло улучшить наш показатель отказов для мобильных пользователей, и я это ценю.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.