Ленивая загрузка изображений как

Я разрабатываю интернет-магазин. На странице продуктов на основе категории я добавил фильтрацию на основе javascript. Однако проблема возникает, если в категории много товаров. У этой ссылки есть нечто похожее на меня ... http://www.snowandrock.com/sunglasses/snowboard/fcp-category/list?resetFilters=true

Как бы то ни было, эта страница мучительно медленная и занимает более 2 Мб !!!

Каждому продукту для меня требуется полкилбайта, но проблема в изображении. Итак, я ищу, как лениво загружать изображения. Поскольку моя страница имеет разбиение на страницы, в отличие от этого сайта, я думаю, что загрузка изображений, которые видны только странице, является решением. Однако проблема заключается в том, как это сделать, чтобы работать как для людей с поддержкой javascript, так и для людей, не поддерживающих javscript. Единственное решение, которое я, однако, - это сохранение ссылки в классе css каким-то образом изображения для невидимых продуктов, и если оно отображается после изменения фильтрации через javascript изображение src ... Пользователи без javascript не имеют этой проблемы, поскольку щелчок по фильтру переместит их на другую страницу ...

Есть еще идеи?


person GorillaApe    schedule 27.10.2010    source источник
comment
Сделайте пагинацию на стороне сервера. Если вы загружаете только 20 изображений за раз, это не должно быть медленным.   -  person gblazex    schedule 27.10.2010


Ответы (7)


Четыре варианта:

Вот вам три варианта:

Использовать фоновое изображение

Справочный ответ Кангкана охватывает это.

Если это не сработает для вас, я предполагаю, что вам нужна только помощь с материалами с поддержкой JavaScript, поскольку вы сказали, что пользователи, не использующие JavaScript, будут видеть другую страницу.

Используйте плагин

Пейджинг выполнен. В комментарии вы сказали, что используете jQuery. Для разбиения по страницам существует множество подключаемых модулей jQuery. Найдите тот, который вам нравится, и используйте его. Они будут разного качества, поэтому вы захотите протестировать их и просмотреть их код, но я уверен, что есть и более качественные.

Пейджинг на стороне сервера

Здесь главная страница загружается либо без продуктов, либо с первой страницей продуктов. Обычно вы кладете все продукты в контейнер, например:

<ul id='productList'>
</ul>

Тогда у вас будут обычные элементы управления пользовательского интерфейса для перемещения между страницами результатов. У вас будет серверный ресурс, который возвращает фрагменты HTML или данные в формате JSON, которые вы можете использовать для заполнения этого списка. Я буду использовать HTML для простоты (хотя, вероятно, я бы использовал JSON в производственном приложении, так как он будет меньше). Каждая запись о продукте представляет собой отдельный автономный блок:

<li id='product-001'>
  <div>This is Product 001</div>
  <img src='http://www.gravatar.com/avatar/88ca83ed97a129596d6e8dd86deef994?s=32&d=identicon&r=PG'>
  <div>Blurb about Product 001</div>
</li>

... а затем страница возвращает столько из них, сколько вы считаете нужным. Вы запрашиваете страницу с помощью Ajax и обновляете список продуктов с помощью JavaScript. Поскольку вы сказали, что используете jQuery, это может быть тривиально просто:

$('#productList').load("/path/to/paging/page?start=X&count=Y");

Вот пример прототипа (не производственный код); он подделывает Ajax, потому что JSBin вызывал у меня проблемы с Ajax.

Загрузка одной большой страницы, затем подкачка JavaScript на стороне клиента

Я не уверен, как вы выполняете фильтрацию, но если у вас есть элемент, содержащий информацию о продукте, вы можете сохранить URL-адрес изображения в атрибуте data-xyz:

<div id='product-123' data-image='/images/foo.png'>

Затем, когда ваш код сделает это видимым, вы можете легко добавить к нему img:

var prod, imgsrc, img;
prod = document.getElementById('product-123');
prod.style.display = 'block'; // Or whatever you're doing to show it
imgsrc = prod.getAttribute('data-image');
if (imgsrc) {
    img = document.createElement('img');
    img.src = imgsrc;
    prod.appendChild(img); // You'd probably put this somewhere else, but you get the idea
    prod.removeAttribute('data-image');
}

Изменить. В другом месте вы сказали, что используете jQuery. Если да, то перевод вышеизложенного может выглядеть так:

var prod, imgsrc, img;
prod = $('#product-123');
prod.show();
imgsrc = prod.attr('data-image');
if (imgsrc) {
    $("<img/>").attr('src', imgsrc).appendTo(prod); // You'd probably put this somewhere else, but you get the idea
    prod.removeAttr('data-image');
}

Нет необходимости снова удалять его при скрытии, поскольку изображение уже будет показано, поэтому я удаляю атрибут после того, как мы его использовали.

Причина, по которой я использовал префикс data-, - это проверка: в HTML5 вы можете определять свои собственные data-xyz атрибуты, и ваши страницы по-прежнему будут проходить проверку. В более ранних версиях HTML вам не разрешалось определять свои собственные атрибуты (хотя на практике это не касается основных браузеров), поэтому, если вы использовали для этого свой собственный атрибут, страница не проверялась.

Ссылки (w3.org):

Не по теме, но многое из этого станет намного проще, если вы используете библиотеку JavaScript, например jQuery, закрытие, Прототип, YUI или любой из нескольких других, чтобы сгладить острые углы для вас. (С тех пор вы сказали вы используете jQuery.)

person T.J. Crowder    schedule 27.10.2010
comment
data-attribute проверяет или нет? Есть ли способ проверить это? - person GorillaApe; 27.10.2010
comment
@Parhs: Я говорю о валидации в своем ответе. Если вы объявите документ как HTML5 (<!DOCTYPE html>), да, он пройдет проверку. Если вы этого не сделаете, этого не произойдет. Это не имеет значение, если проверка не является большой частью вашей рабочей практики (а она должна быть), потому что даже если вы не используете объявление HTML5, все основные браузеры допускают настраиваемые атрибуты. Тем не менее, несмотря на некоторые надменные комментарии членов рабочей группы HTML5, я с Джоном Ресигом : Нет причин не использовать doctype HTML5 прямо сейчас. - person T.J. Crowder; 27.10.2010
comment
Мне было интересно, будет ли использование документа HTML5 запускать режим quirks в ie6 и т. Д. Это было бы ПЛОХО - person GorillaApe; 27.10.2010
comment
На самом деле у меня проблемы с установкой этого документа. Я получаю под изображениями какие-то невидимые поля. - person GorillaApe; 28.10.2010
comment
@Parhs: Мне было интересно, вызовет ли использование документа HTML5 режим quirks в ie6 и т. Д. Нет, почти любой DOCTYPE указывает браузеру перейти в стандартный режим: HTML5: jsbin.com/uligo3 HTML4: jsbin.com/uligo3/2 Причуды: jsbin.com/uligo3/3 - person T.J. Crowder; 28.10.2010
comment
@Parhs: Я получаю под изображениями какие-то невидимые поля. Должно быть достаточно легко использовать инструменты разработки (инструменты разработчика, встроенные в Chrome или Safari, Firebug для Firefox, бесплатный VS.Net для IE), чтобы увидеть точный вычисленный стиль элементов и соответствующим образом скорректировать CSS. Одна из важных вещей, которую делает стандартный режим, - это рационализация некоторого поведения CSS, особенно модели разбитого ящика IE. Дополнительная литература: en.wikipedia.org/wiki/Quirks_mode | alistapart.com/articles/doctype | hsivonen.iki.fi/doctype - person T.J. Crowder; 28.10.2010
comment
@Crowder: Отличный пост, рассматривающий все возможности. Спасибо. - person Kangkan; 28.10.2010
comment
stackoverflow.com/questions/4026994 / Вот как я реализую фильтрацию .. Спасибо за подробности! Я бы пошел с последним подходом .. Поскольку изображения должны быть изменены, фоновые изображения не являются решением для продуктов ... - person GorillaApe; 28.10.2010

Если вы просто хотите загружать изображения медленно, а остальная часть страницы загружается первой, вы можете поместить изображения в качестве фона и не использовать тег <img>. Если вы используете тег <img>, изображение загружается во время загрузки страницы, поэтому загрузка страницы замедляется. Однако фоновые изображения загружаются после того, как страница отображается пользователю. Пользователь может прочитать текст и увидеть, как через некоторое время загружаются изображения.

person Kangkan    schedule 27.10.2010
comment
это поведение для всех браузеров? Вы имеете в виду, если он скрыт, его не видно? - person GorillaApe; 27.10.2010
comment
@Parhs: Я проверил это во всех основных браузерах. Но, наверное, надо проверить, стандартен ли он. Кроме того, иногда загрузка действительно не выполняется из-за очень долгого времени загрузки. Это известная проблема, когда у вас большие изображения. Но с большим количеством маленьких изображений (например, в случае каталога) это обычно работает. - person Kangkan; 27.10.2010
comment
В каких браузерах вы это проверяли? Есть ли источник этих знаний? спасибо, это хорошо знать. - person Adrien Be; 25.06.2014
comment
@AdrienBe: Это то, что я наблюдал давно. Это могло измениться с появлением современных браузеров и улучшенных возможностей подключения. Но для какого-то сайта у меня получился хороший результат. - person Kangkan; 26.06.2014
comment
Спустя 5+ лет это, похоже, больше не работает. (В любом случае Chrome) - person Chris Fremgen; 06.05.2016

Я совершенно уверен, что это невозможно в обычном HTML без какого-либо вмешательства Javascript.

В конце концов, если бы это можно было сделать без сценариев, зачем вообще кто-то реализовал это в Javascript?

Мой вопрос: сколько у вас посетителей в наши дни, у которых не включен Javascript? Бьюсь об заклад, их очень мало. И в любом случае эти люди привыкли к тому, что сайты не работают полностью, когда у них отключен javascript; ваш сайт действительно будет лучше, чем большинство других, если единственная разница, с которой им придется мириться, - это более низкая скорость загрузки.

(ps - я полагаю, вы используете плагин Jquery LazyLoad для людей с поддержкой Javascript?)

person Spudley    schedule 27.10.2010
comment
Я полагаю, вы используете плагин Jquery LazyLoad для людей с поддержкой Javascript? Он не сказал, что использует jQuery. jQuery! = JavaScript !! ;-) - person T.J. Crowder; 27.10.2010
comment
Я использую JQuery, но еще ничего не сделал для описываемой мной проблемы - person GorillaApe; 27.10.2010
comment
@TJ: Да, я знаю JQuery! = JS. ;) Я предполагал, что он уже использовал этот плагин, так как он использовал его имя в вопросе. (и я предоставил ссылку на случай, если его не было, и в случае, если это будет полезно) - person Spudley; 27.10.2010

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

person Pavel Podlipensky    schedule 05.06.2013
comment
+1 за очень интересную концепцию, представленную в этом сообщении в блоге - person Adrien Be; 25.06.2014

Я написал следующий код для своего сайта. Я использовал JQuery: 1. Назовите все классы, где U хочет ленивую загрузку, с тем же именем, скажем "async" 2. Скопируйте реальное местоположение изображения из 'src' в атрибут 'alt' 3. После завершения загрузки страницы мой скрипт скопирует все значения 'alt' в 'src' Посмотрите на пример. Это полный рабочий образец html:

<html> 
<head> 
<script src="http://code.jquery.com/jquery-1.9.1.js"></script> 
<script type="text/javascript">
        $(document).ready(function(){
            $('img.async').each(function(i, ele) {
                 $(ele).attr('src',$(ele).attr('alt'));
            });
        });
        </script> </head> <body> <img class="async" title="Гороскопы" alt="http://virtual-doctor.net/images/horoscopes.jpg" width="135" height="135"/> 
</body>
</html>

Вы можете почувствовать скорость на реальном сайте, где я ее использовал http://virtual-doctor.net/

person Jeff_Alieffson    schedule 22.10.2013

РЕДАКТИРОВАТЬ: Я перечитал ваш вопрос и заметил, что вы также хотите, чтобы это работало для людей с отключенным Javascript! Тогда да, мой ответ неприемлем, но я оставлю его для протокола.

Вот несколько библиотек Javascript для отложенной загрузки изображений.

Они помогают загружать изображения, необходимые, когда элементы «будут» в поле зрения, просто изменив атрибут изображения src.

Важно. Я все еще пытаюсь выяснить, какую из этих библиотек Javascript лучше всего использовать. Сделайте домашнее задание. Я бы сказал, найдите время, чтобы найти лучший инструмент для работы. Мои требования обычно: license, dependencies, browser support, device support, weight, community и history.

person Adrien Be    schedule 25.06.2014

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

Современные браузеры имеют возможность лениво загружать изображения с помощью атрибута loading="lazy"!

<img src="image.png" loading="lazy" alt="…" width="200" height="200">

Для получения дополнительной информации посетите здесь.

person Amir Fo    schedule 31.01.2021