前端图片懒加载(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 相关文章推荐
提高 DHTML 页面性能
Dec 25 Javascript
一个js实现的所谓的滑动门
May 23 Javascript
Javascript typeof 用法
Dec 28 Javascript
某页码显示的helper 少量调整,另附js版
Sep 12 Javascript
Bootstrap风格的WPF样式
Dec 07 Javascript
JS实现DIV高度自适应窗口示例
Feb 16 Javascript
bootstrap的常用组件和栅格式布局详解
May 02 Javascript
JS基于正则实现数字千分位用逗号分隔的方法
Jun 16 Javascript
js实现下拉框二级联动
Dec 04 Javascript
jQuery模拟html下拉多选框的原生实现方法示例
May 30 jQuery
jquery+ajax实现异步上传文件显示进度条
Aug 17 jQuery
原生JS封装vue Tab切换效果
Apr 28 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
解析PHP提交后跳转
2013/06/23 PHP
thinkPHP中验证码的简单实现方法
2016/12/05 PHP
laravel获取不到session的三种解决办法【推荐】
2018/09/16 PHP
认识延迟时间为0的setTimeout
2008/05/16 Javascript
javascript Demo模态窗口
2009/12/06 Javascript
[原创]js获取数组任意个不重复的随机数组元素
2010/03/15 Javascript
JQuery 弹出框定位实现方法
2010/12/02 Javascript
JS操作Cookie写入和读取实例代码
2013/10/20 Javascript
Javascript 是你的高阶函数(高级应用)
2015/06/15 Javascript
深入理解JavaScript单体内置对象
2016/06/06 Javascript
JavaScript学习笔记整理_关于表达式和语句
2016/09/19 Javascript
JavaScript仿微博发布信息案例
2016/11/16 Javascript
H5上传本地图片并预览功能
2017/05/08 Javascript
bootstrap基本配置_动力节点Java学院整理
2017/07/14 Javascript
vue.js使用代理和使用Nginx来解决跨域的问题
2018/02/03 Javascript
解决vue中使用swiper插件问题及swiper在vue中的用法
2018/04/04 Javascript
vue2.0中set添加属性后视图不能更新的解决办法
2019/02/22 Javascript
js实现数字从零慢慢增加到指定数字示例
2019/11/07 Javascript
antd-日历组件,前后禁止选择,只能选中间一部分的实例
2020/10/29 Javascript
Nuxt 项目性能优化调研分析
2020/11/07 Javascript
[01:18:43]2014 DOTA2华西杯精英邀请赛5 24 iG VS DK
2014/05/25 DOTA
Python WXPY实现微信监控报警功能的代码
2017/10/20 Python
Python插件virtualenv搭建虚拟环境
2017/11/20 Python
python定时关机小脚本
2018/06/20 Python
使用Python做定时任务及时了解互联网动态
2019/05/15 Python
查看端口并杀进程python脚本代码
2019/12/17 Python
使用PyCharm官方中文语言包汉化PyCharm
2020/11/18 Python
css3背景图片透明叠加属性cross-fade简介及用法实例
2013/01/08 HTML / CSS
在线服装零售商:SheIn
2016/07/22 全球购物
Speedo美国:澳大利亚顶尖泳衣制造商
2016/08/03 全球购物
美国在线奢侈品寄售商店:Luxury Garage Sale
2018/08/19 全球购物
领导证婚人证婚词
2014/01/13 职场文书
投资意向书
2014/07/30 职场文书
镇人大副主席民主生活会对照检查材料思想汇报
2014/10/01 职场文书
2014年军人思想汇报范文
2014/10/12 职场文书
Pytorch使用shuffle打乱数据的操作
2021/05/20 Python