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 相关文章推荐
Firefox window.close()的使用注意事项
Apr 11 Javascript
JavaScript 构造函数 面相对象学习必备知识
Jun 09 Javascript
Google AJAX 搜索 API实现代码
Nov 17 Javascript
Ajax异步提交表单数据的说明及方法实例
Jun 22 Javascript
js截取字符串的两种方法及区别详解
Nov 05 Javascript
需灵活掌握的Bootstrap预定义排版类 你精通吗?
Jun 20 Javascript
js 实现数值的千分位及保存小数方法(推荐)
Aug 01 Javascript
angular中的http拦截器Interceptors的实现
Feb 21 Javascript
Angular通过angular-cli来搭建web前端项目的方法
Jul 27 Javascript
Angular请求防抖处理第一次请求失效问题
May 17 Javascript
vue+导航锚点联动-滚动监听和点击平滑滚动跳转实例
Nov 13 Javascript
js 数组当前行添加数据方法详解
Jul 28 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
thinkPHP的Html模板标签使用方法
2012/11/13 PHP
php登陆页的密码处理方式分享
2013/10/14 PHP
php使用for语句输出三角形的方法
2015/06/09 PHP
thinkphp3.x中display方法及show方法的用法实例
2016/05/19 PHP
php socket通信简单实现
2016/11/18 PHP
phpQuery采集网页实现代码实例
2020/04/02 PHP
表单元素的submit()方法和onsubmit事件应用概述
2013/02/01 Javascript
JS倒计时代码汇总
2014/11/25 Javascript
jQuery Easyui Datagrid实现单行的上移下移及保存移动的结果
2016/08/15 Javascript
BootStrap入门教程(三)之响应式原理
2016/09/19 Javascript
Node.js中文件操作模块File System的详细介绍
2017/01/05 Javascript
数组Array的排序sort方法
2017/02/17 Javascript
es6的数字处理的方法(5个)
2017/03/16 Javascript
angularjs实现过滤并替换关键字小功能
2017/09/19 Javascript
手机注册发送验证码倒计时的简单实例
2017/11/15 Javascript
webpack多入口文件页面打包配置详解
2018/01/09 Javascript
MVVM 双向绑定的实现代码
2018/06/21 Javascript
Vue 数组和对象更新,但是页面没有刷新的解决方式
2019/11/09 Javascript
Nodejs文件上传、监听上传进度的代码
2020/03/27 NodeJs
在vue中实现禁止回退上一步,路由不存历史记录
2020/07/22 Javascript
Python中的urllib模块使用详解
2015/07/07 Python
利用Python脚本生成sitemap.xml的实现方法
2017/01/31 Python
Django REST为文件属性输出完整URL的方法
2017/12/18 Python
python中的字典操作及字典函数
2018/01/03 Python
Python多线程中阻塞(join)与锁(Lock)使用误区解析
2018/04/27 Python
tensorflow实现简单的卷积神经网络
2018/05/24 Python
python中import与from方法总结(推荐)
2019/03/21 Python
Python爬虫学习之获取指定网页源码
2019/07/30 Python
用opencv给图片换背景色的示例代码
2020/07/08 Python
快速一键生成Python爬虫请求头
2021/03/04 Python
CSS3弹性盒模型flex box快速入门心得(必看篇)
2016/05/24 HTML / CSS
利用纯html5绘制出来的一款非常漂亮的时钟
2015/01/04 HTML / CSS
俞敏洪一分钟演讲稿
2014/08/26 职场文书
关于读书的演讲稿600字
2014/08/27 职场文书
个人委托书范本汇总
2014/10/01 职场文书
会议通知格式范文
2015/04/15 职场文书