前端图片懒加载(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 相关文章推荐
javascript 写类方式之三
Jul 05 Javascript
过虑特殊字符输入的js代码
Aug 05 Javascript
同时使用n个window onload加载实例介绍
Apr 25 Javascript
js将json格式内容转换成对象的方法
Nov 01 Javascript
jQuery中trigger()方法用法实例
Jan 19 Javascript
js判断日期时间有效性的方法
Oct 24 Javascript
利用JS实现scroll自定义滚动效果详解
Oct 17 Javascript
使用Node.js实现ORM的一种思路详解(图文)
Oct 24 Javascript
使用webpack3.0配置webpack-dev-server教程
May 29 Javascript
Vue中computed、methods与watch的区别总结
Apr 10 Javascript
JQuery animate动画应用示例
May 14 jQuery
vue前后分离调起微信支付
Jul 29 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
php5.3 废弃函数小结
2010/05/16 PHP
php数据序列化测试实例详解
2017/08/12 PHP
PHP实现普通hash分布式算法简单示例
2018/08/06 PHP
学习面向对象之面向对象的术语
2010/11/30 Javascript
如何确保JavaScript的执行顺序 之jQuery.html深度分析
2011/03/03 Javascript
模拟多级复选框效果的jquery代码
2013/08/13 Javascript
js中的数组Array定义与sort方法使用示例
2013/08/29 Javascript
js实现用户注册协议倒计时的方法
2015/01/21 Javascript
Jquery实现顶部弹出框特效
2015/08/08 Javascript
javascript基础知识
2016/06/07 Javascript
Javascript中的 “&amp;” 和 “|” 详解
2017/02/02 Javascript
JS按钮闪烁功能的实现代码
2017/07/21 Javascript
使用use注册Vue全局组件和全局指令的方法
2018/03/08 Javascript
vue项目引入Iconfont图标库的教程图解
2018/10/24 Javascript
vue微信分享的实现(在当前页面分享其他页面)
2019/04/16 Javascript
解决mui框架中switch开关通过js控制开或者关状态时小圆点不动的问题
2019/09/03 Javascript
Angular8引入百度Echarts进行图表分析的实现代码
2019/11/27 Javascript
微信小程序request请求封装,验签代码实例
2019/12/04 Javascript
Python简单实现安全开关文件的两种方式
2016/09/19 Python
Windows下Python2与Python3两个版本共存的方法详解
2017/02/12 Python
Python之列表的插入&amp;替换修改方法
2018/06/28 Python
使用python3 实现插入数据到mysql
2020/03/02 Python
简单了解django处理跨域请求最佳解决方案
2020/03/25 Python
通过Python实现Payload分离免杀过程详解
2020/07/13 Python
python 如何将office文件转换为PDF
2020/09/22 Python
Python批量获取并保存手机号归属地和运营商的示例
2020/10/09 Python
中国电视购物:快乐购
2017/02/04 全球购物
Funko官方商店:源自美国,畅销全球搪胶收藏玩偶
2018/09/15 全球购物
英国景点门票网站:attractiontix
2019/08/27 全球购物
校园网站的创业计划书范文
2013/12/30 职场文书
本科毕业生求职自荐信
2014/04/09 职场文书
目标责任书范本
2014/04/16 职场文书
社区关爱留守儿童活动方案
2014/08/22 职场文书
办公用房租赁协议书
2014/11/29 职场文书
你知道哪几种MYSQL的连接查询
2021/06/03 MySQL
Mysql 文件配置解析介绍
2022/05/06 MySQL