js 图片懒加载的实现


Posted in Javascript onOctober 21, 2020

1.使用场景

当网页上有大量图片需要加载时,如果一次性将图片全部加载完,网页加载时间会过长;

网页本身已经反应很慢了,如果你的页面上又需要引用图片,这时候同样是雪上加霜。

2.图片懒加载原理

图片懒加载,只不过是叫法比较高大上而已,其实现方式很简单,就是在需要的时候再给图片的src属性赋值,仅此而已。

3.代码实现

/**
 * 图片懒加载
 */
function ImgLazyLoad() {
  /**
   * 滚动到图片所在位置再加载
   * @param imgId
   *   懒加载图片的ID
   * @param imgSrc
   *   懒加载图片的地址
   * @param distance
   *  图片的可视距离(这个参数可以不传)    
   */
  this.scrollLoad = function(imgId,imgSrc,distance) {    
    // 获取该图片的src
    var img_source = $('#' + imgId).attr('src');
    // 只执行一次
    if("" == img_source) {
      // 不滚动的情况下,网页的可见高度
      var documentClientHeight = document.documentElement.clientHeight || window.innerHeight;
      // 获取该图片距离网页顶部的距离
      var imgOffsetTop = $('#' + imgId)[0].offsetTop;
      // 获取网页的可见高度
      // var bodyClientHeight = document.body.clientHeight;
      
      // 1.网页高度<小于网页可视区域的高度(imgOffsetTop < documentClientHeight),就不会发生滚动事件
      if (imgOffsetTop < documentClientHeight) {
        $('#' + imgId)[0].src = imgSrc;
        return;
      }      
      
      // 获取屏幕高度
      //var screenHeight = window.screen.height;
      // 图片距离网页左上角的纵向偏移距离(距离网页顶部的距离)
      var max_imgClientTop = $('#' + imgId)[0].getBoundingClientRect().top;
      // ie下带有小数,所以只取整数
      max_imgClientTop = parseInt(max_imgClientTop);
      // 图片可视距离(还差多少可以被看见)
      var max_imgClientDistance = max_imgClientTop - documentClientHeight;
      //0<= distance <=max_imgClientDistance
      // 1.参数不存在时,设值=0;(图片刚从可视区域最底部出现时,距离达到最小)distance→→Min=0
      // 2.参数>网页可见高度时,设值=可视区域高度;(不滚动时,距离达到最大)distance→→Max=max_imgClientDistance,scrollTop=0
      distance = ((distance || 0)>max_imgClientDistance)?max_imgClientDistance:distance;
      
      // 2.最大距离时,无滚动
      if (distance == max_imgClientDistance) {
        $('#' + imgId)[0].src = imgSrc;
        return;
      }
      
      // 页面绑定滚动事件  
      $(document).scroll(function(){
        
        // 获取网页被卷高度
        // var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
        // 距离网页最顶部的距离
        var imgClientTop = $('#' + imgId)[0].getBoundingClientRect().top;
        // 图片的可视高度
        var clientHeight = documentClientHeight - imgClientTop;
        // 到达指定距离差或者图片已经进入视野范围
        if (-clientHeight <= distance || documentClientHeight >= imgClientTop) {
          $('#' + imgId)[0].src = imgSrc;
        }
        
      });
    }
  };
  /**
   * 通过单击别的元素时再加载
   * @param clickId
   *  被绑定单击事件的页面元素ID
   * @param imgId
   *  
   * @param imgSrc
   *   懒加载图片的地址
   */ 
  // 
  this.clickLoad = function(clickId,imgId,imgSrc) {
    // 获取该图片的src
    var img_source = $('#' + imgId).attr('src');
    // 只执行一次
    if("" == img_source) {
      // 绑定单击事件
      $('#' + clickId).click(function(){
        $('#' + imgId)[0].src = imgSrc;
      });
    }
  };
};

调用:

$(function() {
  // 实例化对象
  var ill = new ImgLazyLoad();
  // 调用
  ill.scrollLoad('aa','http://files.cnblogs.com/files/Marydon20170307/ws_products.bmp',404);
});

4.涉及知识点

网上也有很多实现方法,但是不能自定义设置加载图片的时机,为了实现这一点,花了不少功夫才搞好。

代码很短,但是涉及的知识点很多。

// 获取的是网页的可视区域的高度(不滚动的情况下)
document.documentElement.clientHeight || window.innerHeight
// 获取的是网页的可见高度(除去隐藏元素的高度)
document.body.clientHeight
// 获取的是显示屏的高度
window.screen.height
// 获取网页的被卷高度(ie下不支持前者获取方式)
document.body.scrollTop || document.documentElement.scrollTop
// 获取指定元素距离网页顶部的距离(静态死值)
document.getElementById('#id').offsetTop
document.getElementById('#id').getBoundingClientRect().top

以上就是js 图片懒加载的实现的详细内容,更多关于js 图片懒加载的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
JS 页面计时器示例代码
Oct 28 Javascript
jQuery中delegate与on的用法与区别示例介绍
Dec 20 Javascript
js实现多选项切换导航菜单的方法
Feb 06 Javascript
WordPress中鼠标悬停显示和隐藏评论及引用按钮的实现
Jan 12 Javascript
jQuery mobile的header和footer在点击屏幕的时候消失的解决办法
Jul 01 Javascript
浅谈JS函数定义方式的区别
Oct 30 Javascript
分类解析jQuery选择器
Nov 23 Javascript
微信小程序 MD5加密登录密码详解及实例代码
Jan 12 Javascript
Angularjs单选框相关的示例代码
Aug 17 Javascript
node文字生成图片的示例代码
Oct 26 Javascript
Vue组件中的data必须是一个function的原因浅析
Sep 03 Javascript
Vue-CLI3.x 设置反向代理的方法
Dec 06 Javascript
uniapp实现可以左右滑动导航栏
Oct 21 #Javascript
解决vue-loader加载不上的问题
Oct 21 #Javascript
Vue实现返回顶部按钮实例代码
Oct 21 #Javascript
vue将文件/图片批量打包下载zip的教程
Oct 21 #Javascript
uniapp实现可滑动选项卡
Oct 21 #Javascript
element中table高度自适应的实现
Oct 21 #Javascript
vue+springboot+element+vue-resource实现文件上传教程
Oct 21 #Javascript
You might like
Windows Server 2008 R2和2012中PHP连接MySQL过慢的解决方法
2016/07/02 PHP
Yii框架分页实现方法详解
2017/05/20 PHP
javascript 不间断的图片滚动并可点击
2010/01/15 Javascript
JavaScript Event学习第十章 一些可替换的事件对
2010/02/10 Javascript
input 输入框内的输入事件详细分析
2010/03/17 Javascript
IE本地存储userdata的一个bug说明
2010/07/01 Javascript
使用js修改客户端注册表的方法
2013/08/09 Javascript
javascript同页面多次调用弹出层具体实例代码
2013/08/16 Javascript
JS实现窗口加载时模拟鼠标移动的方法
2015/06/03 Javascript
基于JavaScript如何制作遮罩层对话框
2016/01/26 Javascript
JavaScript数组实现数据结构中的队列与堆栈
2016/05/26 Javascript
简单实现Vue的observer和watcher
2016/12/21 Javascript
EasyUI学习之Combobox下拉列表(1)
2016/12/29 Javascript
微信小程序 网络请求(post请求,get请求)
2017/01/17 Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
2017/03/30 Javascript
详解webpack打包vue时提取css
2017/05/26 Javascript
微信小程序 转发功能的实现
2017/08/04 Javascript
如何编写一个d.ts文件的步骤详解
2018/04/13 Javascript
详解javascript中的babel到底是什么
2018/06/21 Javascript
微信小程序中如何使用flyio封装网络请求
2019/07/03 Javascript
js图片无缝滚动插件使用详解
2020/05/26 Javascript
Python基于动态规划算法计算单词距离
2015/07/25 Python
浅谈Python NLP入门教程
2017/12/25 Python
python微信跳一跳系列之自动计算跳一跳距离
2018/02/26 Python
Python利用公共键如何对字典列表进行排序详解
2018/05/19 Python
详解Python 协程的详细用法使用和例子
2018/06/15 Python
浅谈python常用程序算法
2019/03/22 Python
PyCharm 在Windows的有用快捷键详解
2020/04/07 Python
PyQt5实现简单的计算器
2020/05/30 Python
python 匿名函数与三元运算学习笔记
2020/10/23 Python
python 实现全球IP归属地查询工具
2020/12/18 Python
英国珠宝钟表和家居礼品精品店:David Shuttle
2018/02/24 全球购物
金融专业求职信
2014/08/05 职场文书
个人租房协议书样本
2014/10/01 职场文书
大连导游词
2015/02/12 职场文书
python神经网络 tf.name_scope 和 tf.variable_scope 的区别
2022/05/04 Python