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


97

Я помітив це на численних "сучасних" веб-сайтах (наприклад, у facebook та пошуку зображень Google), де зображення, розміщені в нижній частині сторінки, завантажуються лише тоді, коли користувач прокручує сторінку настільки, що доставляє їх у видиму область області перегляду ( при джерелі перегляду на сторінці відображається X кількість <img>тегів, але вони не отримуються з сервера відразу ). Як називається ця техніка, як вона працює і скільки браузерів працює. І чи є плагін jQuery, який може досягти такої поведінки з мінімальним кодуванням.

Редагувати

Бонус: хтось може пояснити, чи існує "onScrollIntoView" або подібна подія для елементів HTML. Якщо ні, то як працюють ці плагіни?


Вам потрібне лише ліниве завантаження зображень? Якщо вам потрібне ледаче завантаження контенту, плагін для нескінченної прокрутки - правильна відповідь
soju

@rsp @jwegner @Nicholas вибачте, але це не те, що просить Салман.
Alec Smart

@soju: Мене цікавлять лише ліниві завантаження зображень; але я можу поглянути на інші можливості десь у (досить віддаленому) майбутньому.
Салман

21
Змушує задуматися, чому поведінка браузера за замовчуванням полягає не лише у завантаженні зображень, які видно. Уявіть, скільки пропускної здатності можна було б заощадити за останні 18 років, якби це було так!
Метью Лок,

2
Хоча я розумію причину ледачого завантаження ... Я, чесно кажучи, не витримую цього, коли відвідую сайт, який використовує цей метод. Блимання зображень зводить мене з розуму! :)
Booski

Відповіді:


64

Деякі відповіді тут стосуються нескінченної сторінки. Те, що просить Салман, - це ліниве завантаження зображень.

Підключати

Демо

EDIT: Як працюють ці плагіни?

Це спрощене пояснення:

  1. Знайдіть розмір вікна та знайдіть розташування всіх зображень та їх розміри
  2. Якщо зображення не відповідає розміру вікна, замініть його на заповнювач однакового розміру
  3. Коли користувач прокручує вниз і розміщує зображення <прокрутка + висота вікна, зображення завантажується

У заявці, чи не працюють вони однаково? Нескінченна прокрутка в одному стовпці зображень буде таким самим, як ліниве їх завантаження, правда? Можливо, я розгублений.
jwegner

1
@jwegner Нескінченна прокрутка дозволить вам додавати нові елементи внизу сторінки, коли користувач досягне (або підійде) до нижньої частини. Ледаче завантажені зображення можуть мати заповнювачі однакових розмірів на сторінці, а самі зображення завантажувати на прокрутку. Отже, останні можуть ліниво завантажувати, не впливаючи на макет сторінки.
Annika Backstrom

Це чудово працює в браузерах для настільних ПК та iOS, але не працює в Android (включаючи 3.x / 4.x). Будь-яка ідея чому? подія прокрутки не підтримується?
lahsrah

Я переглядав документацію до цього плагіна, і, здається, це дуже здорово. Збираюся використовувати це для мого наступного проекту.
Мафін,

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

10

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

jQuery сонар

На цих слайдах Дейв розповідає про Сонар . Ехолот починається на слайді 46, тоді як загальне обговорення "навантаження на вимогу" починається на слайді 33.


Цікаво, як це порівняно з ледачим набором Аппельсінія? Це легше? Чи працює це в кожному браузері? Пам'ятаю, lazyload не працює в Chrome.
deathlock

8

Я придумав свій власний базовий метод, який, здається, добре працює (поки що). Є, мабуть, десяток речей, які стосуються деяких популярних сценаріїв, про які я не думав.

Примітка - Це рішення є швидким та простим у впровадженні, але, звичайно, не дуже ефективним. Безумовно , вивчіть новий Intersection Observer, як згадав Apoorv та пояснив developers.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=aka url зображення

$(this).attr('src', source); - вкладає це значення в src=

$(this).removeAttr('data-src'); - видаляє атрибут data-src (щоб ваш браузер не витрачав ресурси, возиться з уже завантаженими зображеннями)

Додавання до існуючого коду

Щоб перетворити ваш html, у редакторі просто знайдіть і замініть src="наsrc="" data-src="


ідеально. благослови сім’я 🙏
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, але перед закриваючим тегом тіла.

<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. Ви також можете вставити заповнювачі, використовуючи звичайний атрибут src img.

<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.