前端图片懒加载(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 相关文章推荐
基于jQuery的表格操作插件
Apr 22 Javascript
jQuery EasyUI API 中文文档 - ComboBox组合框
Oct 07 Javascript
关于js日期转化为毫秒数“节省20%的效率和和节省9个字符“问题
Mar 01 Javascript
浅析Javascript中bind()方法的使用与实现
Apr 29 Javascript
实例讲解Jquery中隐藏hide、显示show、切换toggle的用法
May 13 Javascript
通过jquery-ui中的sortable来实现拖拽排序的简单实例
May 24 Javascript
js转换对象为xml
Feb 17 Javascript
详解Vue 非父子组件通信方法(非Vuex)
May 24 Javascript
MVVM 双向绑定的实现代码
Jun 21 Javascript
结合axios对项目中的api请求进行封装操作
Sep 21 Javascript
js节流防抖应用场景,以及在vue中节流防抖的具体实现操作
Sep 21 Javascript
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
Feb 20 Vue.js
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
全国FM电台频率大全 - 13 福建省
2020/03/11 无线电
咖啡产品发展的三大浪潮
2021/03/04 咖啡文化
PHP目录函数实现创建、读取目录教程实例
2011/01/13 PHP
destoon实现调用当前栏目分类及子分类和三级分类的方法
2014/08/21 PHP
php下Memcached入门实例解析
2015/01/05 PHP
推荐一些非常不错的javascript学习资源站点
2007/08/29 Javascript
jQuery使用ajax跨域获取数据的简单实例
2016/05/18 Javascript
百度多文件异步上传控件webuploader基本用法解析
2016/11/07 Javascript
Vue的watch和computed方法的使用及区别介绍
2018/09/06 Javascript
详解js 创建对象的几种方法
2019/03/08 Javascript
原生js实现ajax请求和JSONP跨域请求操作示例
2020/03/14 Javascript
vue style width a href动态拼接问题的解决
2020/08/07 Javascript
vue3.0生命周期的示例代码
2020/09/24 Javascript
[33:28]完美世界DOTA2联赛PWL S3 PXG vs GXR 第三场 12.19
2020/12/24 DOTA
Python的re模块正则表达式操作
2016/05/25 Python
Python实现快速计算词频功能示例
2018/06/25 Python
简单谈谈python基本数据类型
2018/09/26 Python
对Python3中bytes和HexStr之间的转换详解
2018/12/04 Python
Python 矩阵转置的几种方法小结
2019/12/02 Python
python不相等的两个字符串的 if 条件判断为True详解
2020/03/12 Python
关于HTML5的22个初级技巧(图文教程)
2012/06/21 HTML / CSS
美体小铺波兰官方网站:The Body Shop波兰
2019/09/03 全球购物
Groupon荷兰官方网站:高达70%的折扣
2019/11/01 全球购物
PHP面试题及答案一
2012/06/18 面试题
工程招投标邀请书
2014/01/26 职场文书
母亲节感恩活动记录
2014/03/16 职场文书
工作鉴定评语
2014/05/04 职场文书
市场营销工作计划书
2014/09/15 职场文书
2014年减负工作总结
2014/12/10 职场文书
秦始皇兵马俑导游词
2015/02/02 职场文书
签证工作证明模板
2015/06/15 职场文书
2016教师学习党章心得体会
2016/01/15 职场文书
导游词之桂林
2019/08/20 职场文书
Nginx+Tomcat实现负载均衡、动静分离的原理解析
2021/03/31 Servers
Javascript 解构赋值详情
2021/11/17 Javascript
微信小程序结合ThinkPHP5授权登陆后获取手机号
2021/11/23 PHP