学习目标:
掌握原生图片懒加载学习内容:
1、 掌握原生图片懒加载 2、 分析js代码 3、 搜索熟悉陌生单词用法 4、 掌握懒加载概念
懒加载顾名思义突出一个“懒”字,懒字就是拖延的意思,说白就是延迟加载。比如我们进入一个新的页面进行加载的时候,这个页面很长超过了屏幕可视区域的时候,那么懒加载就会优先加载我们可视区域可见的内容,剩余部分是当进入到可视区域之后再进行加载。
懒加载是一种优化网页性能的一种方式,它极大的提高了用户的体验。举个栗子:就拿图片来说,一个网站,单个网页的页面上“图片”是构成页面主体的一个极大部分,但是在现在一张图片的大小超过几兆是一件很正常的事,那么就需要注意到一个问题:当用户在访问一个网页的时候就会请求所有图片资源,如果网速不够快的话,那么用户只能够看到一个空白的网页,或者一个不完整的结构布局,当图片加载完成后,估计用户早就走了。
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
HTML部分
代码如下:
<!DOCTYPE html>
<html>
<head>
<title>Demo-Lazyload</title>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<style>
img {
height: 500px;
width: 500px;
display: block;
background: url(images/loading.gif) no-repeat center;
margin: 0 auto
}
#lazy {
width: 800px;
margin: 0 auto
}
</style>
</head>
<body>
<div id="lazy">
<img data-src="images/1.jpg" src="images/pixel.gif" />
<img data-src="images/2.jpg" src="images/pixel.gif" />
<img data-src="images/3.jpg" src="images/pixel.gif" />
<img data-src="images/4.jpg" src="images/pixel.gif" />
<img data-src="images/5.png" src="images/pixel.gif" />
<img data-src="images/6.jpg" src="images/pixel.gif" />
<!--<img data-src="真实图片地址" src="小图片地址"/>
<img data-src="真实图片地址" src="小图片地址"/>-->
</div>
<script src="js/lazyload.js"></script>
<script type="text/javascript">
var lazyloading = lazyload({
id: "lazy",
//定义的加载时间
lazyTime: 200,
//定义的触发范围
lazyRange: 100
});
</script>
</body>
</html>
JS代码
代码如下:
function lazyload(options) {
var doc = options.id ? document.getElementById(options.id) : document;
if (doc === null) return;
var tmp = doc.getElementsByTagName('img'),
tmplen = tmp.length,
imgobj = [];
for (var i = 0; i<tmplen; i++) {
var _tmpobj = tmp[i];
if (_tmpobj.getAttribute('data-src') !== null) {
if (isLoad(_tmpobj)) {
setimg(_tmpobj);
} else {
imgobj.push(_tmpobj);
}
}
}
var len = imgobj.length;
function handler() {
for (var i = 0,
end = len; i < end; i++) {
var obj = imgobj[i];
if (isLoad(obj)) {
_setimg(obj);
imgobj.splice(i, 1);
len--;
if(len===0){loadstop()}
}
}
}
function isLoad(ele) {
var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;
if(typeof ele==='undefined') return false;
var edit = ~~ele.getAttribute("data-range") || options.lazyRange;
var clientHeight = scrollTop + document.documentElement.clientHeight + edit;
var offsetTop = 0;
while(ele.tagName.toUpperCase() !== 'BODY'){
offsetTop += ele.offsetTop;
ele = ele.offsetParent;
}
return (clientHeight > offsetTop);
}
function _setimg(ele) {
if (options.lazyTime) {
setTimeout(function() {
setimg(ele);
},
options.lazyTime + ~~ele.getAttribute('data-time'))
} else {
setimg(ele);
}
}
function setimg(ele) {
ele.src = ele.getAttribute('data-src');
}
function loadstop(){
window.removeEventListener ? window.removeEventListener("scroll", handler, false) : window.detachEvent("onscroll", handler);
}
loadstop();
window.addEventListener ? window.addEventListener("scroll", handler, false) : window.attachEvent("onscroll", handler);
}
其中不是很熟悉的属性和方法
getAttribute
- 获取指定属性名的属性值
scrollTop
- 元素的顶部到视口可见内容(的顶部)的距离的度量。当一个元素的内容没有产生垂直方向的滚动条,那么他的
scrollTop
值为0 。
- 元素的顶部到视口可见内容(的顶部)的距离的度量。当一个元素的内容没有产生垂直方向的滚动条,那么他的
pageYOffset
- 它会返回文档当前沿垂直轴(即向上或者向下)滚动的像素数。
clientHeight
- 元素的高(不包括边框)padding+height,可以理解为元素可视区域的高度。
tagName
- 返回元素的标签名 HTML 返回
tagName
属性值是大写的
- 返回元素的标签名 HTML 返回
offsetParent
- 是距离调用
offsetParent
的元素最近的,已经进行过css
定位的容器属性。如果没有定位,则取body元素的应用。元素的style设置为display:none
时,offsetParent
属性返回null
- 是距离调用
offsetTop
- 获取对象相对于由
offsetParent
属性指定的父坐标距离顶端的高度
- 获取对象相对于由
detachEvent
- 不是w3c标准,通常为了适用于
ie
浏览器,谷歌、open也能使用,和removeEventListener
作用基本相同,必须配合attachEven
t使用。
- 不是w3c标准,通常为了适用于
总结
主要原理
isLoad(ele) {
var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;
if(typeof ele==='undefined') return false;
var edit = ~~ele.getAttribute("data-range") || options.lazyRange;
var clientHeight = scrollTop + document.documentElement.clientHeight + edit;
var offsetTop = 0;
while(ele.tagName.toUpperCase() !== 'BODY'){
offsetTop += ele.offsetTop;
ele = ele.offsetParent;
}
return (clientHeight > offsetTop);
}
通过判断 clientHeight 和 offsetTop 作比较
没有加载到的图片到body的顶部的距离 (使用的方法是while循环从图片的顶部到含有定位属性的父级的距离一级一级到达body) :offsetTop
已经加载过的区域加上自定义向下触发的距离 :clientHeight