js实现网页图片延时加载 提升网页打开速度


Posted in Javascript onJanuary 26, 2016

提升网页加载速度的方法有很多种,用 jquery.lazyload.js 实现图片异步延迟加载,对于页面包含图片较多的网站来说,会是个不错的提升网页打开速度的方法。代码君网站栏目页列表左侧,在PC端预览时能看到一个文章略缩图展示模块,一定程度上会延长网页加载时间。本文采用图片异步延迟加载的方法,来提升本站页面加载速度。

图片异步加载,就是不必一次性把页面的所有图片都加载显示出来,等用户滑动滚动条到某个位置时才会加载显示相应位置的图片,这样能很好地提升网页加载速度,进一步提升用户体验。

有很多技术性文章的配图是非常多的,如果打开网页时要求能够一次性加载完成所有图片的话,用户等候的时间肯定就得非常长了。这种做法会让用户体验非常不好,况且也没有必要一次性把页面上的所有图片都加载出来。图片异步延迟加载,才是网页设计中最合理最恰当的做法。

js实现网页图片延时加载 提升网页打开速度

我们用 jquery.lazyload.js 来实现图片异步延迟加载,记得要先载入 jQuery 才行。

1、导入 JS 插件:

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

2、在页面中插入 JavaScript 代码:

$(document).ready(function($){
$("img").lazyload({
placeholder:"grey.gif", //加载图片前的占位图片
effect:"fadeIn" //加载图片使用的效果(淡入)
});
});

通过以上两步,就能简单实现网页图片异步延时加载了。

再为大家具体介绍一下:
有时我们看到一些大型网站,页面如果有很多图片的时候,当你滚动到相应的行时,当前行的图片才即时加载的,这样子的话页面在打开只加可视区域的图片,而其它隐藏的图片则不加载,一定程序上加快了页面加载的速度,对于比较长的页面来说,这个方案是比较好的。

推荐:使用jquery图片延迟加载插件jquery.lazyload实现图片延迟

实现原理:

把所有需要延时加载的图片改成如下的格式:

<img lazy_src="图片路径" border="0"/>

然后在页面加载时,把所有使用了lazy_src的图片都保存到数组里,然后在滚动时计算可视区域的top,然后把延时加载的图片中top小于当前可视区域(即图片出现在可视区域内)的图片的src的值用lazy_src的来替换(加载图片):

JS代码:

lazyLoad = (function() {
 
  var map_element = {};
 
  var element_obj = [];
 
  var download_count = 0;
 
  var last_offset = -1;
 
  var doc_body;
 
  var doc_element;
 
  var lazy_load_tag;
 
  function initVar(tags) {
 
    doc_body = document.body;
 
    doc_element = document.compatMode == 'BackCompat' ? doc_body : document.documentElement;
 
    lazy_load_tag = tags || ["img", "iframe"];
 
  };
 
  function initElementMap() {
 
    var all_element = [];
 
    //从所有相关元素中找出需要延时加载的元素
 
    for (var i = 0,
 
len = lazy_load_tag.length; i < len; i++) {
 
      var el = document.getElementsByTagName(lazy_load_tag[i]);
 
      for (var j = 0,
 
len2 = el.length; j < len2; j++) {
 
        if (typeof (el[j]) == "object" && el[j].getAttribute("lazy_src")) {
 
          element_obj.push(all_element[key]);
 
        }
 
      }
 
    }
 
  
 
    for (var i = 0,
 
len = element_obj.length; i < len; i++) {
 
      var o_img = element_obj[i];
 
      var t_index = getAbsoluteTop(o_img); //得到图片相对document的距上距离
 
      if (map_element[t_index]) {
 
        map_element[t_index].push(i);
 
      } else {
 
        //按距上距离保存一个队列
 
        var t_array = [];
 
        t_array[0] = i;
 
        map_element[t_index] = t_array;
 
        download_count++; //需要延时加载的图片数量
 
      }
 
    }
 
  
 
  };
 
  function initDownloadListen() {
 
    if (!download_count) return;
 
    var offset = (window.MessageEvent && !document.getBoxObjectFor) ? doc_body.scrollTop : doc_element.scrollTop;
 
    //可视化区域的offtset=document的高+
 
    var visio_offset = offset + doc_element.clientHeight;
 
    if (last_offset == visio_offset) {
 
      setTimeout(initDownloadListen, 200);
 
      return;
 
    }
 
    last_offset = visio_offset;
 
    var visio_height = doc_element.clientHeight;
 
    var img_show_height = visio_height + offset;
 
    for (var key in map_element) {
 
      if (img_show_height > key) {
 
        var t_o = map_element[key];
 
        var img_vl = t_o.length;
 
        for (var l = 0; l < img_vl; l++) {
 
          element_obj[t_o[l]].src = element_obj[t_o[l]].getAttribute("lazy_src");
 
        }
 
        delete map_element[key];
 
        download_count--;
 
      }
 
    }
 
    setTimeout(initDownloadListen, 200);
 
  };
 
  function getAbsoluteTop(element) {
 
    if (arguments.length != 1 || element == null) {
 
      return null;
 
    }
 
    var offsetTop = element.offsetTop;
 
    while (element = element.offsetParent) {
 
      offsetTop += element.offsetTop;
 
    }
 
    return offsetTop;
 
  }
 
  function init(tags) {
 
    initVar(tags);
 
    initElementMap();
 
    initDownloadListen();
 
  };
 
  return {
 
    init: init
 
  }
 
})();

使用方法:把页面上需要延时加载的图片src改成为lazy_src,然后把上面的js放到body最后面,然后调用:lazyLoad.init();
调戏的方法可以使用firebug来查看一时图片是否是延时加载。
另外:
如果你的页面上存在有内容切换的栏目的话,可能在切换时切换的内容里的图片可能会不显示,处理的方法是在内容时单独图片加载处理,如:

///切换内容的代码…
 
 chlid.find("img[init_src]").each(function(){
 
  $(this).attr("src",$(this).attr("init_src"));
 
  $(this).removeAttr("init_src");
 
 });

  所谓图片异步加载,意思是不用一次把图片全部加载完,你可以叫它延迟加载,缓冲加载都行。

  看看你有没有这种需求:某篇文章图片很多,如果在载入文章时就载入所有图片,无疑会延缓载入速度,让用户等更久,所以,我想找这样一种插件,让网页只加载浏览器视野范围内的图片,没出现在范围内的图片就暂不加载,等用户滑动滚动条时再逐步加载,lazyload就是用来实现这种效果。
lazyload.js其实是jQuery的一个插件,全称是jquery.lazyload.js,看它的名字就知道它的作用了——就是偷懒载入的意思。由于它是javascript写的,所以适用于所有网页,包括Wordpress。

  想要使用lazyload,得先载入jQuery,它是依靠jQuery来实现效果的。

以上就是本文的全部内容,希望大家对js实现网页图片延时加载有了更深入的学习了解。

Javascript 相关文章推荐
JSON取值前判断
Dec 23 Javascript
拥有一个属于自己的javascript表单验证插件
Mar 24 Javascript
JavaScript对象数组排序实例方法浅析
Jun 15 Javascript
React native ListView 增加顶部下拉刷新和底下点击刷新示例
Apr 27 Javascript
详解mpvue开发小程序小总结
Jul 25 Javascript
Vue动态加载异步组件的方法
Nov 21 Javascript
Layui表格行工具事件与数据回填方法
Sep 13 Javascript
vue-router的钩子函数用法实例分析
Oct 26 Javascript
js实现倒计时秒杀效果
Mar 25 Javascript
你可能从未使用过的11+个JavaScript特性(小结)
Jan 08 Javascript
ES11新增的这9个新特性,你都掌握了吗
Oct 15 Javascript
uniapp实现可滑动选项卡
Oct 21 Javascript
详解javascript new的运行机制
Jan 26 #Javascript
在Linux系统中搭建Node.js开发环境的简单步骤讲解
Jan 26 #Javascript
基于JavaScript实现瀑布流布局(二)
Jan 26 #Javascript
AngualrJS中每次$http请求时的一个遮罩层Directive
Jan 26 #Javascript
JavaScript html5 canvas画布中删除一个块区域的方法
Jan 26 #Javascript
HTML5游戏引擎LTweenLite实现的超帅动画效果(附demo源码下载)
Jan 26 #Javascript
jQuery form插件的使用之处理server返回的JSON, XML,HTML数据
Jan 26 #Javascript
You might like
PHP判断远程url是否有效的几种方法小结
2011/10/08 PHP
深入分析使用mysql_fetch_object()以对象的形式返回查询结果
2013/06/05 PHP
PHP查找与搜索数组元素方法总结
2015/06/12 PHP
高性能web开发 如何加载JS,JS应该放在什么位置?
2010/05/14 Javascript
JS中 用户登录系统的解决办法
2013/04/15 Javascript
复选框全选与全不选操作实现思路
2013/08/18 Javascript
js实现select组件的选择输入过滤代码
2014/10/14 Javascript
让html页面不缓存js的实现方法
2014/10/31 Javascript
深入分析JSONP跨域的原理
2014/12/10 Javascript
JS实现文字放大效果的方法
2015/03/03 Javascript
JavaScript实现简单的二级导航菜单实例
2015/04/15 Javascript
JavaScript对象学习小结
2015/09/02 Javascript
JavaScript常用字符串与数组扩展函数小结
2016/04/24 Javascript
js实现可控制左右方向的无缝滚动效果
2016/05/29 Javascript
jQuery+CSS实现简单切换菜单示例
2016/07/27 Javascript
[js高手之路]从原型链开始图解继承到组合继承的产生详解
2017/08/28 Javascript
Vue+ElementUI实现表单动态渲染、可视化配置的方法
2018/03/07 Javascript
详解swipe使用及竖屏页面滚动方法
2018/06/28 Javascript
python使用7z解压软件备份文件脚本分享
2014/02/21 Python
使用Python脚本在Linux下实现部分Bash Shell的教程
2015/04/17 Python
深入浅析python定时杀进程
2016/06/06 Python
python开发利器之ulipad的使用实践
2017/03/16 Python
python3实现点餐系统
2019/01/24 Python
Python 中由 yield 实现异步操作
2020/05/04 Python
VSCode配合pipenv搞定虚拟环境的实现方法
2020/05/17 Python
CSS3属性box-shadow使用详细教程
2012/01/21 HTML / CSS
CSS3提交意见输入框样式代码
2014/10/30 HTML / CSS
如何在Canvas中添加事件的方法示例
2019/05/21 HTML / CSS
泰海淘:泰国king Power王权免税集团旗下跨境海淘综合型电商
2020/07/26 全球购物
关于赌博的检讨书
2014/01/24 职场文书
我的求职择业计划书
2014/04/04 职场文书
企业文化标语大全
2014/06/10 职场文书
多媒体编辑专业毕业生求职信
2014/06/13 职场文书
乡镇组织委员个人整改措施
2014/09/16 职场文书
Python关于OS文件目录处理的实例分享
2021/05/23 Python
详解Vue项目的打包方式(生成dist文件)
2022/01/18 Vue.js