前端图片懒加载(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 text(),val(),html()方法区别总结
Nov 04 Javascript
jquery.hotkeys监听键盘按下事件keydown插件
May 11 Javascript
javascript使用call调用微信API
Dec 15 Javascript
jQuery中prependTo()方法用法实例
Jan 08 Javascript
通过JS判断联网类型和连接状态的实现代码
Apr 01 Javascript
JavaScript转换与解析JSON方法实例详解
Nov 24 Javascript
轻松搞定js表单验证
Oct 13 Javascript
小发现之浅谈location.search与location.hash的问题
Jun 23 Javascript
AngularJS 打开新的标签页实现代码
Sep 07 Javascript
koa-router源码学习小结
Sep 07 Javascript
快速解决layui弹窗按enter键不停弹窗的问题
Sep 18 Javascript
原生jQuery实现只显示年份下拉框
Dec 24 jQuery
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面向对象学习笔记之一 基础概念
2012/10/06 PHP
php将字符串全部转换成大写或者小写的方法
2015/03/17 PHP
php实现网站留言板功能
2015/11/04 PHP
Yii框架中jquery表单验证插件用法示例
2016/10/18 PHP
Ext grid 添加右击菜单
2009/11/26 Javascript
JavaScript中将一个值转换为字符串的方法分析[译]
2012/09/21 Javascript
JQuery PHP图片在线裁剪实例
2020/07/27 Javascript
js 作用域和变量详解
2017/02/16 Javascript
d3.js实现立体柱图的方法详解
2017/04/28 Javascript
Angularjs中数据绑定的实例详解
2017/08/25 Javascript
微信小程序自定义toast的实现代码
2018/11/16 Javascript
Angular封装搜索框组件操作示例
2019/04/25 Javascript
详解微信小程序胶囊按钮返回|首页自定义导航栏功能
2019/06/14 Javascript
koa2 从入门到精通(小结)
2019/07/23 Javascript
解决vue中的无限循环问题
2020/07/27 Javascript
jQuery编写QQ简易聊天框
2020/08/27 jQuery
[49:08]OpTic vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
深入理解Python3中的http.client模块
2017/03/29 Python
Python基于回溯法子集树模板解决数字组合问题实例
2017/09/02 Python
Python实现的选择排序算法原理与用法实例分析
2017/11/22 Python
Python将DataFrame的某一列作为index的方法
2018/04/08 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
2018/04/18 Python
python 常用日期处理-- datetime 模块的使用
2020/09/02 Python
表单button的outline在firefox浏览器下的问题
2012/12/24 HTML / CSS
教师自我评价范例
2013/09/24 职场文书
新闻专业大学生找工作的自我评价
2013/10/30 职场文书
学生实习介绍信
2014/01/15 职场文书
单身联谊活动方案
2014/01/29 职场文书
开学典礼感言
2014/02/16 职场文书
关于拾金不昧的感谢信
2015/01/21 职场文书
社团个人总结范文
2015/03/05 职场文书
2015年乡镇信访工作总结
2015/04/07 职场文书
学校教学工作总结2015
2015/05/19 职场文书
离婚被告代理词
2015/05/23 职场文书
Win11安装升级时提示“该电脑必须支持安全启动”
2022/04/19 数码科技
使用Django框架创建项目
2022/06/10 Python