原生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 相关文章推荐
js的with语句使用方法
Sep 21 Javascript
JQuery异步获取返回值中文乱码的解决方法
Jan 29 Javascript
javascript常见数字进制转换实例分析
Apr 21 Javascript
js实现纯前端的图片预览
Apr 27 Javascript
Angularjs---项目搭建图文教程
Jul 08 Javascript
js实现多图左右切换功能
Aug 04 Javascript
基于Bootstrap仿淘宝分页控件实现代码
Nov 07 Javascript
node.js + socket.io 实现点对点随机匹配聊天
Jun 30 Javascript
详解基于node的前端项目编译时内存溢出问题
Aug 01 Javascript
Node.js  REPL (交互式解释器)实例详解
Aug 06 Javascript
微信小程序局部刷新触发整页刷新效果的实现代码
Nov 21 Javascript
微信小程序实现上传多张图片、删除图片
Jul 29 Javascript
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
Cappuccino 卡布其诺咖啡之制作
2021/03/03 冲泡冲煮
ThinkPHP验证码使用简明教程
2014/03/05 PHP
CodeIgniter表单验证方法实例详解
2016/03/03 PHP
PHP堆栈调试操作简单示例
2018/06/15 PHP
thinkPHP3.2使用RBAC实现权限管理的实现
2019/08/27 PHP
phpinfo的知识点总结
2019/10/10 PHP
Nigma vs Liquid BO3 第二场2.13
2021/03/10 DOTA
(转载)JavaScript中匿名函数,函数直接量和闭包
2007/05/08 Javascript
javascript之通用简单的table选项卡实现(二)
2010/05/09 Javascript
javascript的渐进增强与平稳退化浅谈
2013/11/12 Javascript
jquery.autocomplete修改实现键盘上下键自动填充示例
2013/11/19 Javascript
jquery自定义滚动条插件示例分享
2014/02/21 Javascript
js强制把网址设为默认首页
2015/09/29 Javascript
Vue.js每天必学之数据双向绑定
2016/09/05 Javascript
AngularJS自定义指令之复制指令实现方法
2017/05/18 Javascript
Angularjs cookie 操作实例详解
2017/09/27 Javascript
Vue登录注册并保持登录状态的方法
2018/08/17 Javascript
Vue.js项目实战之多语种网站的功能实现(租车)
2019/08/07 Javascript
p5.js绘制创意自画像
2019/11/04 Javascript
python制作一个桌面便签软件
2015/08/09 Python
python脚本当作Linux中的服务启动实现方法
2019/06/28 Python
python绘制直方图和密度图的实例
2019/07/08 Python
django 微信网页授权登陆的实现
2019/07/30 Python
Python浮点数四舍五入问题的分析与解决方法
2019/11/19 Python
Pytorch 多维数组运算过程的索引处理方式
2019/12/27 Python
jupyter notebook tensorflow打印device信息实例
2020/04/20 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
2020/04/23 Python
Python configparser模块操作代码实例
2020/06/08 Python
使用CSS禁止textarea调整大小功能的方法
2015/03/13 HTML / CSS
ZWILLING双立人英国网上商店:德国刀具锅具厨具品牌
2018/05/15 全球购物
读书演讲主持词
2014/03/18 职场文书
优秀广告词大全
2014/03/19 职场文书
2015秋季开学典礼主持词
2015/07/16 职场文书
《夹竹桃》教学反思
2016/02/23 职场文书
jquery插件实现搜索历史
2021/04/24 jQuery
MySQL中你可能忽略的COLLATION实例详解
2021/05/12 MySQL