JavaScript实现图片懒加载的方法分析


Posted in Javascript onJuly 05, 2018

本文实例讲述了JavaScript实现图片懒加载的方法。分享给大家供大家参考,具体如下:

懒加载是非常实用的提升网页性能的方式,当访问一个页面的时候,只显示可视区域内的图片,其它的图片只有出现在可视区域内的时候才会被请求加载。

我们现在用原生的js实现简单的图片懒加载,主要利用的原理就是先不给设置src,而是把图片的路径放在data-src中,等待图片被加载的时候将路径取出放到src中。

HTML代码

<div class="container">
 <div class="img-area">
  <img class="my-photo" alt="loading" data-src="img/img1.png">
 </div>
 <div class="img-area">
  <img class="my-photo" alt="loading" data-src="img/img2.png">
 </div>
 <div class="img-area">
  <img class="my-photo" alt="loading" data-src="img/img3.png">
 </div>
 <div class="img-area">
  <img class="my-photo" alt="loading" data-src="img/img4.png">
 </div>
 <div class="img-area">
  <img class="my-photo" alt="loading" data-src="img/img5.png">
 </div>
</div>

判断元素是否在可视区域

方法一:

1. 获取屏幕可视区高度:document.documentElement.clientHeight
2. 获取元素距顶部的高度:element.offsetTop
3. 获取滚动高度:document.documentElement.scrollTop
4. 若满足:2-3<1,那么元素就出现在可视区域

方法二:

1. 获取元素到可视区域顶部的距离:var bound = element.getBoundingClientRect()
2. 获取可视区域的高度:window.innerHeight
3. 若满足bound.top<=window.innerHeight,那么元素就出现在可视区域

方法三:

利用IntersectionObserver函数自动观察元素是否在可视区域内

var watch = new IntersectionObserver(callback,option);
//开始观察
watch.observe(el);
//停止观察
watch.unobserve(el);
//关闭观察器
watch.disconnect();

js代码

第一种很多人都用过,所以我们就用第二种写一下

//判断图片是否出现在可视区域内
function isInSight(el) {
    const bound = el.getBoundingClientRect();
    const clientHeight = window.innerHeight;
    return bound.top <= clientHeight + 100;
}
//加载图片
let index = 0;
function checkImgs() {
    const imgs = document.querySelectorAll('.my-photo');
    for( let i = index; i < imgs.length; i++){
      if(isInSight(imgs[i])){
        loadImg(imgs[i]);
        index = i;
      }
    }
}
function loadImg(el) {
    if(!el.src){
      const source = el.dataset.src;
      el.src = source;
    }
}
//函数节流
//函数节流是很重要的思想,可以防止过于频繁的操作dom
function throttle(fn,mustRun = 500) {
    const timer = null;
    let previous = null;
    return function () {
      const now = new Date();
      const context = this;
      const args = arguments;
      if(!previous){
        previous = now;
      }
      const remaining = now -previous;
      if(mustRun && remaining >= mustRun){
        fn.apply(context,args);
        previous = now;
      }
    }
  }
//调用函数
window.onload=checkImgs;
window.onscroll = throttle(checkImgs);

我们在用第三种方法写一个demo

function checkImgs() {
 const imgs = Array.from(document.querySelectorAll(".my-photo"));
 imgs.forEach(item => io.observe(item));
}
function loadImg(el) {
 if (!el.src) {
  const source = el.dataset.src;
  el.src = source;
 }
}
const io = new IntersectionObserver(ioes => {
 ioes.forEach(ioe => {
  const el = ioe.target;
  const intersectionRatio = ioe.intersectionRatio;
  if (intersectionRatio > 0 && intersectionRatio <= 1) {
   loadImg(el);
  }
  el.onload = el.onerror = () => io.unobserve(el);
 });
});

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jQuery实现滚动鼠标放大缩小图片的方法(附demo源码下载)
Mar 05 Javascript
jQuery实现HTML表格单元格的合并功能
Apr 06 Javascript
js学习阶段总结(必看篇)
Jun 16 Javascript
基于JQuery实现分隔条的功能
Jun 17 Javascript
Vue filter介绍及其使用详解
Oct 21 Javascript
vue 自定义全局方法,在组件里面的使用介绍
Feb 28 Javascript
js传递数组参数到后台controller的方法
Mar 29 Javascript
react build 后打包发布总结
Aug 24 Javascript
JavaScript中工厂函数与构造函数示例详解
May 06 Javascript
深入学习JavaScript 高阶函数
Jun 11 Javascript
jquery获取并修改触发事件的DOM元素示例【基于target 属性】
Oct 10 jQuery
Vue的Options用法说明
Aug 14 Javascript
JavaScript实现浅拷贝与深拷贝的方法分析
Jul 05 #Javascript
手把手教你用Node.js爬虫爬取网站数据的方法
Jul 05 #Javascript
vue使用ElementUI时导航栏默认展开功能的实现
Jul 04 #Javascript
vue两个组件间值的传递或修改方式
Jul 04 #Javascript
jQuery实现炫丽的3d旋转星空效果
Jul 04 #jQuery
jQuery实现table表格checkbox全选的方法分析
Jul 04 #jQuery
React组件内事件传参实现tab切换的示例代码
Jul 04 #Javascript
You might like
PHP判断文件是否存在、是否可读、目录是否存在的代码
2012/10/03 PHP
php使用post数组的键值创建同名变量并赋值的方法
2015/04/03 PHP
PHP模拟asp中response类实现方法
2015/08/08 PHP
详解PHP的Yii框架中组件行为的属性注入和方法注入
2016/03/18 PHP
PHP使用strrev翻转中文乱码问题的解决方法
2017/01/13 PHP
php实现微信扫码支付
2017/03/26 PHP
php实现JWT(json web token)鉴权实例详解
2019/11/05 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
让div层随鼠标移动的实现代码 ie ff
2009/12/18 Javascript
jquery keypress,keyup,onpropertychange键盘事件
2010/06/25 Javascript
找出字符串中出现次数最多的字母和出现次数精简版
2012/11/07 Javascript
基于jquery实现控制经纬度显示地图与卫星
2013/05/20 Javascript
Jquery实现顶部弹出框特效
2015/08/08 Javascript
jquery带下拉菜单和焦点图代码分享
2015/08/24 Javascript
jQuery下拉菜单的实现代码
2016/11/03 Javascript
jQuery webuploader分片上传大文件
2016/11/07 Javascript
使用smartupload组件实现jsp+jdbc上传下载文件实例解析
2017/01/05 Javascript
vue 添加vux的代码讲解
2017/11/30 Javascript
vue构建动态表单的方法示例
2018/09/22 Javascript
JavaScript的查询机制LHS和RHS解析
2019/08/16 Javascript
Vue清除定时器setInterval优化方案分享
2020/07/21 Javascript
跟老齐学Python之折腾一下目录
2014/10/24 Python
python实现数据写入excel表格
2018/03/25 Python
Numpy之文件存取的示例代码
2018/08/03 Python
python中执行smtplib失败的处理方法
2020/07/01 Python
python3.7中安装paddleocr及paddlepaddle包的多种方法
2020/11/27 Python
基于Python中Remove函数的用法讨论
2020/12/11 Python
纯css3实现鼠标经过图片显示描述的动画效果
2014/09/01 HTML / CSS
波兰在线儿童和婴儿用品零售商:pinkorblue
2019/06/29 全球购物
软件测试企业面试试卷
2016/07/13 面试题
九年级语文教学反思
2014/02/04 职场文书
垃圾桶标语
2014/06/24 职场文书
西岭雪山导游词
2015/02/06 职场文书
2016秋季幼儿园开学寄语
2015/12/03 职场文书
python实现股票历史数据可视化分析案例
2021/06/10 Python
厉害!这是Redis可视化工具最全的横向评测
2021/07/15 Redis