懒加载原理就是先利用自定义属性存放图片资源,然后监听浏览器窗口,滑动的时候才设置图片资源(发送请求),从而实现懒加载效果。
代码如下:
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8" /> <title>懒加载</title> </head> <style type="text/css"> div:not(#wrapper) { display: block; height: 400px; } </style> <body> <div id="wrapper"> <a href="#" class="image featured"><img data-src="http://img02.sogoucdn.com/app/a/100520093/60d2f4fe0275d790-fbe7539243950f9f-7f669dbeead0ad667f21be96b5efd843.jpg" /></a> <div>占位</div> <a href="#" class="image featured"><img data-src="http://bizhi.zhuoku.com/2010/10/22/kuanping/kuanping39.jpg" /></a> <div>占位</div> <a href="#" class="image featured"><img data-src="http://image.tianjimedia.com/uploadImages/2011/306/MOH58845COC4.jpg" /></a> <div>占位</div> <a href="#" class="image featured"><img data-src="http://image.tianjimedia.com/uploadImages/2011/306/EQ2E3ZUPNMNV.jpg" /></a> <div>占位</div> <a href="#" class="image featured"><img data-src="http://a2.att.hudong.com/79/22/01000000000000119062273272179.jpg" /></a> <div>占位</div> <a href="#" class="image featured"><img data-src="http://img1.3lian.com/2015/w7/90/d/5.jpg" /></a> <div>占位</div> <script> //针对firefox的load事件 window.addEventListener("DOMContentLoaded", lazyLoadImages); //通用load事件 window.addEventListener("load", lazyLoadImages); //浏览器窗口调整 window.addEventListener("resize", lazyLoadImages); //页面滚动事件 window.addEventListener("scroll", lazyLoadImages); function lazyLoadImages() { var images = document.querySelectorAll("img[data-src]"); //遍历所有的img标签 //[].forEach.call(...)是Array.prototype.forEach.call(...)简写 [].forEach.call(images, function(item) { //item是images数组对象,即是一个个img标签 if(elementInViewport(item)) { //将data-src替换src属性 item.setAttribute("src", item.getAttribute("data-src")); item.removeAttribute("data-src") } }) if(images.length == 0) { window.removeEventListener("DOMContentLoaded", lazyLoadImages); window.removeEventListener("load", lazyLoadImages); window.removeEventListener("resize", lazyLoadImages); window.removeEventListener("scroll", lazyLoadImages); } } //元素 function elementInViewport(el) { //获取DOMRect对象边框相对于浏览器的位置 var rect = el.getBoundingClientRect(); //返回DOMRect对象上下左右的位置坐标 return( rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && rect.right <= (window.innerWidth || document.documentElement.clientWidth) ); } </script> </body> </html>
附图:
从上图可以看出连续发送请求来加载图片。
PS:此代码仅用于研究懒加载功能具体怎么实现。具体请参考LazyLoad.js插件。
总结:实际的项目中,建议使用LazyLoad.js(2.0)插件或者blazy.js插件,提高页面性能。