Flexslider中的延迟加载

17

我正在尝试通过使用Lazy Loading jQuery插件并按照此网站的说明(http://www.appelsiini.net/projects/lazyload)来使Flexslider懒加载。

我已经加载了插件脚本,并且在控制台中没有看到任何错误。即使在lazyload函数中没有传递容器或选项,也尝试过了,但仍然没有效果。我花了几个小时在这上面。

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

有人知道如何在Flexslider中实现图片的懒加载吗?

6个回答

15

我在滚动期间实现了延迟加载。与此处提出的其他解决方案相比,这种解决方案对于大型集合效果更好。 在初始化过程中,它仅加载前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");
            });
        }
    });

1
你能发一个 JSFiddle 或者 Codepen 给我看看吗? - Ryan Brackett
@RomanPodlinov 我该如何将这个概念应用到 ResponsiveSlider 中? - Vikram Anand Bhushan
@Vikram 抱歉,我没有使用过 ResponsiveSlider,但是我认为这个概念也应该适用。你只需要将 lazyload 绑定到滑块的事件上即可。 - Roman Podlinov
1
在2020年仍然使用flexslider。很棒的答案,简单的概念,按预期工作。我认为这应该是被接受的答案。被接受的答案暗示了相同的概念,但这个答案是完整的。 - brett

8

这种方法对我来说效果非常不错,但是加载图片需要与其他图片大小相同。我实际上使用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");
       });
     }
});

我希望这能对某些人有所帮助。

2
它对我有效,我只做了一个改进,而不是直接添加class="lazy",我搜索带有属性"data-src"的img $(slider).find("img[data-src]").each(function () ... - Marc Cals
这对我帮助最大的尊贵父亲。我非常感激您。 - Desper

4
我正在尝试使用Flexslider 2Lazy Load Plugin for jQuery来完成相同的事情。
似乎只有在元素使用overflow:scroll;样式时,container属性才能起作用。
我使用了以下代码成功实现了懒加载:
$("#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”回调)之后触发它。

感谢您的回答,但那就是我所做的。我根据lazy load库在flexslider的after事件上实现了我们自己的懒加载逻辑,该事件在幻灯片完成后被触发。 - Encore PTL
你这个懒加载方案对于大型图像集合毫无意义,因为它会加载所有的图像。我在下面提出了一个更好的解决方案。 - Roman Podlinov

2

1

你可以使用自定义触发事件来初始化lazyload...

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

然后,通过调用以下事件来预加载flexslider内的所有图像:

$jQ('.flex-viewport').find('img[data-original]').trigger('forceLazyLoad');

0

因此,我将真实图像页面添加到图像标签的data-attr属性中,在after事件触发时,我会查找具有active类的图像,并将img src属性设置为data-attr值。


6
你有例子吗?或者你能在 JSFiddle 上分享一个例子吗?("throw one up" 意为 "分享") - J0NNY ZER0
正如@J0NNYZER0所说,你能否把你的解决方案放在jsfiddle上?谢谢。 - cavill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接