jQuery延迟加载(懒加载)插件 – jquery.lazyload.js

2015-02-11阅读(196706)评论(33)牵着狗狗看MM

W3Cways.com 微信公众号

Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预加载的处理方式正好是相反的.
在包含很多大图片长页面中延迟加载图片可以加快页面加载速度. 浏览器将会在加载可见图片之后即进入就绪状态. 在某些情况下还可以帮助降低服务器负担.

Demo页面:

基本选项

淡入效果

对不支持JavaScript浏览器的降级处理

水平滚动

容器内水平滚动

容器内垂直滚动

页面内存在N多图片

经过五秒钟的延迟后加载图片

用AJAX来加载图片

如何使用

Lazy Load 依赖于 jQuery. 请将下列代码加入HTML的结尾,也就是</body>前:

[html]<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.lazyload.js"></script>
[/html]

你必须改变图片的标签。图像的地址必须放在data-original属性上。给懒加载图像一个特定的class(例如:lazy)。这样你可以很容易地进行图像插件捆绑。代码如下:

[html]<img class="lazy" alt="" width="640" height="480" data-original="img/example.jpg" />
[/html]
[js]$(function() {
$("img.lazy").lazyload();
});
[/js]

这将使所有 class 为 lazy 的图片将被延迟加载.
Demo:基本选项

TIPS:这里必须设置图片的width和height,否则插件可能无法正常工作。

设置临界点

默认情况下图片会出现在屏幕时加载. 如果你想提前加载图片, 可以设置threshold 选项, 设置 threshold 为 200 令图片在距离屏幕 200 像素时提前加载.
[js]$("img.lazy").lazyload({
threshold : 200
});
[/js]

设置事件来触发加载

你可以使用jQuery事件,例如click和mouseover。也可以使用自定义事件,如sporty、foobar默认情况下是要等到用户向下滚动并且图像出现在视口中时。只有当用户点击它们才加载图片:

[js]$("img.lazy").lazyload({
event : "click"
});
[/js]
Demo:经过五秒钟的延迟后加载图片

使用特效

默认情况下,插件等待图像完全加载并调用show()。你可以使用任何你想要的效果。下面的代码使用fadeIn (淡入效果)。
Demo:淡入效果
[js]$("img.lazy").lazyload({
effect : "fadeIn"
});
[/js]

针对不启用JavaScript的情况

几乎所有浏览器的 JavaScript 都是激活的. 然而可能你仍希望能在不支持 JavaScript 的客户端展示真实图片. 当浏览器不支持 JavaScript 时优雅降级, 你可以将真实的图片片段在写 <noscript> 标签内.
[html]<img class="lazy" data-original="img/example.jpg" width="640" heigh="480">
<noscript><img src="img/example.jpg" width="640" heigh="480"></noscript>
[/html]
可以通过 CSS 隐藏占位符.
[css].lazy {
display: none;
}
[/css]
在支持 JavaScript 的浏览器中, 你必须在 DOM ready 时将占位符显示出来, 这可以在插件初始化的同时完成.

[js]$("img.lazy").show().lazyload();
[/js]

图片在容器里面

你可以将插件用在可滚动容器的图片上, 例如带滚动条的 DIV 元素. 你要做的只是将容器定义为 jQuery 对象并作为参数传到初始化方法里面.
Demo:容器内水平滚动, 容器内垂直滚动

当图像不连续时

滚动页面的时候, Lazy Load 会循环为加载的图片. 在循环中检测图片是否在可视区域内. 默认情况下在找到第一张不在可见区域的图片时停止循环. 图片被认为是流式分布的, 图片在页面中的次序和 HTML 代码中次序相同. 但是在一些布局中, 这样的假设是不成立的. 不过你可以通过 failurelimit 选项来控制加载行为.

[js]$("img.lazy").lazyload({
failure_limit : 10
});
[/js]
将 failurelimit 设为 10 ,令插件找到 10 个不在可见区域的图片时才停止搜索. 如果你有一个猥琐的布局, 请把这个参数设高一点.

加载隐藏的图片

可能在你的页面上埋藏可很多隐藏的图片. 比如插件用在对列表的筛选, 你可以不断地修改列表中各条目的显示状态. 为了提升性能, Lazy Load 默认忽略了隐藏图片. 如果你想要加载隐藏图片, 请将 skip_invisible 设为 false

[js]$("img.lazy").lazyload({
skip_invisible : false
});
[/js]

下载插件

最新版本 源代码和压缩代码. 插件已经在 OSX 的 Safari 5.1, Safari 6, Chrome 20, Firefox 12 浏览器上, Windows 的 Chrome 20, IE 8 and IE 9 浏览器上, 以及 iOS5 (iPhone 和 iPad) 的 Safari 5.1 浏览器上测试过.

转载请注明来源:Web前端(W3Cways.com) - Web前端学习之路 » jQuery延迟加载(懒加载)插件 – jquery.lazyload.js
分享到: 更多 (0)

评论 33

评论前必须登录!

 

  1. #0

    楼主,在本地使用时没问题,但是扔到服务器上,页面第一次进入的时候依然是加载全部图片,而不是拉到可视区域才加载,第二次进入就正常了,不过那是加载缓存中的图片,也就是说,这个懒加载无效,没有按需加载

    qingmuccc9年前 (2018-04-03)
    • 可能你的JS加载顺序有问题

      admin9年前 (2018-04-09)
  2. #0

    不支持轮播图片的懒加载 怎么办 ??

    a1234569年前 (2017-07-10)
    • 这个没试过,得看你图片轮播想要出现的位置,理论上应该是可行的,可以参照DEMO给图片轮播的图设置class=”lazy”试下

      admin9年前 (2017-07-10)
      • 我试了 但是只有第一张可以出现懒加载的效果 但切换到第二张的时候 只有发生滚动事件 才会加载 这明显不是我们所需要的

        a1234569年前 (2017-07-10)
        • 那你可以在图片轮播的点击切换事件里面加上$("img.lazy").lazyload();
          也就是每切换一次图片,重新懒加载一下图片

          admin9年前 (2017-07-10)
  3. #0

    请问下 使用scrollstop事件 不执行懒加载 是怎么回事

    额10年前 (2017-03-09)
  4. #0

    怎么我评论显示不出来

    鹃10年前 (2017-02-23)
  5. #0

    我是代码小白,还想请教一个问题,你说的插件是什么,我测试感觉只需要引用这两个js就行了呀,还需要什么配置吗?

    鹃10年前 (2017-02-23)
  6. #0

    谢谢分享,这个很好用,本人是个代码小白,想请教下JQUERY库一定要加入HTML的结尾吗?因为页面不可能只有一个js效果,然而很多效果都需要先引用JQUERY库(即在头部就要先加载),我测试了一下,感觉在这个懒加载在头部引用似乎也可以呀

    鹃10年前 (2017-02-23)
  7. #0

    可以请教问题么

    石城小鱼10年前 (2017-02-22)
  8. #0

    急求 为什么我用了这个插件 当前屏幕的图片有的显示 有的图片要等到页面往下拉一定距离才显示

    石城小鱼10年前 (2017-02-22)
  9. #0

    请问楼主:我用的是点击那个,但是好像图片还是在html里面看得见,其他显示的是display:none;,那还是点击才加载了吗?

    小爽10年前 (2017-02-20)
    • 哪个

      • $(“img.lazy”).lazyload({ event : “click”});就是这个,图片就直接全部加载出来了

        小爽10年前 (2017-02-21)
      • 读出的代码都是这样的

        小爽10年前 (2017-02-21)
        • 文章里“设置事件来触发”,对应的DEMO里不是写的CLICK事件,$(“img.lazy”).lazyload({ event: “sporty” });你可以参照DEMO自己写个例子,修改JS为$(“img.lazy”).lazyload({ event : “click”});这样就是点击后显示图片

  10. #0

    如果必须填写图片宽高,那么手机端响应式如何处理

    卡斯特梅的雨季10年前 (2017-02-16)
  11. #0

    在哪下载?

    ♑️♑️10年前 (2016-12-27)
  12. #0

    怎么下载插件啊?我怎么找不到下载的地方啊?抓狂

    ♑️♑️10年前 (2016-12-27)
  13. #0

    加载一条一条的数据,可以设置临界点吗?

    fanhanj10年前 (2016-12-13)
  14. #0

    很好,谢谢博主,收录入笔记了

    与10年前 (2016-11-04)
  15. #0

    为什么我的项目中没有执行js方法呢?还需要有什么配置吗

    黄维荣10年前 (2016-10-27)
  16. #0

    很方便,用着也很爽

    朝军的博客10年前 (2016-10-12)
  17. #0

    很好的插件,不过我不懂js 按照讲解使用,发现可视区的图片只加载第一张,剩下的图片只有下拉滚动条才会开始加载,能否自动加载可视区图片呢

    吾可可10年前 (2016-09-28)
    • 设置临界点默认情况下图片会出现在屏幕时加载. 如果你想提前加载图片, 可以设置threshold 选项, 设置 threshold 为 200 令图片在距离屏幕 200 像素时提前加载.$(“img.lazy”).lazyload({ threshold : 200});参考这个就可以了