为什么需要页面图片惰性延迟加载?

当页面内图片达到一定的数量,页面的加载速度就越来越差.

我们并不需要把所有图片一次性加载完,而且,用户也不会一次性把所有图片看完.

所以,我们需要做的就是按需加载,只显示用户需要看的图片

图片惰性延迟加载好处

1. 按需加载图片,加快加载页面速度

2. 减少对服务器的请求数

3. 减少初始页面加载页面大小

图片惰性延迟加载坏处

1. SEO,因为图片都被替换成假的图片,所以会影响图片的收录,所以这功能不建议在详情页使用

图片惰性延迟性能对比

未加图片惰性加载功能:

已加图片惰性加载功能:

(FF firebug测试数据)由图片可以看出,请求数,页面大小,加载时间,都快了将近一倍~!!!

图片惰性延迟加载程序思路

1. 把需要延迟加载的图片加一个标识

2. 获取这些被标识的图片离页面顶部的高度

3. 添加浏览器滚动条事件,当滚动条滑动时,判断有哪些图片在这个可视区域内

4. 把可视区域内的图片替换真实的图片

5. 去除已替换成功的图片的标识

6. 若全部图片已替换,移去滚动条事件

图片惰性延迟加载关键代码

1. 获取图片距离页面顶部的高度

get_pos:function(elem){if(!elem) return false;var left = elem.offsetLeft,top = elem.offsetTop,current = elem;if(!top){while(current!=document && current!=null && !current.offsetTop){ current = current.parentNode ;}}else{current = elem.offsetParent || elem.parentNode ;}while(current!=document && current!=null){left += current.offsetLeft;top += current.offsetTop;current = current.offsetParent || current.parentNode ;}return {"left": left, "top": top};}

我们利用offsetTop和offsetParent获取当前元素离页面顶部高度

*这里需要注意,在IE浏览器,隐藏的元素的offsetTop值会是0

2.获取页面可视区域底部到页面顶部的距离

1 var winHeight=win.innerHeight || document.documentElement.clientHeight; 2 3 4 var scrTop=document.body.scrollTop || document.documentElement.scrollTop;

*这里需要注意IE和webkit获取滚动条滚动距离和页面可视区域高度的方式都不同

3.判断图片是否在可视区域内

 1 if(iSrc){ 2    if(winHeight+scrTop+This.img.lazy>=node.xLazyPos.top && scrTop−This.img.lazy<=node.xLazyPos.top){
 3     var img=new Image();
 4        img.onload = function(){
 5        node.setAttribute('src',iSrc);
 6    };
 7      img.src=iSrc;
8  }

 

图片惰性延迟加载进阶效果

1. 当浏览器可视区域大小变化的时候,图片距离页面顶部的距离将会改变,这时我们应该重新获取数据

2. 图片替换时可加一个渐变效果,这样会不会感觉那么生硬

3. 滚动条左右滑动显示图片

4. ect

图片惰性延迟加载用法

1. 插入JS

<script type="text/javascript" src="xManLazyLoad.js" ></script>

2.修改图片需要惰性加载的图片属性

1 <img src="http://placehold.it/90x90"  class="xLazyClass" xLazyImg="http://image.game.uc.cn/2014/3/6/9656443.png" />

1. src:  初始加载的假图片

2. class: 插件会搜class带有 xLazyClass 这名称的图片

3. xLazyImg: 图片的真实路径,预备替换

做完已经两个步骤就可以了,接下来的工作就交给JS插件吧~

PS:如果你嫌弃我的 xLazyClass 和 xLazyImg 名字太长,可以修改下喔

1 <script type="text/javascript" src="xManLazyLoad.js" id="xManLazyLoad" xdata-class="Class" xdata-attr="Img" xdata-lazy="100" ></script>

1. id: 如果要修改设置必须加上 xManLazyLoad

2. xdata-class: 修改需要标识的class的名称,如果修改成 xdata-class="aImg" ,则插件只会搜class是aImg的图片

3. xdata-attr: 修改图片的真实路径名称,如果修改则将原本的  xLazyImg 修改成其他

4. xdata-lazy: 惰性值,就是滚动条的惰性范围,默认是 20

插件源码:

/*** 名称:xmanLazyLoad* 功能:网页图片惰性加载,兼容各浏览器* 用法: 使用方法:1.加载JS<script type="text/javascript" src="lazy_load.js" ></script>2.设置IMG属性<img src="http://placehold.it/90x90"  class="xLazyClass" xLazyImg="http://image.game.uc.cn/2014/2/17/9631225.jpg" alt="仙剑奇缘"/>API1.设置class需要惰性加载的图片class="xLazyClass"2.设置图片真实路径xLazyImg="http://image.game.uc.cn/2014/2/17/9631225.jpg"3.设置图片假路径src="http://placehold.it/90x90"* @author luozx* @Email luozx@ucweb.com* @version 1.0.0* @dependencies none*/
(function(a,b){var c={getByClass:function(a,b){for(var c=a.getElementsByTagName("*"),d=[],e=new RegExp("\\b"+b+"\\b","i"),f=0;f<c.length;f++)e.test(c[f].className)&&d.push(c[f]);return d},get_pos:function(a){if(!a)return!1;var b=a.offsetLeft,c=a.offsetTop,d=a;if(c)d=a.offsetParent||a.parentNode;else for(;d!=document&&null!=d&&!d.offsetTop;)d=d.parentNode;for(;d!=document&&null!=d;)b+=d.offsetLeft,c+=d.offsetTop,d=d.offsetParent||d.parentNode;return{left:b,top:c}},removeClass:function(a,b){if(!a||!a.className)return!1;for(var c=a.className.split(" "),d=!1,e=0;e<c.length;e++)if(c[e]===b){c.splice(e,1),d=!0;break}if(d){if(a.className="",c.length<1)return d;if(1==c.length)a.className=c[0];else if(c.length>1)for(var e=0;e<c.length;e++)a.className+=e==c.length-1?c[e]:c[e]+" "}return d},addEvent:function(a,b,c){if(a){if(a.addEventListener)return a.addEventListener(b,c,!1);if(a.attachEvent)return a.attachEvent("on"+b,c);a["on"+b]=c}},removeEvent:function(a,b,c){if(a){if(a.removeEventListener)return a.removeEventListener(b,c,!1);if(a.detachEvent)return a.detachEvent("on"+b,c);a["on"+b]=null}},startMove:function(a,b,d){clearInterval(a.timer),a.timer=setInterval(function(){var e=!0;for(var f in b){var g=0;g=parseInt("opacity"==f?100*parseFloat(c.getStyle(a,f)):c.getStyle(a,f));var h=(b[f]-g)/8;h=h>0?Math.ceil(h):Math.floor(h),g!=b[f]&&(e=!1),"opacity"==f?(a.style.filter="alpha(opacity:"+(g+h)+")",a.style.opacity=(g+h)/100):a.style[f]=g+h+"px"}e&&(clearInterval(a.timer),d&&d())},30)},getStyle:function(a,b){return a.currentStyle?a.currentStyle[b]:getComputedStyle(a,!1)[b]}},d={init:function(){this.parm(),this.getImg(),this.getPos(),this.bindEvent(),this.lazyShow()},parm:function(){var a=b.getElementById("xManLazyLoad");this.img={},this.img.onerrorImgUrl="",this.img.srcStore=a?a.getAttribute("xdata-attr"):"xLazyImg",this.img.className=a?a.getAttribute("xdata-class"):"xLazyClass",this.img.lazy=a?parseInt(a.getAttribute("xdata-lazy")):20},getImg:function(){this.img.node=c.getByClass(b.getElementsByTagName("body")[0],this.img.className),this.img.length=this.img.node.length},getPos:function(){for(var a=d,b=0;b<a.img.node.length;b++)a.img.node[b].xLazyPos=c.get_pos(a.img.node[b])},bindEvent:function(){this.img.node.length>0&&(c.addEvent(a,"scroll",this.lazyShow),c.addEvent(a,"resize",this.getPos))},lazyShow:function(){var e=d,f=a.innerHeight||document.documentElement.clientHeight,g=document.body.scrollTop||document.documentElement.scrollTop;if(e.img.length>0)for(var h=0;h<e.img.node.length;h++)~function(a){var b=e.img.node[a],d=b.getAttribute(e.img.srcStore);if(d&&f+g+e.img.lazy>=b.xLazyPos.top&&g-e.img.lazy<=b.xLazyPos.top){var h=new Image;h.οnlοad=function(){b.style.filter="alpha(opacity:0)",b.style.opacity=0,b.setAttribute("src",d),e.img.length--,c.startMove(b,{opacity:100}),c.removeClass(b,e.img.className),b.removeAttribute(e.img.srcStore)},h.src=d}}(h);else e.img.node=c.getByClass(b.getElementsByTagName("body")[0],e.img.className),e.img.length=e.img.node.length,e.img.length<=0&&c.removeEvent(a,"scroll",e.lazyShow),c.removeEvent(a,"resize",e.getPos)}};d.init()}(window,document));

View Code

转载于:https://www.cnblogs.com/zerolo/p/3666841.html

原生javascript图片惰性延迟加载插件lazyload–兼容PC端手机端相关推荐

  1. 电脑端音乐播放器html5,原生js的音频播放器,兼容pc端和移动端(原创)

    插件描述:基于原生的音频播放器效果,小巧易用 更新时间:2018/12/10 下午3:08:16 更新说明: 1. 更新demo的音频地址 2. 组件的图片地址使用本地base64的图片格式 更新时间 ...

  2. 黄聪:原生js的音频播放器,兼容pc端和移动端(原创)

    更新时间:2018/9/3 下午1:32:54 更新说明:添加音乐的loop设置和ended事件监听 loop为ture的时候不执行ended事件 1 2 3 4 5 6 7 8 9 10 11 12 ...

  3. window.open 兼容 PC 和手机端

    window.open 由于浏览器安全策略的原因,在 PC 和手机端的表现可能会出现不同 更多精彩 更多技术博客,请移步 asing1elife's blog 导致不同的根本原因 由于 window. ...

  4. pc端html轮播带滑块,swiper.js简单快速实现轮播滑动(兼容PC端、移动端)

    swiper是一款免费以及轻量级轮播滑动的js框架,适用于PC端跟移动端,官方地址:(https://www.swiper.com.cn/) 效果演示: PC端 移动端(在浏览器将设备切换为手机,这里 ...

  5. 微信小程序 商品报价表格 兼容PC端、手机端

    1.固定表头.表格行高由内容撑开 2.图片自适应居中.图片预览 3.筛选条件置顶.显示所选的筛选分类 4.触底加载下一页 5.表格文字可复制 6.支持手机横屏.竖屏切换.横屏时隐藏底部 tabbar ...

  6. 移动端/手机端 完成图片旋转 压缩 剪裁 上传

    本篇文章主要介绍移动端/手机端图片的旋转.压缩.剪裁.上传 这个功能的实现已经好了几次方案流程了,对最终的方案流程进行简述 实现功能的主要方法/思想 1.图片的选取主要是通过input实现 2.图片的 ...

  7. [html] 制作一个页面时,需要兼容PC端和手机端,你是要分别做两个页面还是只做一个页面自适应?为什么?说说你的理由

    [html] 制作一个页面时,需要兼容PC端和手机端,你是要分别做两个页面还是只做一个页面自适应?为什么?说说你的理由 两个页面 pc端布局和交互行为跟移动端不一样, 两个页面反而更好维护 个人简介 ...

  8. html自动跳转手机端,用JavaScript实现网站自动跳转电脑PC端与手机端不同页面

    前天,有一个网友希望在其微擎系统跳转的时候实现鉴别用户不同的客户端,比如电脑PC端和手机端,实现不同的页面跳转.对于之前老蒋有给其设置过PC端网站然后检测手机访问的时候跳转到WAP网站的案例,对于这个 ...

  9. 设置背景图片的两种方式,并解决手机端背景图片高度自适应问题

    设置背景图片的两种方式,并解决手机端背景图片高度自适应问题 参考文章: (1)设置背景图片的两种方式,并解决手机端背景图片高度自适应问题 (2)https://www.cnblogs.com/Dark ...

最新文章

  1. 关于文献检索的一些思考
  2. 【8.23更新--技术干货全家桶】大数据计算技术共享计划 — MaxCompute技术公开课第二季...
  3. 集体智慧编程 - 构建价格模型
  4. mysql cmake错误_MySQL5.5安装出现CMake错误找不到CMakelists.txt原因-阿里云开发者社区...
  5. nginx 如何解析php文件php-fpm的解释
  6. 用 Python 实现的线程池
  7. tensorflow之reduce_mean
  8. linux svn客户端通过 https访问windows VisualSVN Server Manager
  9. Android arm64-v8a、armeabi-v7a、armeabi详解
  10. 软件测试用例.范文,软件测试用例模板范文.doc
  11. Windows设置自己的程序开机自动启动
  12. 【转】告诉你外语学习的真实方法及误区分析(精编版)-part 3
  13. 555定时器与频率测量
  14. 计算机网络CRC冗余码的计算
  15. LayUI分页,LayUI动态分页,LayUI laypage分页,LayUI laypage刷新当前页
  16. idea查看代码行数Statistic
  17. wifi的WPS功能
  18. 微信内分享网页自定义标题,图片,描述
  19. 勒索病毒修复SQL数据库修复文档文件服务器中毒远程处理数据恢
  20. 微分算子法 求微分方程特解 (超简单)

热门文章

  1. lolloding界面显示服务器连接失败,设计师谈:将屏蔽Loading界面的Ping值
  2. 为什么说联想的智慧城市会带来新气象?
  3. IoT黑板报0113:半数人的工作机器人都能做 但你暂时不会失业
  4. 黑石加持高盛承销,Bumble上市欲与Tinder一较高下?
  5. iphone itouch 实用插件
  6. 好程序员大数据培训分享大数据就业方向有哪些?
  7. 【ASP.NET】简单使用select下拉框,DropDownListFor用法
  8. tensorflow实战自学【三】
  9. 对比Java的Stream流和C# 的Linq
  10. MySQL插入汉字报错的解决方案