上一篇文章中以相册为例,介绍了图片预加载的预先加载。这次将对图片预加载的延迟加载(或者说是按需加载)进行相关介绍。
图片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;
}
}