前端图片懒加载(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 相关文章推荐
js查找父节点的简单方法
Jun 28 Javascript
jQuery 使用手册(七)
Sep 23 Javascript
原生Js与jquery的多组处理, 仅展开一个区块的折叠效果
Jan 09 Javascript
js实现从中间开始往上下展开网页窗口的方法
Mar 02 Javascript
js实现文本框宽度自适应文本宽度的方法
Aug 13 Javascript
JSON与XML的区别对比及案例应用
Nov 11 Javascript
Vue.2.0.5过渡效果使用技巧
Mar 16 Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
Jun 12 jQuery
在 Angular6 中使用 HTTP 请求服务端数据的步骤详解
Aug 06 Javascript
vue webpack重写cookie路径的方法
Jul 10 Javascript
JS操作json对象key、value的常用方法分析
Oct 29 Javascript
整理 node-sass 安装失败的原因及解决办法(小结)
Feb 19 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
html中select语句读取mysql表中内容
2006/10/09 PHP
PHP中的函数嵌套层数限制分析
2011/06/13 PHP
微信公众平台开发关注及取消关注事件的方法
2014/12/23 PHP
详解WordPress中用于合成数组的wp_parse_args()函数
2015/12/18 PHP
Yii框架实现的验证码、登录及退出功能示例
2017/05/20 PHP
PHP连接SQL server数据库测试脚本运行实例
2020/08/24 PHP
javascript实现图片切换的幻灯片效果源代码
2012/12/12 Javascript
js导出table到excel同时兼容FF和IE示例
2013/09/03 Javascript
jQuery瀑布流插件Wookmark使用实例
2014/04/02 Javascript
异步JavaScript编程中的Promise使用方法
2015/07/28 Javascript
在微信、支付宝、百度钱包实现点击返回按钮关闭当前页面和窗口的方法
2016/08/05 Javascript
JS定时器实现数值从0到10来回变化
2016/12/09 Javascript
利用Jquery实现几款漂亮实用的时间轴(附示例代码)
2017/02/15 Javascript
bootstrap模态框远程示例代码分享
2017/05/22 Javascript
vue-cli3搭建项目的详细步骤
2018/12/05 Javascript
JS基于ES6新特性async await进行异步处理操作示例
2019/02/02 Javascript
让你30分钟快速掌握vue3教程
2020/10/26 Javascript
Vue自定义表单内容检查rules实例
2020/10/30 Javascript
Python使用MySQLdb for Python操作数据库教程
2014/10/11 Python
深入解析Python中的lambda表达式的用法
2015/08/28 Python
python判断字符串是否是json格式方法分享
2017/11/07 Python
Python PyQt5 Pycharm 环境搭建及配置详解(图文教程)
2019/07/16 Python
Python 使用matplotlib模块模拟掷骰子
2019/08/08 Python
python异常处理之try finally不报错的原因
2020/05/18 Python
python下对hsv颜色空间进行量化操作
2020/06/04 Python
英国高档时尚男装购物网站:MR PORTER
2016/08/09 全球购物
报关员个人职业生涯规划书
2014/03/12 职场文书
学生会宣传部部长竞选演讲稿
2014/04/25 职场文书
奥巴马胜选演讲稿
2014/05/15 职场文书
投标承诺书怎么写
2014/05/24 职场文书
小学校本培训方案
2014/06/06 职场文书
第二次离婚起诉书
2015/05/18 职场文书
宣传稿格式范文
2015/07/23 职场文书
Django使用channels + websocket打造在线聊天室
2021/05/20 Python
详解Redis瘦身指南
2021/05/26 Redis
浅谈Python数学建模之整数规划
2021/06/23 Python