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 相关文章推荐
showModelessDialog()使用详解
Sep 21 Javascript
Google Map Api和GOOGLE Search Api整合实现代码
Jul 18 Javascript
通过DOM脚本去设置样式信息
Sep 19 Javascript
JavaScript统计网站访问次数的实现代码
Nov 18 Javascript
JS实现图片高亮展示效果实例
Nov 24 Javascript
js确认框confirm()用法实例详解
Jan 07 Javascript
JS作用域深度解析
Dec 29 Javascript
vue实现全选、反选功能
Nov 17 Javascript
JS+H5 Canvas实现时钟效果
Jul 20 Javascript
详解React中传入组件的props改变时更新组件的几种实现方法
Sep 13 Javascript
如何为你的JavaScript代码日志着色详解
Apr 08 Javascript
处理JavaScript值为undefined的7个小技巧
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
星际争霸任务指南——神族
2020/03/04 星际争霸
实用函数5
2007/11/08 PHP
php中flush()、ob_flush()、ob_end_flush()的区别介绍
2013/02/17 PHP
YII2框架中查询生成器Query()的使用方法示例
2020/03/18 PHP
js获取键盘按键响应事件(兼容各浏览器)
2013/05/16 Javascript
javascript中数组的concat()方法使用介绍
2013/12/18 Javascript
程序员必知35个jQuery 代码片段
2015/11/05 Javascript
原生js实现class的添加和删除简单代码
2016/07/12 Javascript
D3.js实现雷达图的方法详解
2016/09/22 Javascript
win系统下nodejs环境安装配置
2017/05/04 NodeJs
EasyUI 数据表格datagrid列自适应内容宽度的实现
2019/07/18 Javascript
Vuex中实现数据状态查询与更改
2019/11/08 Javascript
vue商城中商品“筛选器”功能的实现代码
2020/07/01 Javascript
Vue执行方法,方法获取data值,设置data值,方法传值操作
2020/08/05 Javascript
[02:59]DOTA2完美大师赛主赛事第三日精彩集锦
2017/11/25 DOTA
在Python中使用第三方模块的教程
2015/04/27 Python
Python文件去除注释的方法
2015/05/25 Python
Django框架中数据的连锁查询和限制返回数据的方法
2015/07/17 Python
Python基础知识_浅谈用户交互
2017/05/31 Python
python中datetime模块中strftime/strptime函数的使用
2018/07/03 Python
详解python分布式进程
2018/10/08 Python
python实现websocket的客户端压力测试
2019/06/25 Python
python实现人机五子棋
2020/03/25 Python
详解Scrapy Redis入门实战
2020/11/18 Python
CSS3教程(9):设置RGB颜色
2009/04/02 HTML / CSS
CSS3制作轮播图的一种方法
2019/11/11 HTML / CSS
CSS3 真的会替代 SCSS 吗
2021/03/09 HTML / CSS
欧洲、亚洲、非洲和拉丁美洲的度假套餐:Great Value Vacations
2019/03/30 全球购物
Contém1g官网:巴西彩妆品牌
2020/01/17 全球购物
Python中pass语句的作用是什么
2016/06/01 面试题
JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
2013/07/02 面试题
开会迟到检讨书
2014/02/03 职场文书
敬老月活动总结
2014/08/28 职场文书
施工单位工程部经理岗位职责
2015/04/09 职场文书
二审答辩状格式
2015/05/22 职场文书
零基础学java之方法的定义与调用详解
2022/04/10 Java/Android