延迟加载图片(懒加载)

什么是延迟加载

延迟加载又称懒加载(lazyload),是前端开发人员对网页性能优化的一种方案。延迟加载主要针对两种情况进行优化,一种是针对数据做延迟加载优化,一种是针对对象实例延迟创建优化。
工作原理:

  • 在HTML构造输出的时候,先不要设置图片标签img的src属性,改用其他属性(如lazy);
  • 要判断图片(其他资源同理)是否在当前可视屏范围;
  • 根据第二条的判断把其他属性(如lazy)中保存的值上设置给src属性,这样用户浏览到哪里浏览器就会加载哪里的图片。

延迟加载的实例

延迟加载图片比较麻烦的地方是如何判断图片位置。要获得元素相对页面的绝对位置,通常使用offsetTop,但是这个属性只是取得元素父元素的相对位置,如果元素的父元素或父元素的父元素设置了相对定位或绝对定位,那么这个值显然是不准确的。
所以,首先要用遍历的方式来获取元素的页面绝对边距。

	eg.getTop = function(El){
             var top = 0;
             do{
                 top += El.offsetTop;//计算Top值
             }while((El = El.offsetParent).nodeName != 'BODY');//获取到body结点为止
             return top;
         };
	return eg;
});

然后,根据取得的值判断是否应该显示

eg.lazy = function(){
	var doc = document;
	var top = doc.documentElement.scrollTop || doc.body.scrollTop;		//滚动条到顶部的高度
	var winH = doc.documentElement.clientHeight||doc.body.clientHeight;	//可视窗口的高度
	var imgs = doc.getElementsByTagName("img");
	//对所有图片进行批量判断是否在浏览器显示区域内
	for(var i=0 ; i < imgs.length; i++){
		var _src = imgs[i].getAttribute('lzay-src');
		if( _src !== imgs[i].src ){					//判断图片是否已经显示过
			var _top = eg.getTop(imgs[i]);			//获取图片相对于顶部的位置
			if( _top >= top && _top <= top+winH){	//判断图片是否在显示区域内
				imgs[i].src = _src;
			}
		}
	}
}

最后构建一个HTML代码

<!DOCTYPE html>
<html>
<head>
<title>懒加载</title>
<style>
div{float:left; min-width:150px; min-height:150px;}
</style>
</head>
<body>
<div><img src="loading.gif" lzay-src="1.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="2.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="3.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="4.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="5.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="6.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="7.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="8.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="9.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="10.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="11.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="12.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="13.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="14.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="15.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="16.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="17.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="18.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="19.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="20.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="21.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="22.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="23.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="24.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="25.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="26.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="27.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="28.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="29.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="30.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="31.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="32.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="33.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="34.jpg" alt=""></div>
<div><img src="loading.gif" lzay-src="35.jpg" alt=""></div>
</body>
</html>
<script src="base.js"></script>
<script src="eg5.js"></script>
<script>
eg.lazy();//判断页面打开时的第一屏是否有需要加载的图
window.onscroll = function(){//onscroll,onload,onresizeֻ只能这样添加
	eg.lazy();
}
</script>

猜你喜欢

转载自blog.csdn.net/zLanaDelRey/article/details/85928114
今日推荐