原生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 相关文章推荐
在JavaScript中使用timer示例
May 08 Javascript
js数组与字符串的相互转换方法
Jul 09 Javascript
javascript判断css3动画结束 css3动画结束的回调函数
Mar 10 Javascript
兼容各大浏览器的JavaScript阻止事件冒泡代码
Jul 09 Javascript
JS提示:Uncaught SyntaxError:Unexpected token ) 错误的解决方法
Aug 19 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
Nov 25 Javascript
vue脚手架vue-cli的学习使用教程
Jun 06 Javascript
js+html5实现复制文字按钮
Jul 15 Javascript
Vue调试神器vue-devtools安装方法
Dec 12 Javascript
JavaScript 正则命名分组【推荐】
Jun 07 Javascript
详解vue开发中调用微信jssdk的问题
Apr 16 Javascript
vue实现移动端项目多行文本溢出省略
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
咖啡产品发展的三大浪潮
2021/03/04 咖啡文化
php+mysql 实现身份验证代码
2010/03/24 PHP
PHP中静态变量的使用方法实例分析
2016/12/01 PHP
让textarea控件的滚动条怎是位与最下方
2007/04/20 Javascript
Jquery实现网页跳转或用命令打开指定网页的解决方法
2013/07/09 Javascript
jquery预览图片实现鼠标放上去显示实际大小
2014/01/16 Javascript
JS中Location使用详解
2015/05/12 Javascript
轻量级网页遮罩层jQuery插件用法实例
2015/07/31 Javascript
APP中javascript+css3实现下拉刷新效果
2016/01/27 Javascript
标准的js无缝滚动效果
2016/08/30 Javascript
Bootstrap框架结合jQuery仿百度换肤功能实例解析
2016/09/17 Javascript
jquery请求servlet实现ajax异步请求的示例
2017/06/03 jQuery
JavaScript原生实现观察者模式的示例
2017/12/15 Javascript
angularjs实现table增加tr的方法
2018/02/27 Javascript
vue解决弹出蒙层滑动穿透问题的方法
2018/09/22 Javascript
Seajs源码详解分析
2019/04/02 Javascript
Node 搭建一个静态资源服务器的实现
2019/05/20 Javascript
详解基于Vue/React项目的移动端适配方案
2019/08/23 Javascript
NUXT SSR初级入门笔记(小结)
2019/12/16 Javascript
[33:23]Secret vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python接收Gmail新邮件并发送到gtalk的方法
2015/03/10 Python
pycharm+django创建一个搜索网页实例代码
2018/01/24 Python
Python语法分析之字符串格式化
2019/06/13 Python
python SQLAlchemy 中的Engine详解
2019/07/04 Python
python提取log文件内容并画出图表
2019/07/08 Python
Pytorch中index_select() 函数的实现理解
2019/11/19 Python
Python各种扩展名区别点整理
2020/02/27 Python
详解Python直接赋值,深拷贝和浅拷贝
2020/07/09 Python
python基于selenium爬取斗鱼弹幕
2021/02/20 Python
html5 datalist标签使用示例(自动完成组件)
2014/05/04 HTML / CSS
处理textarea中的换行和空格
2019/12/12 HTML / CSS
如何开发一个JQuery插件
2016/07/28 面试题
教师开学感言
2014/02/14 职场文书
优秀毕业自我鉴定
2014/02/15 职场文书
2014年最新版离婚协议书范本
2014/11/25 职场文书
办公室主任个人总结
2015/02/28 职场文书