插件完整版地址 m-lazy
https://github.com/zhanyouwei...javascript
欢迎关注个人我的公众号,不按期更新本身的工做心得。java
Web 图片的懒加载就是经过读取img元素,而后得到img元素的data-src
(也能够约定为其余属性名)属性的值,并赋予img
的src,从而实现动态加载图片的机制。node
这里须要注意的是: img在初始化的时候不要设置src属性,由于即便设置 src=''
浏览器也会尝试加载图片。git
一个简单的图片懒加载共涉及两个方面,github
咱们首先须要给准备实施懒加载的img
元素添加指定的class
这里为m-lazyload
,同时将img src赋值给 data-src属性。
具体示例为:浏览器
<img class="m-lazyload" data-src="imgUrl">
动态加载总共分为如下几个步骤,这里每一个步骤都将被拆分为独立的函数缓存
window.addEventListener('scroll', _delay, false); function _delay() { clearTimeout(delay); delay = setTimeout(function () { _loadImage(); }, time); }
_loadImage
函数,该函数负责加载图片function _loadImage() { for (var i = imgList.length; i--;) { var el = imgList[i]; if (_isShow(el)) { el.src = el.getAttribute('data-src'); el.className = el.className.replace(new RegExp("(\\s|^)" + _selector.substring(1, _selector.length) + "(\\s|$)"), " "); imgList.splice(i, 1); } } }
虽然执行了_loadImage
函数,可是咱们得知道哪些图片须要被加载,这里的判断依据是什么呢?dom
依据就是判断该图片是否在当前窗口的可视区域内,在这里咱们封装一个_isShow
函数来实现函数
function _isShow(el) { var coords = el.getBoundingClientRect(); return ( (coords.top >= 0 && coords.left >= 0 && coords.top) <= (window.innerHeight || document.documentElement.clientHeight) + parseInt(offset)); }
自此一个图片加载的闭环就造成了性能
当网页滚动的事件被触发 -> 执行加载图片操做 -> 判断图片是否在可视区域内 -> 在,则动态将data-src
的值赋予该图片。
事实就是如此!!!
添加一些自定义参数,谁都喜欢自定义,不是吗?
支持iScroll
, iScroll是一个高性能,资源占用少,无依赖,多平台的javascript滚动插件。
图片加载后移除选择器,避免重复判断。
缓存img元素结合,减小dom元素查询性能损耗
扩展prototype
添加getNode
方法,支持分页数据懒加载(因为咱们以前缓存了dom元素)
OK!说了这么多,show me the code 吧!
(function () { var imgList = [], // 页面全部img元素集合 delay, // setTimeout 对象 offset, //偏移量,用于指定图片距离可视区域多少距离,进行加载 time, // 延迟载入时间 _selector; // 选择器 默认为 .m-lazyload function _isShow(el) { var coords = el.getBoundingClientRect(); return ( (coords.top >= 0 && coords.left >= 0 && coords.top) <= (window.innerHeight || document.documentElement.clientHeight) + parseInt(offset)); } function _loadImage() { for (var i = imgList.length; i--;) { var el = imgList[i]; if (_isShow(el)) { el.src = el.getAttribute('data-src'); el.className = el.className.replace(new RegExp("(\\s|^)" + _selector.substring(1, _selector.length) + "(\\s|$)"), " "); imgList.splice(i, 1); } } } function _delay() { clearTimeout(delay); delay = setTimeout(function () { _loadImage(); }, time); } function ImageLazyload(selector, options) { var defaults = options || {}; offset = defaults.offset || 0; time = defaults.time || 250; _selector = selector || '.m-lazyload'; this.getNode(); _delay();//避免首次加载未触发touch事件,主动触发一次加载函数 if (defaults.iScroll) { defaults.iScroll.on('scroll', _delay); defaults.iScroll.on('scrollEnd', _delay); } else { window.addEventListener('scroll', _delay, false); } } ImageLazyload.prototype.getNode = function () { imgList = []; var nodes = document.querySelectorAll(_selector); for (var i = 0, l = nodes.length; i < l; i++) { imgList.push(nodes[i]); } }; })();