前端图片懒加载(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.ajax传递中文参数的解决方法
May 28 Javascript
js中判断Object、Array、Function等引用类型对象是否相等
Aug 29 Javascript
js获取页面description的方法
May 21 Javascript
jquery实现顶部向右伸缩的导航区域代码
Sep 02 Javascript
12种JavaScript常用的MVC框架比较分析
Nov 16 Javascript
微信公众平台开发教程(四) 实例入门:机器人回复(附源码)
Dec 02 Javascript
js手机号批量滚动抽奖实现代码
Apr 17 Javascript
浅谈Node.js 子进程与应用场景
Jan 24 Javascript
解决cordova+vue 项目打包成APK应用遇到的问题
May 10 Javascript
JS学习笔记之贪吃蛇小游戏demo实例详解
May 29 Javascript
jquery实现上传文件进度条
Mar 26 jQuery
vue使用screenfull插件实现全屏功能
Sep 17 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
了解Joomla 这款来自国外的php网站管理系统
2010/03/11 PHP
Yii操作数据库实现动态获取表名的方法
2016/03/29 PHP
thinkPHP简单实现多个子查询语句的方法
2016/12/05 PHP
PHP获取数组中单列值的方法
2017/06/10 PHP
js 小贴士一星期合集
2010/04/07 Javascript
为JS扩展Array.prototype.indexOf引发的问题探讨及解决
2013/04/24 Javascript
jquery结合CSS使用validate实现漂亮的验证
2015/01/29 Javascript
简介可以自动完成UI的AngularJS工具angular-smarty
2015/06/23 Javascript
javascript判断网页是关闭还是刷新
2015/09/12 Javascript
Google 地图叠加层实例讲解
2016/08/06 Javascript
js时间比较 js计算时间差的简单实现方法
2016/08/26 Javascript
基于JS实现横线提示输入验证码随验证码输入消失(js验证码的实现)
2016/10/27 Javascript
nodejs前端模板引擎swig入门详解
2018/05/15 NodeJs
vue中使用sessionStorage记住密码功能
2018/07/24 Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
2018/09/04 Javascript
JavaScript类的继承操作实例总结
2018/12/20 Javascript
使用javascript做时间倒数读秒功能的实例
2019/01/23 Javascript
[41:52]2018DOTA2亚洲邀请赛3月29日小组赛B组Effect VS Secret
2018/03/30 DOTA
[20:39]DOTA2-DPC中国联赛 正赛开幕式 1月18日
2021/03/11 DOTA
深入浅析python中的多进程、多线程、协程
2016/06/22 Python
Python 基础之字符串string详解及实例
2017/04/01 Python
python实现静态web服务器
2019/09/03 Python
使用sklearn对多分类的每个类别进行指标评价操作
2020/06/11 Python
Python 虚拟环境工作原理解析
2020/12/24 Python
Html5在手机端调用相机的方法实现
2020/05/13 HTML / CSS
Timberland美国官网:全球领先的户外品牌
2016/08/15 全球购物
建筑系毕业生自我鉴定
2014/01/24 职场文书
三万活动总结
2014/04/28 职场文书
企业管理标语
2014/06/10 职场文书
建筑安全责任书范本
2014/07/24 职场文书
2015年办公室人员工作总结
2015/05/15 职场文书
文明和谐家庭事迹材料(2016精选版)
2016/02/29 职场文书
高一作文之乐趣
2019/11/21 职场文书
给原生html中添加水印遮罩层的实现示例
2021/04/02 Javascript
python turtle绘制多边形和跳跃和改变速度特效
2022/03/16 Python
Win11自动黑屏怎么办 Win11自动黑屏设置教程
2022/07/15 数码科技