原生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模板技术
Apr 27 Javascript
js函数返回多个返回值的示例代码
Nov 05 Javascript
JS 屏蔽键盘不可用与鼠标右键不可用的方法
Nov 18 Javascript
jQuery的图片滑块焦点图插件整理推荐
Dec 07 Javascript
整理AngularJS中的一些常用指令
Jun 16 Javascript
jQuery 3.0 的变化及使用方法
Feb 01 Javascript
Node.js操作mysql数据库增删改查
Mar 30 Javascript
详解用vue编写弹出框组件
Jul 04 Javascript
javascript 缓冲运动框架的实现
Sep 29 Javascript
基于react后端渲染模板引擎noox发布使用
Jan 11 Javascript
微信小程序实现图片上传放大预览删除代码
Jun 28 Javascript
Webpack 4.x搭建react开发环境的方法步骤
Aug 15 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
php中处理模拟rewrite 效果
2006/12/09 PHP
PHP通过COM使用ADODB的简单例子
2006/12/31 PHP
Cannot modify header information错误解决方法
2008/10/08 PHP
PHP 验证码不显示只有一个小红叉的解决方法
2013/09/30 PHP
百度站点地图(百度sitemap)生成方法分享
2014/01/09 PHP
ThinkPHP之M方法实例详解
2014/06/20 PHP
thinkphp命名空间用法实例详解
2015/12/30 PHP
浅析Laravel5中队列的配置及使用
2016/08/04 PHP
如何打开php的gd2库
2017/02/09 PHP
thinkphp中U方法按路由规则生成url的方法
2018/03/12 PHP
图片自动缩小 点击放大
2008/07/07 Javascript
js实现内容显示并使用json传输数据
2016/03/16 Javascript
js模糊查询实例分享
2016/12/26 Javascript
JS实现的DIV块来回滚动效果示例
2017/02/07 Javascript
详解vue与后端数据交互(ajax):vue-resource
2017/03/16 Javascript
Angular限制input框输入金额(是小数的话只保留两位小数点)
2017/07/13 Javascript
vue.js项目打包上线的图文教程
2017/11/16 Javascript
jQuery进阶实践之利用最优雅的方式如何写ajax请求
2017/12/20 jQuery
vue.js实现只弹一次弹框
2018/01/29 Javascript
webstorm+vue初始化项目的方法
2018/10/18 Javascript
vue router的基本使用和配置教程
2018/11/05 Javascript
json数据格式常见操作示例
2019/06/13 Javascript
p5.js绘制旋转的正方形
2019/10/23 Javascript
vue实现简易图片左右旋转,上一张,下一张组件案例
2020/07/31 Javascript
[09:37]2018DOTA2国际邀请赛寻真——不懈追梦的Team Serenity
2018/08/13 DOTA
编写简单的Python程序来判断文本的语种
2015/04/07 Python
Python黑魔法Descriptor描述符的实例解析
2016/06/02 Python
Python之日期与时间处理模块(date和datetime)
2017/02/16 Python
python django 增删改查操作 数据库Mysql
2017/07/27 Python
Python urllib3软件包的使用说明
2020/11/18 Python
CSS 3.0 结合video视频实现的创意开幕效果
2020/06/01 HTML / CSS
大学新生军训方案
2014/05/03 职场文书
党员干部观看《周恩来四个昼夜》思想汇报
2014/09/10 职场文书
2015试用期转正工作总结
2014/12/12 职场文书
2016教师读书思廉心得体会
2016/01/23 职场文书
Go gorilla securecookie库的安装使用详解
2022/08/14 Golang