前端图片懒加载(lazyload)的实现方法(提高用户体验)


Posted in Javascript onAugust 21, 2017

定义

图片懒加载又称图片延时加载、惰性加载,即在用户需要使用图片的时候加载,这样可以减少请求,节省带宽,提高页面加载速度,相对的,也能减少服务器压力。

惰性加载是程序人性化的一种体现,提高用户体验,防止一次性加载大量数据,而是根据用户需要进行资源的请求。

实现

懒加载的难点在于确定某张图片是否是用户需要的资源,在浏览器中,用户需要的是可视区内的资源,因此我们只需要判断图片是否已经呈现在可视区内,当图片呈现在可视区内时,获取图片的真实地址并赋给该图片即可(图片宽高需要指定,可以利用padding处理)。

判断是否存在于可视区

浏览器视口高度

待加载资源距离视口顶端位置

通过以上两点即可判断图片是否位于可视区内。

var nodes = document.querySelectorAll('img[data-src]'),
  elem = nodes[0],
  rect = elem.getBoundingClientRect(),
  vpHeight = document.documentElement.clientHeight;
if(rect.top < vpHeight && rect.bottom>=0) {
 console.log('show')
}

之后获取图片的真实地址

<img src="loading.gif" alt="" data-src="1.gif">
...
<script data-filtered="filtered">
  var src = elem.dataset.src;
</script>

把真实地址赋给图片

var img = new Image();
img.onload = function(){
 elem.src = img.src;
}
img.src = src;

完整代码

var scrollElement = document.querySelector('.page'),
  viewH = document.documentElement.clientHeight;
function lazyload(){
 var nodes = document.querySelectorAll('img[data-src]');
 Array.prototype.forEach.call(nodes,function(item,index){
  var rect;
  if(item.dataset.src==='') return;
  rect = item.getBoundingClientRect();
  if(rect.bottom>=0 && rect.top < viewH){
    (function(item){
     var img = new Image();
     img.onload = function(){
      item.src = img.src;
     }
     img.src = item.dataset.src
     item.dataset.src = ''
    })(item)
  }
 })
}
lazyload();
scrollElement.addEventListener('scroll',throttle(lazyload,500,1000));
function throttle(fun, delay, time) {
  var timeout,
    startTime = new Date();
  return function() {
    var context = this,
      args = arguments,
      curTime = new Date();
    clearTimeout(timeout);
    if (curTime - startTime >= time) {
      fun.apply(context, args);
      startTime = curTime;
    } else {
      timeout = setTimeout(fun, delay);
    }
  };
};

总结

以上所述是小编给大家介绍的前端图片懒加载(lazyload)的实现方法(提高用户体验),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
一份老外写的XMLHttpRequest代码多浏览器支持兼容性
Jan 11 Javascript
关于jQuery对象数据缓存Cache原理以及jQuery.data详解
Apr 07 Javascript
7款风格新颖的jQuery/CSS3菜单导航分享
Apr 23 Javascript
JavaScript实现数字数组按照倒序排列的方法
Apr 06 Javascript
javascript中使用new与不使用实例化对象的区别
Jun 22 Javascript
jQuery post数据至ashx实例详解
Nov 18 Javascript
JavaScript轮播图简单制作方法
Feb 20 Javascript
vue ssr 指南详读
Jun 29 Javascript
JavaScript实现的弹出遮罩层特效经典示例【基于jQuery】
Jul 10 jQuery
微信小程序官方动态自定义底部tabBar的例子
Sep 04 Javascript
JavaScript原生数组函数实例汇总
Oct 14 Javascript
JavaScript函数柯里化实现原理及过程
Dec 02 Javascript
Vue编写多地区选择组件
Aug 21 #Javascript
使用vue制作FullPage页面滚动效果
Aug 21 #Javascript
详解Layer弹出层样式
Aug 21 #Javascript
JS数组操作之增删改查的简单实现
Aug 21 #Javascript
JS实现评价的星星功能
Aug 20 #Javascript
详解A标签中href=&quot;&quot;的几种用法
Aug 20 #Javascript
Cropper.js 实现裁剪图片并上传(PC端)
Aug 20 #Javascript
You might like
一段php加密解密的代码
2007/07/16 PHP
php array_merge函数使用需要注意的一个问题
2015/03/30 PHP
php简单备份与还原MySql的方法
2016/05/09 PHP
ajax调用返回php接口返回json数据的方法(必看篇)
2017/05/05 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
2020/08/03 PHP
jquery animate 动画效果使用说明
2009/11/04 Javascript
jQuery实现的Email中的收件人效果(按del键删除)
2011/03/20 Javascript
使用Post提交时须将空格转换成加号的解释
2013/01/14 Javascript
jQuery动画animate方法使用介绍
2013/05/06 Javascript
对Web开发中前端框架与前端类库的一些思考
2015/03/27 Javascript
javascript封装 Cookie 应用接口
2015/08/07 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件包装
2015/11/20 Javascript
封装好的javascript前端分页插件pagination
2016/01/04 Javascript
JavaScript prototype属性详解
2016/10/25 Javascript
Bootstrap面板使用方法
2017/01/16 Javascript
AngularJS前端页面操作之用户修改密码功能示例
2017/03/27 Javascript
微信小程序实现选项卡功能
2020/06/19 Javascript
Vue组件化开发思考
2018/02/02 Javascript
Iview Table组件中各种组件扩展的使用
2018/10/20 Javascript
微信小程序分享功能onShareAppMessage(options)用法分析
2019/04/24 Javascript
jquery轻量级数字动画插件countUp.js使用详解
2019/10/17 jQuery
[01:11:35]Liquid vs LGD 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
简单介绍Ruby中的CGI编程
2015/04/10 Python
目前不被任何主流浏览器支持的CSS3属性汇总
2014/07/21 HTML / CSS
德国BA保镖药房韩文网:kr.ba.de
2017/09/04 全球购物
澳大利亚买卖正宗二手奢侈品交易平台:Luxe.It.Fwd
2019/10/16 全球购物
SQL Server笔试题
2012/01/10 面试题
秋季婚礼证婚词
2014/01/11 职场文书
金融管理专业求职信
2014/07/10 职场文书
公司领导班子四风对照检查材料
2014/09/27 职场文书
师德师风事迹材料
2014/12/20 职场文书
安全保证书
2015/01/16 职场文书
《植树问题》教学反思
2016/03/03 职场文书
postgreSQL数据库基础知识介绍
2022/04/12 PostgreSQL
Python可视化神器pyecharts之绘制箱形图
2022/07/07 Python