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 Easyui Tree的oncheck事件实现代码
May 28 Javascript
onkeyup,onkeydown和onkeypress的区别介绍
Oct 21 Javascript
JavaScript使用二分查找算法在数组中查找数据的方法
Apr 07 Javascript
JQuery实现鼠标移动图片显示描述层的方法
Jun 25 Javascript
JS实现黑色大气的二级导航菜单效果
Sep 18 Javascript
基于jquery实现ajax无刷新评论
Aug 19 Javascript
JS实现超简单的汉字转拼音功能示例
Dec 22 Javascript
layer弹窗插件操作方法详解
May 19 Javascript
Webpack打包css后z-index被重新计算的解决方法
Jun 18 Javascript
Vue.JS项目中5个经典Vuex插件
Nov 28 Javascript
使用命令行工具npm新创建一个vue项目的方法
Dec 27 Javascript
js取小数点后两位四种方法
Jan 18 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
索尼SONY ICF-7600A(W)电路分析
2021/03/01 无线电
查找mysql字段中固定字符串并替换的几个方法
2012/09/23 PHP
PHP 设计模式系列之 specification规格模式
2016/01/10 PHP
PHP实现查询两个数组中不同元素的方法
2016/02/23 PHP
Laravel 5.5 实现禁用用户注册示例
2019/10/24 PHP
js 页面刷新location.reload和location.replace的区别小结
2009/12/24 Javascript
JavaScript DOM 学习第九章 选取范围的介绍
2010/02/19 Javascript
基于jquery可配置循环左右滚动例子
2011/09/09 Javascript
jquery 笔记 事件
2011/11/02 Javascript
js自定义事件及事件交互原理概述(一)
2013/02/01 Javascript
Javascript实现视频轮播在pc端与移动端均可
2013/09/29 Javascript
JavaScript瀑布流布局实现代码
2017/05/06 Javascript
html5+canvas实现支持触屏的签名插件教程
2017/05/08 Javascript
Vue ElementUI之Form表单验证遇到的问题
2017/08/21 Javascript
Nodejs调用Dll模块的方法
2018/09/17 NodeJs
js实现web调用摄像头 js截取视频画面
2019/04/21 Javascript
小程序识别身份证,银行卡,营业执照,驾照的实现
2019/11/05 Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
2020/07/13 Javascript
Vue toFixed保留两位小数的3种方式
2020/10/23 Javascript
用Python计算三角函数之acos()方法的使用
2015/05/15 Python
python ---lambda匿名函数介绍
2019/03/13 Python
python自定义时钟类、定时任务类
2021/02/22 Python
Python 50行爬虫抓取并处理图灵书目过程详解
2019/09/20 Python
Python获取统计自己的qq群成员信息的方法
2019/11/15 Python
银河香水:Galaxy Perfume
2019/03/25 全球购物
Marlies Dekkers内衣荷兰官方网店:荷兰奢侈内衣品牌
2020/03/27 全球购物
Ajax请求总共有多少种Callback
2016/07/17 面试题
绿化先进工作者事迹材料
2014/01/30 职场文书
搞笑车尾标语
2014/06/23 职场文书
经济贸易系求职信
2014/08/04 职场文书
民主生活会对照检查材料思想汇报
2014/09/27 职场文书
抄袭同学作业检讨书1000字
2014/11/20 职场文书
上课睡觉万能检讨书
2015/02/17 职场文书
出国导师推荐信
2015/03/25 职场文书
调研报告的主要写法
2019/04/18 职场文书
如何用RabbitMQ和Swoole实现一个异步任务系统
2021/05/29 PHP