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 相关文章推荐
一段多浏览器的&quot;复制到剪贴板&quot;javascript代码
Mar 27 Javascript
扩展javascript的Date方法实现代码(prototype)
Nov 20 Javascript
Jquery中Ajax 缓存带来的影响的解决方法
May 19 Javascript
jquery事件机制扩展插件 jquery鼠标右键事件
Dec 21 Javascript
JavaScript修改css样式style动态改变元素样式
Dec 16 Javascript
Javascript 实现图片无缝滚动
Dec 19 Javascript
JS显示下拉列表框内全部元素的方法
Mar 31 Javascript
JS实现兼容各浏览器解析XML文档数据的方法
Jun 01 Javascript
jQuery插件之jQuery.Form.js用法实例分析(附demo示例源码)
Jan 04 Javascript
js实现简单排列组合的方法
Jan 27 Javascript
javascript中活灵活现的Array对象详解
Nov 30 Javascript
node.js监听文件变化的实现方法
Apr 17 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设计模式 Decorator(装饰模式)
2011/06/26 PHP
php dirname(__FILE__) 获取当前文件的绝对路径
2011/06/28 PHP
PHP fopen 读取带中文URL地址的一点见解
2012/09/25 PHP
PHP中exec与system用法区别分析
2014/09/22 PHP
thinkphp获取栏目和文章当前位置的方法
2014/10/29 PHP
ThinkPHP使用Smarty第三方插件方法小结
2016/03/19 PHP
php中final关键字用法分析
2016/12/07 PHP
Extjs ajax同步请求时post方式参数发送方式
2009/08/05 Javascript
qTip 基于JQuery的Tooltip插件[兼容性好]
2010/09/01 Javascript
JSON 数据格式介绍
2012/01/13 Javascript
JS限制Textarea文本域字符个数的具体实现
2013/08/02 Javascript
用Js实现的动态增加表格示例自己写的
2013/10/21 Javascript
WordPress中鼠标悬停显示和隐藏评论及引用按钮的实现
2016/01/12 Javascript
JavaScript实现刷新不重记的倒计时
2016/08/10 Javascript
vue.js如何更改默认端口号8080为指定端口的方法
2017/07/14 Javascript
简单谈谈JS中的正则表达式
2017/09/11 Javascript
vue.js实现的全选与全不选功能示例【基于elementui】
2018/12/03 Javascript
微信小程序的开发范式BeautyWe.js入门详解
2019/07/10 Javascript
Python pickle模块用法实例
2015/04/14 Python
linux平台使用Python制作BT种子并获取BT种子信息的方法
2017/01/20 Python
Python cookbook(数据结构与算法)实现优先级队列的方法示例
2018/02/18 Python
Python爬虫PyQuery库基本用法入门教程
2018/08/04 Python
python多线程案例之多任务copy文件完整实例
2019/10/29 Python
PyTorch中的Variable变量详解
2020/01/07 Python
Tensorflow 1.0之后模型文件、权重数值的读取方式
2020/02/12 Python
无需JS和jQuery代码实现CSS3鼠标浮动放大图片
2016/11/21 HTML / CSS
日本钓鱼渔具和户外用品网上商店:naturum
2016/08/07 全球购物
美国婚礼和派对礼品网站:Kate Aspen(新娘送礼会、迎婴派对)
2018/03/28 全球购物
Deichmann英国:德国鞋类零售商
2021/01/30 全球购物
计算机应用与科学个人的自我评价
2013/11/15 职场文书
我的动漫时代的创业计划书范文
2014/01/27 职场文书
单身申明具结书
2015/02/26 职场文书
美甲店的创业计划书模板
2019/08/23 职场文书
八年级作文之一起的走过日子
2019/09/17 职场文书
golang gopm get -g -v 无法获取第三方库的解决方案
2021/05/05 Golang
JavaScript函数柯里化
2021/11/07 Javascript