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 相关文章推荐
父窗口获取弹出子窗口文本框的值
Jun 27 Javascript
JCalendar 日历控件 v1.0 beta[兼容IE&amp;Firefox] 有文档和例子
May 30 Javascript
了解jQuery技巧来提高你的代码
Jan 08 Javascript
浅析document.createDocumentFragment()与js效率
Jul 08 Javascript
jquery 实现上下滚动效果示例代码
Aug 09 Javascript
javascript学习笔记(八)正则表达式
Oct 08 Javascript
jQuery 实现侧边浮动导航菜单效果
Dec 26 Javascript
js中的内部属性与delete操作符介绍
Aug 10 Javascript
JavaScript中判断数据类型的方法总结
May 24 Javascript
js实现不提示直接关闭网页窗口
Mar 30 Javascript
Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装
Oct 21 Javascript
js实现简单的打印表格
Jan 15 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
某大型网络公司应聘时的笔试题目附答案
2008/03/27 PHP
php强制下载类型的实现代码
2011/04/21 PHP
Yii框架中 find findAll 查找出制定的字段的方法对比
2014/09/10 PHP
tp5 sum某个字段相加得到总数的例子
2019/10/18 PHP
JQuery 插件制作实践 xMarquee插件V1.0
2010/04/02 Javascript
JS随机漂浮广告代码具体实例
2013/11/19 Javascript
javascript中数组的多种定义方法和常用函数简介
2014/05/09 Javascript
js获取域名的方法
2015/01/27 Javascript
jquery获取节点名称
2015/04/26 Javascript
JS+CSS3模拟溢出滚动效果
2016/08/12 Javascript
ionic组件ion-tabs选项卡切换效果实例
2016/08/27 Javascript
jQuery实现的粘性滚动导航栏效果实例【附源码下载】
2017/10/19 jQuery
微信小程序第三方框架对比 之 wepy / mpvue / taro
2019/04/10 Javascript
vue之a-table中实现清空选中的数据
2019/11/07 Javascript
Vue filter 过滤当前时间 实现实时更新效果
2019/12/20 Javascript
React实现todolist功能
2020/12/28 Javascript
简单介绍Python中的JSON使用
2015/04/28 Python
python中list列表的高级函数
2016/05/17 Python
基于Python __dict__与dir()的区别详解
2017/10/30 Python
python绘制多个曲线的折线图
2020/03/23 Python
python利用selenium进行浏览器爬虫
2019/04/25 Python
python实现两个经纬度点之间的距离和方位角的方法
2019/07/05 Python
解决Django 在ForeignKey中出现 non-nullable field错误的问题
2019/08/06 Python
解决Python二维数组赋值问题
2019/11/28 Python
利用Python优雅的登录校园网
2020/10/21 Python
解决pytorch 模型复制的一些问题
2021/03/03 Python
使用before和:after伪类制作css3圆形按钮
2014/04/08 HTML / CSS
连卡佛中国官网:Lane Crawford中文站
2018/01/27 全球购物
阿拉伯书店:Jamalon
2019/07/24 全球购物
The North Face北面荷兰官网:美国著名户外品牌
2019/10/16 全球购物
Linux常见面试题
2013/03/18 面试题
初中家长寄语
2014/04/02 职场文书
伦敦奥运会的口号
2014/06/21 职场文书
关于晚自习早退的检讨书
2014/09/13 职场文书
2015年推广普通话演讲稿
2015/03/20 职场文书
swagger如何返回map字段注释
2021/07/03 Java/Android