代码分享之图片延迟载入
对于图片很多,而且很长的页面,也许第三屏后面的很少有用户滚动下去查看。如果图片也照样载入的话,是不是觉得有点浪费带宽,也浪费图片服务器的连接数。这个时候延迟载入很重要,按需载入。PV越大的效果越明显,废话少说,先看代码:
var LAZY=(function(){ var pResizeTimer = null; var imgs={}; function addEventHandler (oTarget, sEventType, fnHandler) { if (oTarget.addEventListener) { oTarget.addEventListener(sEventType, fnHandler, false); } else if (oTarget.attachEvent) { oTarget.attachEvent("on" + sEventType, fnHandler); } else { oTarget["on" + sEventType] = fnHandler; } }; function resize(){ if(pResizeTimer) return ''; pResizeTimer = setTimeout(function(){ resize_run(); try{ clearTimeout(pResizeTimer); } catch(e){} pResizeTimer=null; }, 100); } function resize_run(){ var min={}; var max={}; min.Top = document.body.scrollTop + document.documentElement.scrollTop; min.Left=document.documentElement.scrollLeft; max.Top=min.Top+document.documentElement.clientHeight; max.Left=min.Left+document.documentElement.clientWidth; for(var i in imgs){ if(imgs[i]){ var _img=imgs[i]; var img=document.getElementById(i); var width = img.clientWidth; var height = img.clientHeight; var wh=position(img); if( (wh.Top>=min.Top && wh.Top<=max.Top) || ((wh.Top+height)>=min.Top && wh.Top<=max.Top) ) { img.src=_img.src; delete imgs[i]; } } } } function position(o){ var p={Top:0,Left:0}; while(!!o){ p.Top+=o.offsetTop; p.Left+=o.offsetLeft; o=o.offsetParent; } return p; } return { init:function(){ for(var i=0;i<document.images.length;i++){ var img = document.images[i]; var config={}; config.id = img.id; config.src = img.getAttribute('_src'); if(config.src && !config.id){ config.id = encodeURIComponent(config.src) + Math.random(); img.id = config.id; } if(!config.id || !config.src) continue; LAZY.push(config); } return LAZY; }, push:function(config){ imgs[config.id] = config; }, run:function(){ resize_run(); addEventHandler(window,'scroll',resize); } }; })();
使用方法很简单,2个步骤:
1 img的标签的src属性指向一个空地址,或者一个1×1的空白图片,_src属性指向实际图片地址,如:
<img src="" _src="path/to/img.jpg" />
2 在页面底部或者body onload里面:
LAZY.init().run();
在公司千万级的PV项目上使用了,据说效果不错喔!