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 相关文章推荐
javascript 鼠标滚轮事件
Apr 09 Javascript
js对象之JS入门之Array对象操作小结
Jan 09 Javascript
js 赋值包含单引号双引号问题的解决方法
Feb 26 Javascript
js监控IE火狐浏览器关闭、刷新、回退、前进事件
Jul 23 Javascript
使用coffeescript编写node.js项目的方法汇总
Aug 05 Javascript
BootStrap的table表头固定tbody滚动的实例代码
Aug 24 Javascript
利用node.js搭建简单web服务器的方法教程
Feb 20 Javascript
详解angular中的作用域及继承
May 31 Javascript
说说AngularJS中的$parse和$eval的用法
Sep 14 Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
Mar 01 Javascript
js/jquery遍历对象和数组的方法分析【forEach,map与each方法】
Feb 27 jQuery
JavaScript实现网页下拉菜单效果
Nov 20 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
基于empty函数的判断详解
2013/06/17 PHP
Yii实现单用户博客系统文章详情页插入评论表单的方法
2015/12/28 PHP
php 解析xml 的四种方法详细介绍
2016/10/26 PHP
多个iframe自动调整大小的问题
2006/09/18 Javascript
使用Modello编写JavaScript类
2006/12/22 Javascript
让图片旋转任意角度及JQuery插件使用介绍
2013/03/20 Javascript
简单实用的全选反选按钮例子
2013/10/18 Javascript
用Jquery.load载入页面实现局部刷新
2014/01/22 Javascript
javascript 获取iframe里页面中元素值的方法
2014/02/17 Javascript
浅谈javascript构造函数与实例化对象
2015/06/22 Javascript
JavaScript函数的调用以及参数传递
2015/10/21 Javascript
详解AngularJS中$http缓存以及处理多个$http请求的方法
2016/02/06 Javascript
Node.js常用工具之util模块
2017/03/09 Javascript
如何将 jQuery 从你的 Bootstrap 项目中移除(取而代之使用Vue.js)
2017/07/17 jQuery
JavaScript 高性能数组去重的方法
2018/09/20 Javascript
JS数组reduce()方法原理及使用技巧解析
2020/07/14 Javascript
解决Antd 里面的select 选择框联动触发的问题
2020/10/24 Javascript
[02:30]DOTA2英雄基础教程 暗影恶魔
2013/12/17 DOTA
[46:28]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
[54:57]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第二场 1月8日
2021/03/11 DOTA
Python编码时应该注意的几个情况
2013/03/04 Python
python实现的多线程端口扫描功能示例
2017/01/21 Python
Python使用base64模块进行二进制数据编码详解
2018/01/11 Python
Python之关于类变量的两种赋值区别详解
2020/03/12 Python
Python中用xlwt制作表格实例讲解
2020/11/05 Python
编写一个类体现构造,公有,私有方法,静态,私有变量
2013/08/10 面试题
暑期培训班招生方案
2014/08/26 职场文书
2014年班长个人工作总结
2014/11/14 职场文书
小学语文复习计划
2015/01/19 职场文书
信访工作个人总结
2015/03/03 职场文书
幼儿园园长安全责任书
2015/05/08 职场文书
热血教师观后感
2015/06/10 职场文书
2015年重阳节活动主持词
2015/07/30 职场文书
JavaScript 实现页面滚动动画
2021/04/24 Javascript
使用tensorflow 实现反向传播求导
2021/05/26 Python
python实现学生信息管理系统(面向对象)
2022/06/05 Python