不少网站都会用到‘图片懒加载’这种方式对网站进行优化,即延迟加载图片或符合某些条件才开始加载图片。因而心血来潮,决定本身手动写一下’图片懒加载‘插件。git
使用这个技术有什么显著的优势?github
好比一个页面中有不少图片,如淘宝首页等等,一个页面有100多的图片,若是一上来就发送这么多请求,页面加载就会很漫长,若是js文件都放在了文档的底部,恰巧页面的头部又依赖这个js文件,那就很差办了。用户感受这个页面就会很卡。数组
懒加载原理:浏览器会自动对页面中的img标签的src属性发送请求并下载图片。经过动态改变img的src属性实现。浏览器
当访问一个页面的时候,先把img元素或是其余元素的背景图片路径替换成loading图片地址(这样就只需请求一次)服务器
等到必定条件(这里是页面滚动到必定区域),用实际存放img地址的laze-load属性的值去替换src属性,便可实现’懒加载’。闭包
//即便img的src值为空,浏览器也会对服务器发送请求。因此平时作项目的时候,若是img没有用到src,就不要出现src这个属性ide
先上三个重要的知识点函数
1.获取屏幕可视窗口大小:优化
document.documentElement.clientHeight 标准浏览器及低版本IE标准模式网站
document.body.clientHeight 低版本混杂模式
2.元素相对于文档document顶部
element.offsetTop
3.滚动条滚动的距离
document.documentElement.scrollTop 兼容ie低版本的标准模式
document.body.scrollTop 兼容混杂模式;
滚动加载:当图片出如今可视区域时,动态加载该图片。
原理:当图片元素顶部是否在可视区域内,(图片相对于文档document顶部-滚动条滚动的距离)
实现原理:
首先从全部相关元素中找出须要延时加载的元素,放在element_obj数组中。
function initElementMap() { var el = document.getElementsByTagName('img'); for (var j = 0, len2 = el.length; j < len2; j++) { //判断当前的img是否加载过了,或者有lazy_src标志 [未完成] if (typeof (el[j].getAttribute("lazy_src"))) { element_obj.push(el[j]); download_count++; } } }
2.判断数组中的img对象,若知足条件,则改变src属性
function lazy() { if (!download_count) return; var innerHeight = getViewport(); for (var i = 0, len = element_obj.length; i < len; i++) { //获得图片相对document的距上距离 var t_index = getElementViewTop(element_obj[i]); if (t_index - getScrollTop() < innerHeight) { element_obj[i].src = element_obj[i].getAttribute("lazy-src"); delete element_obj[i]; download_count--; } } }
3.滚动的时候触发事件,1000毫秒后执行lazy()方法。
window.onscroll = window.onload = function () { setTimeout(function () { lazy(); }, 1000) }
整部分代码位于闭包自执行函数中。相应的方法放在init中。
var lazyLoad = (function () { function init() { initElementMap(); lazy(); }; return { init: init } })();
使用格式 :src填默认loading图片地址,真实的图片地址填在lazy-src属性里,切记需指定宽高。在外部调用 lazyLoad.init();
所有的代码以及例子已经上传到github上了,地址是:https://github.com/beidan/lazeLoadImg,欢迎star。