【译】Lazy Load(网页图片缓载)

2010年2月5日 由 Hackfan | 有 876 人次阅读 留言 »

【原文】http://www.appelsiini.net/projects/lazyload

【译者】Hujiy ( Hackfan )

  Lazy load是一个jQuery插件。他能够延迟加载网页(特别是很长的网页)中的图片。在用户可视区域外的图片,直到用户看到它们时,才会被加载。这一点与图片预加载的做法是截然相反的。

  在一张很长且包含很多大图片的网页上,采用Lazy Load,会使得网页加载速度变快。浏览器在加载可视的图片后,停留在“完成”状态。Lazy Load对降低服务器负载也有帮助。

  (译者注:译者认为Lazy Loader旨在降低服务器负载、带宽与并发数,也可以加快单张图片的加载速度,但对于那些想一口气看完一推大图片的用户来说,Lazy Load将是他们享受这些图片的噩梦。)

  Lazy Load受到Matt Mlinan开发的YUI ImageLoader工具箱的启发。点击查看(Lazy Load)的演示

如何使用?

  Lazy Load依赖于jQuery(doh!)。将以下代码包含在你的网页头部:

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

  并在你的Javascript中,应用它:

$("img").lazyload();

  这将使得网页中的所有图片被缓载。

设置灵敏度

  Lazy Load提供一定的参数来控制其行为。你可以通过设置threshold参数来告知Lazy Load,图片距可视范围多远时,应当被加载了。默认值为0(当图片在可视区域内时才被加载)。

$("img").lazyload({ threshold : 200 });

  将threshold设置为200,图片将在距可视区域200像素内,被加载。 

占位图片

  你可以设置占位图片以及触发加载图片的事件。placeholder参数应当是一个指向图片的URL。插件自带透明、灰色和白色的1×1图片。

$("img").lazyload({ placeholder : "img/grey.gif" }); 

触发加载事件

  触发事件可以是任何jQuery事件,如clickmouseover。你也可以使用自定义的事件,如sportyfoobar。默认的事件是等待用户下拉滚动条至指定范围内。

  以下代码可使图片使用灰色占位图,当用户单击占位图时,图片才被加载:

$("img").lazyload({
    placeholder : "img/grey.gif",
    event : "click"
});

使用特效

  当图片完全加载时,插件默认使用show()来显示它。你可以使用任何你想要的效果。以下代码使用fadeIn效果。单击链接查看效果

$("img").lazyload({
    placeholder : "img/grey.gif",
    effect : "fadeIn"
});

容器中的图片

  插件也可以被用于可滚动的容器中,如带有滚动条的层。将容器的jQuery对象作为参数传递即可。这里有一个水平垂直的容器演示。

#container {
    height: 600px;
    overflow: scroll;
}
$("img").lazyload({
     placeholder : "img/grey.gif",
     container: $("#container")
});

当图片显示顺序与代码循序不一致时

  (译者注:jQuery遍历img是按照<img />标签在HTML代码中的顺序进行的,而浏览器显示网页则是按照CSS布局,因此两者的顺序有可能不一致。同时,为了加快运行速度,Lazy Load设置了一种机制:当遍历未加载图片超过n个均不在显示区域内时,停止此次遍历,即停止加载图片。)

  当页面滚动后,Lazy Load会遍历未加载的图片,检查每张图片是否已在可视区域内。默认情况下,循环将在发现第一张不在可视区域内图片时停止。这样处理基于以下考虑:图片在网页上的顺序与在HTML代码中的顺序是一致的。但有些布局中,这样的假设是错的。你可以通过failurelimit选项来控制加载行为。

$("img").lazyload({
    failurelimit : 10
});

  将failurelimit设置为10,表示Lazy Load将在遍历到10个不可见的图片之后,停止加载任何图片。如果你的布局怪异,请调高此参数。

延迟加载图片

  Lazy Load没有提供延迟加载图片特性,但有变通的方法来实现它。以下代码将在页面完成加载(包括HTML与可见图片)5秒种后,自动加载不在可视区域内的图片。你可以点击查看延迟加载演示

$(function() {
    $("img:below-the-fold").lazyload({
        placeholder : "img/grey.gif",
        event : "sporty"
    });
});
$(window).bind("load", function() {
    var timeout = setTimeout(function() {$("img").trigger("sporty")}, 5000);
});

下载

  http://www.appelsiini.net/projects/lazyload

已知问题

  根据webkit bug #6656 Lazy Load在Safari下无效,浏览器会一口气加载全部图片。

  在IE浏览器、jQuery 1.3.x版本下,插件的工作将会被打破。所有图片将被一口气地加载,即使它们还不该被加载。我正在全力修复它。插件目前只能在jQuery 1.2.6下工作。

  当你使用Mint时,你得将mint的标记放在页面头部。Mint的标记放在页面尾部时,将会与Lazy Load发生冲突。只是很罕见的问题。如果有人知道如何解决,请告诉我。

标签:, , , ,

相关日志

3 条评论

  1. 张雁鹏 说:

    taobao改版的时候也使用了lazyload技术,名字很有趣,叫kissy。
    http://a.tbcdn.cn/kissy/1.0.0/build/imglazyload/imglazyload-min.js
    而且没有在Safari下图片一口气全部加载的BUG。可以访问此页面测试:
    http://item.taobao.com/auction/item_detail-db2-40bf204e5649a66e46569df3ab92db70.jhtml

  2. Hackfan 说:

    Kissy是一个轻量级的网页文本编辑器
    也许lazyload也将被包含在Kissy框架中

  3. 360 说:

    正找这个呢.谢谢分享.

留下评论