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 相关文章推荐
JavaScript 在各个浏览器中执行的耐性
Apr 06 Javascript
jquery 简单的进度条实现代码
Mar 11 Javascript
JavaScript实现页面滚动图片加载(仿lazyload效果)
Jul 22 Javascript
jquery导航制件jquery鼠标经过变色效果示例
Dec 05 Javascript
当某个文本框成为焦点时即清除文本框内容
Apr 28 Javascript
一个检测表单数据的JavaScript实例
Oct 31 Javascript
JavaScript计时器用法分析【setTimeout和clearTimeout】
Jan 18 Javascript
js中的触发事件对象event.srcElement与event.target详解
Mar 15 Javascript
laydate 显示结束时间不小于开始时间的实例
Aug 11 Javascript
详解react-native-fs插件的使用以及遇到的坑
Sep 12 Javascript
javascript自定义事件功能与用法实例分析
Nov 08 Javascript
纯js+css实现仿移动端淘宝网站的弹出详情框功能
Dec 29 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根据图片色界在不同位置加水印的方法
2015/07/01 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
2016/11/03 PHP
js类 from qq
2006/11/13 Javascript
javascript 面向对象全新理练之原型继承
2009/12/03 Javascript
关于JavaScript中原型继承中的一点思考
2012/07/25 Javascript
防止xss和sql注入:JS特殊字符过滤正则
2013/04/18 Javascript
用js格式化金额可设置保留的小数位数
2014/05/09 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
2014/12/10 Javascript
JavaScript 动态加载脚本和样式的方法
2015/04/13 Javascript
js实现每日自动换一张图片的方法
2015/05/04 Javascript
简介JavaScript中toUpperCase()方法的使用
2015/06/06 Javascript
Bootstrap每天必学之媒体对象
2015/11/30 Javascript
百度地图给map添加右键菜单(判断是否为marker)
2016/03/04 Javascript
使用three.js 画渐变的直线
2016/06/05 Javascript
微信小程序 参数传递详解
2016/10/24 Javascript
详解Angular的双向数据绑定(MV-VM)
2016/12/26 Javascript
JS仿QQ好友列表展开、收缩功能(第二篇)
2017/07/07 Javascript
zTree节点文字过多的处理方法
2017/11/24 Javascript
jquery中done和then的区别(详解)
2017/12/19 jQuery
vue数据传递--我有特殊的实现技巧
2018/03/20 Javascript
jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】
2019/06/06 jQuery
基于JavaScript或jQuery实现网站夜间/高亮模式
2020/05/30 jQuery
Flask SQLAlchemy一对一,一对多的使用方法实践
2013/02/10 Python
python实现基于两张图片生成圆角图标效果的方法
2015/03/26 Python
python协程用法实例分析
2015/06/04 Python
django manage.py扩展自定义命令方法
2018/05/27 Python
python基础知识(一)变量与简单数据类型详解
2019/04/17 Python
在Keras中利用np.random.shuffle()打乱数据集实例
2020/06/15 Python
Carrs Silver官网:英国著名的银器品牌
2020/08/29 全球购物
公司年会演讲稿范文
2014/01/11 职场文书
幼儿园儿童节主持词
2014/03/21 职场文书
春游踏青活动方案
2014/08/14 职场文书
学校财务管理制度
2015/08/04 职场文书
java协程框架quasar和kotlin中的协程对比分析
2022/02/24 Java/Android
MySQL时区造成时差问题
2022/04/13 MySQL
Golang bufio详细讲解
2022/04/21 Golang