原生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调用flash的效果代码
Apr 26 Javascript
Enter转换为Tab的小例子(兼容IE,Firefox)
Nov 14 Javascript
jquery插件冲突(jquery.noconflict)解决方法分享
Mar 20 Javascript
基于JQuery打造无缝滚动新闻步骤详解
Mar 31 Javascript
jQuery文件上传控件 Uploadify 详解
Jun 20 Javascript
最简单的JS实现json转csv的方法
Jan 10 Javascript
微信小程序接入腾讯云验证码的方法步骤
Jan 07 Javascript
微信小程序实现限制用户转发功能的实例代码
Feb 22 Javascript
JavaScript正则表达式验证登录实例
Mar 18 Javascript
vue自定义标签和单页面多路由的实现代码
May 03 Javascript
JS实现联想、自动补齐国家或地区名称的功能
Jul 07 Javascript
原生js实现贪吃蛇游戏
Oct 26 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
十大催泪虐心动漫,你能坚持看到第几部?
2020/03/04 日漫
php中去除所有js,html,css代码
2010/10/12 PHP
关于php连接mssql:pdo odbc sql server
2011/07/20 PHP
PHP输出一个等腰三角形的方法
2015/05/12 PHP
JavaScript 学习笔记一些小技巧
2010/03/28 Javascript
js 限制input只能输入数字、字母和汉字等等
2013/12/18 Javascript
javascript常见用法总结
2014/05/22 Javascript
javascript简单实现图片预加载
2014/12/03 Javascript
分享28款免费实用的 JQuery 图片和内容滑块插件
2014/12/15 Javascript
去除字符串左右两边的空格(实现代码)
2016/05/12 Javascript
微信小程序 实战程序简易新闻的制作
2017/01/09 Javascript
基于Vue实例对象的数据选项
2017/08/09 Javascript
关于vue.extend和vue.component的区别浅析
2017/08/16 Javascript
完美解决手机浏览器顶部下拉出现网页源或刷新的问题
2017/11/30 Javascript
详解各版本React路由的跳转的方法
2018/05/10 Javascript
运用js实现图层拖拽的功能
2019/05/24 Javascript
微信公众号获取用户地理位置并列出附近的门店的示例代码
2019/07/25 Javascript
JavaScript实现留言板案例
2020/03/17 Javascript
js实现全选和全不选功能
2020/07/28 Javascript
VUE异步更新DOM - 用$nextTick解决DOM视图的问题
2020/11/06 Javascript
[02:28]PWL开团时刻DAY3——Ink Ice与DeMonsTer之间的勾心斗角
2020/11/03 DOTA
Python调用服务接口的实例
2019/01/03 Python
python将四元数变换为旋转矩阵的实例
2019/12/04 Python
解决Jupyter notebook更换主题工具栏被隐藏及添加目录生成插件问题
2020/04/20 Python
为什么是 Python -m
2020/06/19 Python
关于探究python中sys.argv时遇到的问题详解
2021/02/23 Python
中学生校园广播稿
2014/01/16 职场文书
学校大课间活动方案
2014/01/30 职场文书
高三政治教学反思
2014/02/06 职场文书
打造高效课堂实施方案
2014/03/22 职场文书
个人委托书格式
2014/04/04 职场文书
社区党员志愿服务活动方案
2014/08/18 职场文书
财务工作检讨书
2014/10/29 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
HTML中table表格拆分合并(colspan、rowspan)
2021/04/07 HTML / CSS
MySQL 重命名表的操作方法及注意事项
2021/05/21 MySQL