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 相关文章推荐
40款非常棒的jQuery 插件和制作教程(系列一)
Oct 26 Javascript
Javascript 遍历页面text控件详解
Jan 06 Javascript
简单的js图片轮换代码(js图片轮播)
May 06 Javascript
javascript简单实现滑动菜单效果的方法
Jul 27 Javascript
自定义require函数让浏览器按需加载Js文件
Nov 24 Javascript
JS扩展类,克隆对象与混合类实例分析
Nov 26 Javascript
JavaScript使用原型和原型链实现对象继承的方法详解
Apr 05 Javascript
vue.js-div滚动条隐藏但有滚动效果的实现方法
Mar 03 Javascript
vue2.0 资源文件assets和static的区别详解
Apr 08 Javascript
JavaScript实现的DOM树遍历方法详解【二叉DOM树、多叉DOM树】
May 07 Javascript
微信小程序tabBar设置实例解析
Nov 14 Javascript
vue组件系列之TagsInput详解
May 14 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
腾讯QQ微博API接口获取微博内容
2013/10/30 PHP
PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
2014/05/10 PHP
php强制用户转向www域名的方法
2015/06/19 PHP
php制作基于xml的RSS订阅源功能示例
2017/02/08 PHP
PHP命名空间namespace的定义方法详解
2017/03/29 PHP
laravel 之 Eloquent 模型修改器和序列化示例
2019/10/17 PHP
window.dialogArguments 使用说明
2011/04/11 Javascript
onclick与listeners的执行先后问题详细解剖
2013/01/07 Javascript
jQuery中$.fn的用法示例介绍
2013/11/05 Javascript
当鼠标滑过文本框自动选中输入框内容的JS代码分享
2013/11/26 Javascript
JS模仿编辑器实时改变文本框宽度和高度大小的方法
2015/08/17 Javascript
微信分享调用jssdk实例
2017/06/08 Javascript
JavaScript中in和hasOwnProperty区别详解
2017/08/04 Javascript
angular中不同的组件间传值与通信的方法
2017/11/04 Javascript
从Vuex中取出数组赋值给新的数组,新数组push时报错的解决方法
2018/09/18 Javascript
vue中接口域名配置为全局变量的实现方法
2018/09/20 Javascript
Vuejs学习笔记之使用指令v-model完成表单的数据双向绑定
2019/04/29 Javascript
vue组件命名和props命名代码详解
2019/09/01 Javascript
详解微信小程序「渲染层网络层错误」的解决方法
2021/01/06 Javascript
python 提取文件的小程序
2009/07/29 Python
python中将阿拉伯数字转换成中文的实现代码
2011/05/19 Python
python实现跨文件全局变量的方法
2014/07/07 Python
定制FileField中的上传文件名称实例
2017/08/23 Python
Python装饰器用法实例总结
2018/02/07 Python
Python+Django搭建自己的blog网站
2018/03/13 Python
python绘制评估优化算法性能的测试函数
2019/06/25 Python
python 获取sqlite3数据库的表名和表字段名的实例
2019/07/17 Python
Python使用py2neo操作图数据库neo4j的方法详解
2020/01/13 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
2020/03/30 Python
python对execl 处理操作代码
2020/06/22 Python
Python如何读写二进制数组数据
2020/08/01 Python
植物选择:Botanic Choice
2017/02/15 全球购物
高中生物教学反思
2014/02/05 职场文书
故意伤害罪辩护词
2015/05/21 职场文书
未来,这5大方向都很适合创业
2019/07/22 职场文书
MySQL中int (10) 和 int (11) 的区别
2022/01/22 MySQL