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 相关文章推荐
点击文章内容处弹出页面代码
Oct 01 Javascript
汉化英文版的Dreamweaver CS5并自动提示jquery
Nov 25 Javascript
jquery获取url参数及url加参数的方法
Oct 26 Javascript
jQuery技巧之让任何组件都支持类似DOM的事件管理
Apr 05 Javascript
深入理解jQuery()方法的构建原理
Dec 05 Javascript
JS获取字符对应的ASCII码实例
Sep 10 Javascript
jquery应用实例分享_实现手风琴特效
Feb 01 jQuery
简单的三步vuex入门
May 20 Javascript
微信小程序Flex布局用法深入浅出分析
Apr 25 Javascript
浅谈es6中的元编程
Dec 01 Javascript
Python机器学习之决策树和随机森林
Jul 15 Javascript
JavaScript实现简单的音乐播放器
Aug 14 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
下拉列表多级联动dropDownList示例代码
2013/06/27 PHP
将酷狗krc歌词解析并转换为lrc歌词php源码
2014/06/20 PHP
在html文件中也可以执行php语句的方法
2015/04/09 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
PHP实现腾讯短网址生成api接口实例
2020/12/08 PHP
javascript globalStorage类代码
2009/06/04 Javascript
关于scrollLeft,scrollTop的浏览器兼容性测试
2013/03/19 Javascript
JavaScript原生对象之Number对象的属性和方法详解
2015/03/13 Javascript
JavaScript数组去重的3种方法和代码实例
2015/07/01 Javascript
使用canvas实现仿新浪微博头像截取上传功能
2015/09/02 Javascript
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
2016/07/26 NodeJs
json定义及jquery操作json的方法
2016/09/29 Javascript
javascript滚轮事件基础实例讲解(37)
2017/02/14 Javascript
jQuery基本选择器和层次选择器学习使用
2017/02/27 Javascript
vue.js开发环境搭建教程
2017/05/04 Javascript
JS实现的简单表单验证功能示例
2017/10/13 Javascript
vue中引入第三方字体文件的方法示例
2018/12/17 Javascript
基于vue项目设置resolves.alias: '@'路径并适配webstorm
2020/12/02 Vue.js
使用python加密自己的密码
2015/08/04 Python
python 遍历目录(包括子目录)下所有文件的实例
2018/07/11 Python
Django教程笔记之中间件middleware详解
2018/08/01 Python
Django使用AJAX调用自己写的API接口的方法
2019/03/06 Python
python实现维吉尼亚算法
2019/03/20 Python
Python用字典构建多级菜单功能
2019/07/11 Python
Flask和pyecharts实现动态数据可视化
2020/02/26 Python
HTML5 Canvas中绘制椭圆的4种方法
2015/04/24 HTML / CSS
微软巴西官方网站:Microsoft Brasil
2019/09/26 全球购物
结婚周年感言
2014/02/24 职场文书
客户接待方案
2014/02/26 职场文书
竞选班干部演讲稿300字
2014/08/20 职场文书
化学专业大学生职业生涯规划范文
2014/09/13 职场文书
说谎欺骗人检讨书300字
2014/11/18 职场文书
运动员入场前导词
2015/07/20 职场文书
美容院管理规章制度
2015/08/05 职场文书
我去timi了,一起去timi是什么意思?
2022/04/13 杂记
Mongodb 迁移数据块的流程介绍分析
2022/04/18 MongoDB