100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 基于原生js的图片延迟加载

基于原生js的图片延迟加载

时间:2021-02-08 18:52:03

相关推荐

基于原生js的图片延迟加载

当页面图片比较多的时候,我们通常会做一个延迟加载,避免页面打开时一下子的请求数太多,加载过慢影响用户体验。

如果项目用了jquery框架,则可以直接用 jquery.lazyload.可在jquery官网下载到。

如果项目是基于原生js的,可以参考以下:

<!doctype html><html lang="en"><head><meta charset="UTF-8"><title>lazyload class</title><style>img{width:auto; height:300px;}</style></head><body><h1>测试图片延迟加载效果</h1><p><img data-url="images/p1.jpg" src="images/grey.gif" alt="p1"></p><p><img data-url="images/p2.jpg" src="images/grey.gif" alt="p2"></p><p><img data-url="images/p3.jpg" src="images/grey.gif" alt="p3"></p><p><img data-url="images/p4.jpg" src="images/grey.gif" alt="p4"></p><p><img data-url="images/p5.jpg" src="images/grey.gif" alt="p5"></p><p><img data-url="images/p6.jpg" src="images/grey.gif" alt="p6"></p><script>var API = {on : function(ele, ev, handler){ele.addEventListener ? ele.addEventListener(ev, handler) : ele.attachEvent('on' + ev, handler);return ele;},bind: function(obj, handler){return function(){ handler.apply(obj,arguments); }},pageX: function(ele){var left = 0;do{left += ele.offsetLeft;}while(ele.offsetParent && (ele = ele.offsetParent).className.toLowerCase() !=='body');return left;},pageY: function(ele){var top = 0;do{top += ele.offsetTop;}while(ele.offsetParent && (ele = ele.offsetParent).className.toLowerCase() !=='body');return top;},hasClass: function(ele,cls){return new RegExp('^|\\s' + cls + '\\s|$').test(ele.className);},attr: function(ele,attr,val){if(val===undefined){return ele.getAttribute(attr);}else{return ele.setAttribute(attr, val);}}};function Lazyload(id, diff, attr){this.container = typeof id === 'string' ? document.getElementById(id) : document.body;this.imgs = [].slice.call(this.container.getElementsByTagName('img'));this.diff = diff || 0;this.attr = attr || "data-url";this.load();//尝试加载正处在视窗中的图片this.spyScroll();}Lazyload.prototype = {constructor: Lazyload,spyScroll: function(){API.on(window, 'scroll', API.bind(this, this.load) );},load: function(){if(!this.imgs.length) return; //all image loadedvar pos,url,imgs = this.imgs.slice();//copy the arrayvar c=0;for(var i = 0, len = imgs.length; i < len; i++){pos = this.pos2viewport(imgs[i]); if(pos === 'above' || pos === 'in'){ //console.log(imgs[i],pos,i,'imgs.length=',len); url = API.attr(imgs[i], this.attr); API.attr(imgs[i], 'src',url);API.on(imgs[i], 'load', function(){this.style.width='auto';//图片加载后 采用图片真实尺寸this.style.height = 'auto';});this.imgs.splice(i-c,1); c++;//保持两数组元素的对应关系 }}},pos2viewport:function(img){//img's position relative to viewport. above, in , belowvar imgScrollTop = API.pageY(img), diff = this.diff,rangeT = imgScrollTop - diff,rangeB = imgScrollTop + img.clientHeight + diff,viewportT = document.documentElement.scrollTop || document.body.scrollTop,viewportB = viewportT + document.documentElement.clientHeight;var pos = '';viewportT >= rangeB && (pos = 'above');viewportB <= rangeT && (pos = 'below');!pos && (pos = 'in');return pos;}};var lazy = new Lazyload(document.body, 50);</script></body></html>

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。