原生JS实现图片懒加载(lazyload)实例


Posted in Javascript onJune 13, 2017

前言

图片懒加载也是比较常见的一种性能优化的方法,最近在用vue做一个新闻列表的客户端时也用到了,这里就简单介绍下实现原理和部分代码。

实现原理

加载页面的时候,图片一直都是流量大头,针对图片的性能方法也挺多的比如base64、雪碧图等;懒加载也是其中一种,主要原理是将非首屏的图片src设为一个默认值,然后监听窗口滚动,当图片出现在视窗中时再给他赋予真实的图片地址,这样可以保证首屏的加载速度然后按需加载图片。

原生JS实现图片懒加载(lazyload)实例

具体代码

首先在渲染时,图片引用默认图片,然后把真实地址放在data-*属性上面。

<image src='./../assets/default.png' :data-src='item.allPics' class='lazyloadimg'>

然后是监听滚动,直接用window.onscroll就可以了,但是要注意一点的是类似于window的scroll和resize,还有mousemove这类触发很频繁的事件,最好用节流(throttle)或防抖函数(debounce)来控制一下触发频率。underscore和lodash里面都有封装这两个方法,这里先不多做介绍了。

接着要判断图片是否出现在了视窗里面,主要是三个高度:1,当前body从顶部滚动了多少距离。2,视窗的高度。3,当前图片距离顶部的距离。具体代码如下:

window.onscroll =_.throttle(this.watchscroll, 200);
watchscroll () {
  var bodyScrollHeight = document.body.scrollTop;// body滚动高度
  var windowHeight = window.innerHeight;// 视窗高度
  var imgs = document.getElementsByClassName('lazyloadimg');
  for (var i =0; i < imgs.length; i++) {
  var imgHeight = imgs[i].offsetTop;// 图片距离顶部高度
  if (imgHeight < windowHeight + bodyScrollHeight) {
   imgs[i].src = imgs[i].getAttribute('data-src');
   img[i].className = img[i].className.replace('lazyloadimg','')
  }
  }
 }

结语

大概内容就这么多了,下次可能会补充一下防抖节流源码的实现。最后再补充两个常见的滚动判断:

1.页面滚动离开首屏(这时可显示回到顶部的按钮):document.body.scrollTop > window.innerHeight

2.页面滚动到底部了(这时可去调接口获取更多内容):window.scrollY + window.innerHeight > document.body.offsetHeight

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Jquery 动态生成表格示例代码
Dec 24 Javascript
使用CSS3的scale实现网页整体缩放
Mar 18 Javascript
jQuery实现信息提示框(带有圆角框与动画)效果
Aug 07 Javascript
JQuery导航菜单选择特效
Apr 11 Javascript
javascript事件处理模型实例说明
May 31 Javascript
jQuery中slidedown与slideup方法用法示例
Sep 16 Javascript
详谈jQuery.load()和Jsp的include的区别
Apr 12 jQuery
underscore之Collections_动力节点Java学院整理
Jul 10 Javascript
vue router 通过路由来实现切换头部标题功能
Apr 24 Javascript
JavaScript实现随机点名器
Mar 25 Javascript
vue根据条件不同显示不同按钮的操作
Aug 04 Javascript
vue+element table表格实现动态列筛选的示例代码
Jan 14 Vue.js
angular bootstrap timepicker TypeError提示怎么办
Jun 13 #Javascript
解决bootstrap下拉菜单点击立即隐藏bug的方法
Jun 13 #Javascript
javascript实现非常简单的小数取整功能示例
Jun 13 #Javascript
微信小程序 新建登录页并实现tabBar隐藏
Jun 13 #Javascript
Node.js使用orm2进行update操作时关联字段无法修改的解决方法
Jun 13 #Javascript
bootstrap timepicker在angular中取值并转化为时间戳
Jun 13 #Javascript
微信小程序实现多个按钮toggle功能的实例
Jun 13 #Javascript
You might like
东芝TOSHIBA RP-F11电路分析
2021/03/02 无线电
PHP脚本中include文件出错解决方法
2008/11/20 PHP
PHP实现获取域名的方法小结
2014/11/05 PHP
Zend Framework教程之Resource Autoloading用法实例
2016/03/08 PHP
PHP-FPM实现性能优化
2016/03/31 PHP
php实现微信支付之企业付款
2018/05/30 PHP
PHP按一定比例压缩图片的方法
2018/10/12 PHP
javascript innerText和innerHtml应用
2010/01/28 Javascript
js鼠标滑过弹出层的定位IE6bug解决办法
2012/12/26 Javascript
jquery实现的导航固定效果
2014/04/28 Javascript
js取模(求余数)隔行变色
2014/05/15 Javascript
JS使用parseInt解析数字实现求和的方法
2015/08/05 Javascript
微信小程序教程之本地图片上传(leancloud)实例详解
2016/11/16 Javascript
canvas快速绘制圆形、三角形、矩形、多边形方法介绍
2016/12/29 Javascript
Vue.js:使用Vue-Router 2实现路由功能介绍
2017/02/22 Javascript
微信小程序 出现错误:{&quot;baseresponse&quot;:{&quot;errcode&quot;:-80002,&quot;errmsg&quot;:&quot;&quot;}}解决办法
2017/02/23 Javascript
使用veloticy-ui生成文字动画效果
2018/02/08 Javascript
纯JS实现可用于页码更换的飞页特效示例
2018/05/21 Javascript
JS常见构造模式实例对比分析
2018/08/27 Javascript
JS字符串补全方法padStart()和padEnd()
2020/05/27 Javascript
[02:42]DOTA2英雄基础教程 杰奇洛
2013/12/23 DOTA
Centos5.x下升级python到python2.7版本教程
2015/02/14 Python
Django实现自定义404,500页面教程
2017/03/26 Python
教大家玩转Python字符串处理的七种技巧
2017/03/31 Python
python学习之matplotlib绘制散点图实例
2017/12/09 Python
Python日志模块logging基本用法分析
2018/08/23 Python
在python中使用requests 模拟浏览器发送请求数据的方法
2018/12/26 Python
Python多进程写入同一文件的方法
2019/01/14 Python
python实现kmp算法的实例代码
2019/04/03 Python
用Python批量把文件复制到另一个文件夹的实现方法
2019/08/16 Python
浅析使用Python搭建http服务器
2019/10/27 Python
Python Websocket服务端通信的使用示例
2020/02/25 Python
小学后勤管理制度
2014/01/14 职场文书
五四青年节比赛演讲稿
2015/03/18 职场文书
电影复兴之路观后感
2015/06/02 职场文书
python 爬取京东指定商品评论并进行情感分析
2021/05/27 Python