原生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中:last选择器用法实例
Dec 30 Javascript
jquery通过扩展select控件实现支持enter或focus选择的方法
Nov 19 Javascript
JavaScript判断图片是否已经加载完毕的方法汇总
Feb 05 Javascript
jQuery ajax MD5实现用户注册即时验证功能
Oct 11 Javascript
node.js基础知识小结
Feb 26 Javascript
angularjs实现table增加tr的方法
Feb 27 Javascript
如何使用puppet替换文件中的string
Dec 06 Javascript
vue单文件组件lint error自动fix与styleLint报错自动fix详解
Jan 08 Javascript
小程序实现层叠卡片滑动效果
Aug 26 Javascript
layer实现弹出层自动调节位置
Sep 05 Javascript
ZK中使用JS读取客户端txt文件内容问题
Nov 07 Javascript
如何手写一个简易的 Vuex
Oct 10 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
收音机玩机评测 406 篇视频合集
2020/03/11 无线电
php常用Stream函数集介绍
2013/06/24 PHP
ThinkPHP中create()方法自动验证表单信息
2017/04/28 PHP
laravel通用化的CURD的实现
2019/12/13 PHP
js当一个变量为函数时 应该注意的一点细节小结
2011/12/29 Javascript
jQuery ajax(复习)—Baidu ajax request分离版
2013/01/24 Javascript
使用jQuery避免鼠标双击的解决方案
2013/08/21 Javascript
解决jquery1.9不支持browser对象的问题
2013/11/13 Javascript
网页实时显示服务器时间和javscript自运行时钟
2014/06/09 Javascript
jQuery中:input选择器用法实例
2015/01/03 Javascript
Validform+layer实现漂亮的表单验证特效
2016/01/17 Javascript
jQuery实现背景弹性滚动的导航效果
2016/06/01 Javascript
AngularJS 过滤器(自带和自建)详解
2016/09/19 Javascript
老生常谈javascript的类型转换
2016/10/12 Javascript
JS库之wow.js使用方法
2017/09/14 Javascript
vue编译打包本地查看index文件的方法
2018/02/23 Javascript
jQuery实现获取选中复选框的值实例详解
2018/06/28 jQuery
vue中使用echarts制作圆环图的实例代码
2018/07/27 Javascript
nodejs 递归拷贝、读取目录下所有文件和目录
2019/07/18 NodeJs
微信小程序HTTP请求从0到1封装
2019/09/09 Javascript
5分钟教你用nodeJS手写一个mock数据服务器的方法
2019/09/10 NodeJs
解决Can't find variable: SockJS vue项目的问题
2020/09/22 Javascript
在vs code 中如何创建一个自己的 Vue 模板代码
2020/11/10 Javascript
[02:36]DOTA2英雄基础教程 一击致命幻影刺客
2013/12/06 DOTA
[37:21]完美世界DOTA2联赛PWL S2 Inki vs Magma 第二场 11.22
2020/11/24 DOTA
分析python请求数据
2018/08/19 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
2020/01/14 Python
Django 实现对已存在的model进行更改
2020/03/28 Python
Flask中sqlalchemy模块的实例用法
2020/08/02 Python
安装不同版本的tensorflow与models方法实现
2021/02/20 Python
美国开幕式潮店:Opening Ceremony
2018/02/10 全球购物
运动会入场词50字
2014/02/20 职场文书
办理信用卡收入证明范例
2014/09/13 职场文书
2015年社区环境卫生工作总结
2015/04/21 职场文书
关于考试抄袭的检讨书
2019/11/02 职场文书
python字符串拼接.join()和拆分.split()详解
2021/11/23 Python