图片预加载之延迟加载2-懒加载

      上一篇文章中以相册为例,介绍了图片预加载的预先加载。这次将对图片预加载的延迟加载(或者说是按需加载)进行相关介绍。
图片img标签还放在页面上,但并不给它赋值src,当用户看的时候再加载。为此,我们要解决两个问题:
      一、如何知道用户要看哪些图片(也就是对进入到可视区域的图片进行加载)
      二、当图片进入可视区域内,用户要看的图片src存放在那里
下面用代码进行说明:

html部分如下:

<ul id="ul1">
    <li>
        <img _src="img/1.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/2.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/3.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/4.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/5.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/6.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/7.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/8.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/1.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/2.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/3.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/4.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/5.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/6.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/7.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/8.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/1.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/2.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/3.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/4.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/5.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/6.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/7.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/8.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/1.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/2.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/3.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/4.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/5.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/6.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/7.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/8.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/1.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/2.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/3.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/4.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/5.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/6.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/7.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/8.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/1.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/2.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/3.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/4.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/5.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/6.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/7.jpg" src="img/white.JPG"/>
    </li>
    <li>
        <img _src="img/8.jpg" src="img/white.JPG"/>
    </li>
</ul>

      这里给所有图片一个默认的图片地址src=”img/white.JPG”(一个白色的图片)是为了解决下图片没有src出现的显示问题,如下图
这里写图片描述

css部分如下:

*{margin:0;padding:0;}
#ul1{margin:100px auto 0;}
li{float:left;margin:0 0 10px 10px;list-style:none;border:1px solid #000;}
img{width:300px;height:200px;display:block;}

js部分如下:

      当图片到顶部的距离小于滚动距离+可视区域的高,则表示图片在可视区域内,则可视区域内的图片应该加载。如果图片到顶部的距离大于滚动距离+可视区域的高,图片不在可视区域内,不应该加载。

这里写图片描述

window.onload = function(){
    var oUl = document.getElementById("ul1");
    var aImg = oUl.getElementsByTagName('img');
    showImage();

    window.onscroll = showImage;

    // 需要展示加载的图片
    //isLoad标记表示可视区域内图片是否重复加载过,如果加载过则不再加载
    function showImage(){
        var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
        for(var i = 0; i < aImg.length; i++){
            //当图片到顶部的距离小于滚动距离+可视区域的高,则表示图片在可视区域内
        if(!aImg[i].isLoad && getTop(aImg[i]) < scrollTop    + document.documentElement.clientHeight){
                // console.log(i);
                aImg[i].src = aImg[i].getAttribute('_src');

                // 图片是否已经加载过的标记,如果已经加载过则设为true
                aImg[i].isLoad = true;
            }
        }
    }

    // 获取绝对距离-距离顶部
    function getTop(obj){
        var iTop = 0;
        while(obj){
            iTop += obj.offsetTop;
            obj = obj.offsetParent;
        }
        return iTop;
    }
}

这样我们就利用图片的自定义属性(_src)实现了图片的懒加载,另外一种实现方式方式是把图片的地址预先存到一个数组中。然后循环数组,数组里有多少个图片url,就代表还有多少个图片没有加载完。每加载完这个图片,就把图片路径从数组里删除,当全部加载完之后,数组长度为零,循环结束,这样相比较上面性能更优。

html部分如下:

<ul id="ul1">
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
    <li>
        <img  src="img/white.JPG"/>
    </li>
</ul>

html部分如下:

window.onload = function(){
    var oUl = document.getElementById("ul1");
    var aImg = oUl.getElementsByTagName('img');

    // 存放图片url的数组
    var imgUrlArr = [
        'img/1.jpg',
        'img/2.jpg',
        'img/3.jpg',
        'img/4.jpg',
        'img/5.jpg',
        'img/6.jpg',
        'img/7.jpg',
        'img/8.jpg',
        'img/1.jpg',
        'img/2.jpg',
        'img/3.jpg',
        'img/4.jpg',
        'img/5.jpg',
        'img/6.jpg',
        'img/7.jpg',
        'img/8.jpg',
        'img/1.jpg',
        'img/2.jpg',
        'img/3.jpg',
        'img/4.jpg',
        'img/5.jpg',
        'img/6.jpg',
        'img/7.jpg',
        'img/8.jpg',
        'img/1.jpg',
        'img/2.jpg',
        'img/3.jpg',
        'img/4.jpg',
        'img/5.jpg',
        'img/6.jpg',
        'img/7.jpg',
        'img/8.jpg',
        'img/1.jpg',
        'img/2.jpg',
        'img/3.jpg',
        'img/4.jpg',
        'img/5.jpg',
        'img/6.jpg',
        'img/7.jpg',
        'img/8.jpg',
        'img/1.jpg',
        'img/2.jpg',
        'img/3.jpg',
        'img/4.jpg',
        'img/5.jpg',
        'img/6.jpg',
        'img/7.jpg',
        'img/8.jpg',
        'img/1.jpg',
        'img/2.jpg',
        'img/3.jpg',
        'img/4.jpg',
        'img/5.jpg',
        'img/6.jpg',
        'img/7.jpg',
        'img/8.jpg',
        'img/1.jpg',
        'img/2.jpg',
        'img/3.jpg',
        'img/4.jpg',
        'img/5.jpg',
        'img/6.jpg',
        'img/7.jpg',
        'img/8.jpg',
        'img/1.jpg',
        'img/2.jpg',
        'img/3.jpg',
        'img/4.jpg',
        'img/5.jpg',
        'img/6.jpg',
        'img/7.jpg',
        'img/8.jpg',
        'img/1.jpg',
        'img/2.jpg',
        'img/3.jpg',
        'img/4.jpg',
        'img/5.jpg',
        'img/6.jpg',
        'img/7.jpg',
        'img/8.jpg'
    ];

    showImage();

    window.onscroll = showImage;



    // 需要展示加载的图片
    function showImage(){
        var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
        for(var i = 0; i < aImg.length; i++){
            if(!aImg[i].isLoad && getTop(aImg[i]) < scrollTop + document.documentElement.clientHeight){
                // console.log(i);
                if(imgUrlArr){
                    aImg[i].src = imgUrlArr[0];
                    // 当加载过之后就删掉这个图片地址,下次不再循环
                    imgUrlArr.shift();
                }
                // 图片是否已经加载过的标记,如果已经加载过则设为true
                aImg[i].isLoad = true;
            }
        }
    }

    // 获取绝对距离-距离顶部
    function getTop(obj){
        var iTop = 0;
        while(obj){
            iTop += obj.offsetTop;
            obj = obj.offsetParent;
        }
        return iTop;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值