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 函数的执行环境和作用域链的深入解析
Nov 01 Javascript
Javascript中常见的校验如域名、手机、邮箱等等
Jan 02 Javascript
node.js中的fs.writeSync方法使用说明
Dec 15 Javascript
JavaScript判断IE版本型号
Jul 27 Javascript
JS实现三级折叠菜单特效,其它级可自动收缩
Aug 06 Javascript
js与applet相互调用的方法
Jun 22 Javascript
微信小程序 石头剪刀布实例代码
Jan 04 Javascript
js replace()去除代码中空格的实例
Feb 14 Javascript
bootstrap选项卡扩展功能详解
Jun 14 Javascript
Vue中computed与methods的区别详解
Mar 24 Javascript
Vue.js中Line第三方登录api的实现代码
Jun 29 Javascript
react国际化react-intl的使用
May 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
做一个有下拉功能的留言版
2006/10/09 PHP
php列出一个目录下的所有文件的代码
2012/10/09 PHP
php中的比较运算符详解
2013/10/28 PHP
PHP数组Key强制类型转换实现原理解析
2020/09/01 PHP
JavaScript Konami Code 实现代码
2009/07/29 Javascript
javascript入门基础之私有变量
2010/02/23 Javascript
javascript中使用replaceAll()函数实现字符替换的方法
2010/12/25 Javascript
Jquery插件 easyUI属性汇总
2011/01/19 Javascript
js限制文本框只能输入数字(正则表达式)
2012/07/15 Javascript
Js如何判断客户端是PC还是手持设备简单分析
2012/11/22 Javascript
JS验证邮箱格式是否正确的代码
2013/12/05 Javascript
js清除input中type等于file的值域(示例代码)
2013/12/24 Javascript
JavaScript实现的内存数据库LokiJS介绍和入门实例
2014/11/17 Javascript
setinterval()与clearInterval()JS函数的调用方法
2015/01/21 Javascript
js实现类似MSN提示的页面效果代码分享
2015/08/24 Javascript
JS+HTML5手机开发之滚动和惯性缓动实现方法分析
2016/06/12 Javascript
AngularJS控制器controller给模型数据赋初始值的方法
2017/01/04 Javascript
前端框架学习总结之Angular、React与Vue的比较详解
2017/03/14 Javascript
jquery中$.fn和图片滚动效果实现的必备知识总结
2017/04/21 jQuery
vue.js国际化 vue-i18n插件的使用详解
2017/07/07 Javascript
Bootstrap table中toolbar新增条件查询及refresh参数使用方法
2018/05/18 Javascript
微信网页授权并获取用户信息的方法
2018/07/30 Javascript
Vue异步组件处理路由组件加载状态的解决方案
2018/09/07 Javascript
vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用)
2018/11/05 Javascript
详解vue-cli中使用rem,vue自适应
2019/05/06 Javascript
微信小程序完美解决scroll-view高度自适应问题的方法
2020/08/08 Javascript
vue 项目引入echarts 添加点击事件操作
2020/09/09 Javascript
Javascript生成器(Generator)的介绍与使用
2021/01/31 Javascript
Python中实例化class的执行顺序示例详解
2018/10/14 Python
用python代码将tiff图片存储到jpg的方法
2018/12/04 Python
用django-allauth实现第三方登录的示例代码
2019/06/24 Python
Python实现线性判别分析(LDA)的MATLAB方式
2019/12/09 Python
解决Pytorch自定义层出现多Variable共享内存错误问题
2020/06/28 Python
纯CSS3发光分享按钮的实现教程
2014/09/06 HTML / CSS
乌克兰的第一家手表店:Deka
2020/03/05 全球购物
入党宣誓仪式主持词
2015/06/29 职场文书