前端图片懒加载(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图片画廊插件 推荐
May 12 Javascript
超实用的JavaScript表单代码段
Feb 26 Javascript
JavaScript实现相册弹窗功能(zepto.js)
Jun 21 Javascript
Vue自定义图片懒加载指令v-lazyload详解
Dec 31 Javascript
Ionic项目中Native Camera的使用方法
Jun 07 Javascript
微信小程序 动画的简单实例
Oct 12 Javascript
手写Node静态资源服务器的实现方法
Mar 20 Javascript
快速解决select2在bootstrap模态框中下拉框隐藏的问题
Aug 10 Javascript
js使用formData实现批量上传
Mar 27 Javascript
Vue项目从webpack3.x升级webpack4不完全指南
Apr 28 Javascript
vue实现带过渡效果的下拉菜单功能
Feb 19 Javascript
vue @click.native 绑定原生点击事件
Apr 22 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
seajs1.3.0源码解析之module依赖有序加载
2012/11/07 Javascript
JQuery对表格进行操作的常用技巧总结
2014/04/23 Javascript
在JavaScript中操作时间之getYear()方法的使用教程
2015/06/11 Javascript
详解原生JavaScript实现jQuery中AJAX处理的方法
2016/05/10 Javascript
JS简单设置下拉选择框默认值的方法
2016/08/20 Javascript
利用Angular.js限制textarea输入的字数
2016/10/20 Javascript
angular源码学习第一篇 setupModuleLoader方法
2016/10/20 Javascript
Angular2平滑升级到Angular4的步骤详解
2017/03/29 Javascript
jQuery滑动到底部加载下一页数据的实例代码
2017/05/22 jQuery
Angularjs 实现动态添加控件功能
2017/05/25 Javascript
Vue三层嵌套路由的示例代码
2018/05/05 Javascript
JavaScript门道之标准库
2018/05/26 Javascript
JavaScript高阶教程之“==”隐藏下的类型转换
2019/04/11 Javascript
nodejs使用Sequelize框架操作数据库的实现
2020/10/21 NodeJs
Antd表格滚动 宽度自适应 不换行的实例
2020/10/27 Javascript
深入Python函数编程的一些特性
2015/04/13 Python
使用Python的Tornado框架实现一个简单的WebQQ机器人
2015/04/24 Python
基于Python实现一个简单的银行转账操作
2016/03/06 Python
Django 前后台的数据传递的方法
2017/08/08 Python
python 类对象和实例对象动态添加方法(分享)
2017/12/31 Python
Python实现学校管理系统
2018/01/11 Python
Python实现随机生成手机号及正则验证手机号的方法
2018/04/25 Python
Python 读取指定文件夹下的所有图像方法
2018/04/27 Python
用python3 urllib破解有道翻译反爬虫机制详解
2019/08/14 Python
使用Python对Dicom文件进行读取与写入的实现
2020/04/20 Python
用python对excel进行操作(读,写,修改)
2020/12/25 Python
Html5剪切板功能的实现代码
2018/06/29 HTML / CSS
最新大学毕业求职简历的自我评价
2013/10/18 职场文书
安全标语大全
2014/06/10 职场文书
学雷锋宣传标语
2014/06/25 职场文书
个人诉讼委托书范本
2014/10/17 职场文书
银行客户经理岗位职责
2015/04/09 职场文书
高三数学教学反思
2016/02/18 职场文书
JavaScript实现班级抽签小程序
2021/05/19 Javascript
Python编程编写完善的命令行工具
2021/09/15 Python
mysql5.6主从搭建以及不同步问题详解
2021/12/04 MySQL