Ленивая загрузка в Flexslider

Я пытаюсь заставить отложенную загрузку работать для Flexslider, используя плагин jquery отложенной загрузки и следуя инструкциям на этот сайт: http://www.appelsiini.net/projects/lazyload

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

$("img.lazy").lazyload({
  effect: "fadeIn",
  container: $(".slides > li")
});

Кто-нибудь знает, как заставить ленивую загрузку работать во Flexslider?


person Encore PTL    schedule 10.09.2012    source источник


Ответы (6)


Я реализовал ленивую загрузку во время прокрутки. Это решение работает лучше для больших коллекций по сравнению с другими решениями, предложенными здесь. Во время инициализации загружаются только первые 5 изображений, а затем загружаются по 3 изображения вперед для каждой анимации.

<li>
  <img class="lazy" src="loading-image.jpg" data-src="actual-image.jpg" />
</li> 

и код javascript:

    $('.flexslider').flexslider({
        animation: "slide",
        animationLoop: false,
        controlNav: false,
        init: function (slider) {
            // lazy load
            $("img.lazy").slice(0,5).each(function () {
                var src = $(this).attr("data-src");
                $(this).attr("src", src).removeAttr("data-src").removeClass("lazy");
            });
        },
        before: function (slider) {
            // lazy load
            $("img.lazy").slice(0,3).each(function () {
                var src = $(this).attr("data-src");
                $(this).attr("src", src).removeAttr("data-src").removeClass("lazy");
            });
        }
    });
person Roman Podlinov    schedule 05.02.2014
comment
Можете ли вы отправить JSFiddle или Codepen для этого брата? - person Ryan Brackett; 19.05.2014
comment
@RomanPodlinov, как я могу использовать эту концепцию для ResponsiveSlider ?? - person Vikram Anand Bhushan; 01.10.2014
comment
@Vikram извините, я не работал с ResponsiveSlider, но IMO концепция тоже должна работать. Вам просто нужно привязать ленивую загрузку к событиям из ползунка - person Roman Podlinov; 01.10.2014
comment
Все еще использую flexslider в 2020 году. Отличный ответ, простая концепция, работает по назначению. Я думаю, что это должен быть принятый ответ. Принятый ответ намекает на ту же концепцию, но этот ответ является полным. - person brett; 18.05.2020

У меня этот метод работает очень хорошо, но загружаемое изображение должно быть того же размера, что и остальные изображения. На самом деле я использую http://imageresizing.net/ с mode=pad

В основном контейнере, который вы используете для flexslider, поместите фактическое изображение в атрибут «data-src».

<li>
  <img class="lazy" src="loading-image.jpg" data-src="actual-image.jpg" />
</li>            

В вашей функции инициализации используйте обратный вызов «start», чтобы заменить загружаемое изображение фактическим изображением и удалить атрибут

$('#slider').flexslider({
    start: function (slider) {
       // lazy load
       $(slider).find("img.lazy").each(function () {
          var src = $(this).attr("data-src");
          $(this).attr("src", src).removeAttr("data-src");
       });
     }
});

Я надеюсь, что это помогает кому-то.

person Tommy W    schedule 28.10.2012
comment
У меня это работает, я делаю только одно улучшение вместо того, чтобы добавлять class=lazy напрямую, я ищу img с атрибутом data-src $(slider).find(img[data-src]).each(function () ... - person Marc Cals; 26.03.2013

Я пытаюсь сделать то же самое, используя Flexslider 2 и Подключаемый модуль отложенной загрузки для jQuery.

Кажется, что свойство container работает только в том случае, если элемент имеет стиль overflow:scroll;.

Я смог заставить работать ленивую загрузку, используя этот код:

$("#flexcontainer img.lazy").lazyload({
    failure_limit : 10,
    effect: "fadeIn",
    skip_invisible : false
});

Однако это просто лениво загружает все сразу, а не анимирует flexslider.

Я также смог заставить его работать с мышью, используя этот код:

 $("#flexcontainer img.lazy").lazyload({
     failure_limit : 10,
     effect: "fadeIn",
     event : "mouseover"
 });

Однако это не работает на сенсорных устройствах.

Я думаю, что ключ в том, чтобы создать собственное пользовательское событие и запустить его после обратного вызова flexslider, такого как обратный вызов after.

person alexandria757    schedule 14.09.2012
comment
Спасибо за ответ, но я так и сделал. Я реализовал свою логику ленивой загрузки на основе того, что делает библиотека ленивой загрузки после события flexslider, которое запускается после завершения слайда. - person Encore PTL; 18.09.2012
comment
Решение для ленивой загрузки не имеет смысла для больших коллекций изображений, поскольку оно загружает ВСЕ изображения. Я предложил лучшее решение ниже. - person Roman Podlinov; 06.02.2014

Ради предложения альтернативного решения - другой вариант - использовать адаптивный слайдер, в который уже встроена ленивая загрузка, например королевский слайдер, вот ссылка -> http://dimsemenov.com/плагины/royal-slider/

person uknowit2    schedule 27.09.2013

Вы также можете инициализировать отложенную загрузку с помощью пользовательского триггерного события...

$jQ("img[data-original]").lazyload({
            effect: "fadeIn",
            skip_invisible: false,
            event: "forceLazyLoad"
        });

... а затем вызовите это событие, чтобы предварительно загрузить все ваши изображения внутри flexslider с помощью вызова, например:

$jQ('.flex-viewport').find('img[data-original]').trigger('forceLazyLoad');
person Carlos A. Cabrera    schedule 05.08.2013

Поэтому я добавил реальную страницу изображения в атрибут data-attr в теге изображения, и при after событии after я находил изображение с классом active и устанавливал атрибут img src равным значению data-attr.

person Encore PTL    schedule 19.09.2012
comment
У вас есть пример? Или вы могли бы бросить один в скрипке js? - person J0NNY ZER0; 14.12.2012
comment
Как говорит @ J0NNYZER0, не могли бы вы добавить jsfiddle своего решения? Спасибо. - person cavill; 21.11.2013