前端图片懒加载(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 相关文章推荐
精心挑选的15个jQuery下拉菜单制作教程
Jun 15 Javascript
jquery 实现窗口的最大化不论什么情况
Sep 03 Javascript
jQuery控制TR显示隐藏的三种常用方法
Aug 21 Javascript
鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解
Mar 12 Javascript
简述Jquery与DOM对象
Jul 10 Javascript
原生态js,鼠标按下后,经过了那些单元格的简单实例
Aug 11 Javascript
基于BootStrap的Metronic框架实现页面链接收藏夹功能按钮移动收藏记录(使用Sortable进行拖动排序)
Aug 29 Javascript
Angular网络请求的封装方法
May 22 Javascript
vue项目首屏打开速度慢的解决方法
Mar 31 Javascript
vue页面加载时的进度条功能(实例代码)
Jan 13 Javascript
使用原生JS实现滚轮翻页效果的示例代码
May 31 Javascript
JavaScript代码实现简单计算器
Dec 27 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编程最快明白》第四讲:日期、表单接收、session、cookie
2010/11/01 PHP
PHP面试常用算法(推荐)
2016/07/22 PHP
PHP实现Session入库/存入redis的方法
2017/05/04 PHP
PHP实现求解最长公共子串问题的方法
2017/11/17 PHP
JavaScript高级程序设计 学习笔记 js高级技巧
2011/09/20 Javascript
jQuery实现用户注册的表单验证示例
2013/08/28 Javascript
html5 canvas js(数字时钟)实例代码
2013/12/23 Javascript
使用javascript为网页增加夜间模式
2014/01/26 Javascript
js函数参数设置默认值的一种变通实现方法
2014/05/26 Javascript
jQuery中data()方法用法实例
2014/12/27 Javascript
js密码强度检测
2016/01/07 Javascript
基于Node.js的强大爬虫 能直接发布抓取的文章哦
2016/01/10 Javascript
jQuery Dialog对话框事件用法实例分析
2016/05/10 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
2016/05/31 Javascript
jQuery实现对无序列表的排序功能(附demo源码下载)
2016/06/25 Javascript
javascript 中的console.log和弹出窗口alert
2016/08/30 Javascript
js数组去重的hash方法
2016/12/22 Javascript
使用jQuery实现简单的tab框实例
2017/08/22 jQuery
[01:13:01]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第三场
2018/04/05 DOTA
举例讲解Python中的迭代器、生成器与列表解析用法
2016/03/20 Python
深入理解Python分布式爬虫原理
2017/11/23 Python
python读取和保存视频文件
2018/04/16 Python
python 利用浏览器 Cookie 模拟登录的用户访问知乎的方法
2019/07/11 Python
Python Django 命名空间模式的实现
2019/08/09 Python
详谈tensorflow gfile文件的用法
2020/02/05 Python
Python接收手机短信的代码整理
2020/08/02 Python
python实现代码审查自动回复消息
2021/02/01 Python
html5视频播放_动力节点Java学院整理
2017/07/13 HTML / CSS
平面设计师的工作职责
2013/11/21 职场文书
客户经理竞聘演讲稿
2014/05/15 职场文书
花坛标语大全
2014/06/30 职场文书
小学生作文批改评语
2014/12/25 职场文书
大学生党员个人总结
2015/02/13 职场文书
MySQL命令行操作时的编码问题详解
2021/04/14 MySQL
用Python监控你的朋友都在浏览哪些网站?
2021/05/27 Python
MySQL中的隐藏列的具体查看
2021/09/04 MySQL