javascript图片延迟加载实现方法及思路


Posted in Javascript onDecember 31, 2015

本文实例为大家介绍了如何通过javascript来延迟加载图片,分享给大家供大家参考,具体内容如下

当一个网页中含有大量图片时,如果一开始就将图片全部加载完毕,势必会引起性能和效率上的问题,用户可能会由于等待时间过久而离开。

这个时候,我们需要利用懒加载,也就是延迟加载图片的方式,来提高网站的亲和力。

一、延迟加载图片

基本思路如下:
给需要延迟加载的图片设置自定义属性比如lazy-src,存在图片源所在路径。然后将所有需要懒加载的图片放入一个数组,在window.onscroll的时候判断该数组内容是否出现在了用户视线中,如果出现了,就将自定义属性内容赋予图片的src属性。

下面我们来具体谈谈实现步骤。
首先,我们需要定义函数返回浏览器的可视区域位置:

/**
   * @description: 返回浏览器的可视区域位置
   * @return: left:左滑轮距离,top:上滑轮距离,width:可见区域宽度,height:可见区域长度
   */
   function getClient(){
    var l,t,w,h;
    l = document.documentElement.scrollLeft||document.body.scrollLeft;
    t = document.documentElement.scrollTop||document.body.scrollTop;
    w = document.documentElement.clientWidth;
    h = document.documentElement.clientHeight;
    return {left:l,top:t,width:w,height:h};
   }

然后定义函数返回待加载资源的位置:

/**
   * @description: 返回待加载资源位置
   * @params: p:需要加载的资源节点
   * @return: left:左边距离,top:上边距离,width:宽度,height:高度
   */
   function getSubClient(p){
    var l = 0, t = 0, w, h;
    w = p.offsetWidth;
    h = p.offsetHeight;
    while(p.offsetParent){
      l += p.offsetLeft;
      t += p.offsetTop;
      p = p.offsetParent;
    } 
    return {left:l,top:t,width:w,height:h};
   }

接下来定义函数,判断两个矩形区域是否相交:

/**
   * @decription: 判断两个矩阵是否相交,返回一个布尔值
   * @params: rec1,rec2:需要比较的节点矩阵
   * @return: true: 两矩阵相交
   */
   function contains(rec1,rec2){
    var lc1,lc2,tc1,tc2,w1,h1;
    lc1 = rec1.left + rec1.width/2;
    lc2 = rec2.left + rec2.width/2;
    tc1 = rec1.top + rec1.height/2;
    tc2 = rec2.top + rec2.height/2;
    w1 = (rec1.width + rec2.width)/2;
    h1 = (rec1.height + rec2.height)/2;
    return Math.abs(lc1 - lc2)<w1&&Math.abs(tc1 - tc2)<h1;
   }

最后对图片资源进行监视,如果进入用户视野则加载资源:

/**
   * @description: 资源出现在视野中再加载.将资源放入一个数组。
   */
   var arr = document.getElementsByClassName("divX");
   window.onscroll = function(){
    var prec1 = getClient();
    var prec2;
    for(var i = arr.length-1;i>=0;i--){
      if(arr[i]){
        prec2 = getSubClient(arr[i]);
        if(contains(prec1,prec2)){
          //加载资源
          console.log(arr[i].id);
          arr[i].childNodes[0].src = arr[i].childNodes[0].getAttribute("lazy_src");
          delete arr[i];
        }
      }
    }
   }

当然,这里只是讲思路,如果用到工程上,还是有很多缺陷,比如性能和兼容性等。所以推荐一款jquery插件:lazyload

1、判断css加载完成

这里顺便说一下如何判断一个web页面的css文件加载完成。我们知道css通过外部文件引入,其实是一个link节点。所以我们只需要通过轮询来判断该link节点的sheet属性或者sheet.cssRules属性,就可以判断该css文件是否完全加载成功。

2、判断图片加载完成

同样的,img标签有一个complete属性,我们只需要通过轮询来查看该属性即可。

function imgLoad(img, callback) {
      var timer = setInterval(function() {
        if (img.complete) {
          callback(img)
          clearInterval(timer)
        }
      }, 50)
    }
    imgLoad(img1, function() {
      p1.innerHTML('加载完毕')
    })

3、判断javascript加载完成

那么如何判断javascript加载完成呢?script节点的onload方法就是加载完成后执行的。ie6和ie7则可通过readyState来判断:

function include_js(file) {
  var _doc = document.getElementsByTagName('head')[0];
  var js = document.createElement('script');
  js.setAttribute('type', 'text/javascript');
  js.setAttribute('src', file);
  _doc.appendChild(js);
  if (!/*@cc_on!@*/0) { //if not IE
    //Firefox2、Firefox3、Safari3.1+、Opera9.6+ support js.onload
    js.onload = function () {
      alert('Firefox2、Firefox3、Safari3.1+、Opera9.6+ support js.onload');
    }
  } else {
    //IE6、IE7 support js.onreadystatechange
    js.onreadystatechange = function () {
      if (js.readyState == 'loaded' || js.readyState == 'complete') {
        alert('IE6、IE7 support js.onreadystatechange');
      }
    }
  }
  return false;
}

以上就是本文的全部内容,希望对大家的学习有所帮助。

Javascript 相关文章推荐
改变隐藏的input中value值的方法
Mar 19 Javascript
Javascript小技巧之生成html元素
May 15 Javascript
Bootstrap插件全集
Jul 18 Javascript
jQuery分页插件jquery.pagination.js使用方法解析
Feb 09 Javascript
react native与webview通信的示例代码
Sep 25 Javascript
关于vue单文件中引用路径的处理方法
Jan 08 Javascript
详解Vue CLI3配置之filenameHashing使用和源码设计使用和源码设计
Aug 31 Javascript
vue给对象动态添加属性和值的实例
Sep 09 Javascript
Vue vm.$attrs使用场景详解
Mar 08 Javascript
react ant Design手动设置表单的值操作
Oct 31 Javascript
vue实现lodop打印功能的示例
Nov 11 Javascript
简单聊聊TypeScript只读修饰符
Apr 06 Javascript
jQuery动画显示和隐藏效果实例演示(附demo源码下载)
Dec 31 #Javascript
详解javascript高级定时器
Dec 31 #Javascript
jQuery动画效果相关方法实例分析
Dec 31 #Javascript
js实现文字垂直滚动和鼠标悬停效果
Dec 31 #Javascript
jquery正则表达式验证(手机号、身份证号、中文名称)
Dec 31 #Javascript
jQuery语法小结(超实用)
Dec 31 #Javascript
解决JS无法调用Controller问题的方法
Dec 31 #Javascript
You might like
php封装单文件上传到数据库(路径)
2017/10/15 PHP
Jquery刷新页面背景图片随机变换的实现方法
2013/03/15 Javascript
jQuery的控件及事件(输入控件及回车事件)使用示例
2013/07/25 Javascript
使用jQuery实现input数值增量和减量的方法
2015/01/24 Javascript
JS实现点击复选框将按钮或文本框变为灰色不可用的方法
2015/08/11 Javascript
javascript实现平滑无缝滚动
2020/08/09 Javascript
Highcharts入门之基本属性
2016/08/02 Javascript
jQuery实现的购物车物品数量加减功能代码
2016/11/16 Javascript
jQuery第一次运行页面默认触发点击事件的实例
2018/01/10 jQuery
详解vue移动端项目的适配(以mint-ui为例)
2018/08/17 Javascript
ES6基础之字符串和函数的拓展详解
2019/08/22 Javascript
JS端基于download.js实现图片、视频时直接下载而不是打开预览
2020/05/09 Javascript
vue scroll滚动判断的实现(是否滚动到底部、滚动方向、滚动节流、获取滚动区域dom元素)
2020/06/11 Javascript
JavaScript 防抖和节流遇见的奇怪问题及解决
2020/11/20 Javascript
浅谈Vue使用Elementui修改默认的最快方法
2020/12/05 Vue.js
[01:38]DOTA2辉夜杯 欢乐的观众现场采访
2015/12/26 DOTA
Python处理文本换行符实例代码
2018/02/03 Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
2018/08/25 Python
python如何实现视频转代码视频
2019/06/17 Python
python文件读写代码实例
2019/10/21 Python
python 循环数据赋值实例
2019/12/02 Python
VSCode配合pipenv搞定虚拟环境的实现方法
2020/05/17 Python
使用python创建Excel工作簿及工作表过程图解
2020/05/27 Python
python json.dumps() json.dump()的区别详解
2020/07/14 Python
python接口自动化框架实战
2020/12/23 Python
Python实现小黑屋游戏的完整实例
2021/01/06 Python
python 制作网站小说下载器
2021/02/20 Python
Python解析m3u8拼接下载mp4视频文件的示例代码
2021/03/03 Python
马来西亚网上花店:FlowerAdvisor马来西亚
2020/01/03 全球购物
幼师专业毕业生自荐信
2013/09/29 职场文书
德育标兵事迹材料
2014/08/24 职场文书
党员公开承诺书2015
2015/01/21 职场文书
颐和园导游词
2015/01/30 职场文书
产品质量保证书范本
2015/02/27 职场文书
教师工作能力自我评价
2015/03/04 职场文书
高三化学教学反思
2016/02/22 职场文书