原生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 更新 JavaScript 数组的 uniq 方法
Jan 23 Javascript
jquery 操作单选框,复选框,下拉列表实现代码
Oct 27 Javascript
Knockoutjs快速入门(经典)
Dec 24 Javascript
javascript 控制input只允许输入的各种指定内容
Jun 19 Javascript
学习javascript面向对象 掌握创建对象的9种方式
Jan 04 Javascript
深入学习jQuery Validate表单验证(二)
Jan 18 Javascript
Jquery Easyui选项卡组件Tab使用详解(10)
Dec 18 Javascript
不得不看之JavaScript构造函数及new运算符
Aug 21 Javascript
vue解决跨域路由冲突问题思路解析
Nov 03 Javascript
mpvue小程序仿qq左滑置顶删除组件
Aug 03 Javascript
es6 symbol的实现方法示例
Apr 02 Javascript
分享JS表单验证源码(带错误提示及密码等级)
Jan 05 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 header示例代码(推荐)
2010/09/08 PHP
解析php中的fopen()函数用打开文件模式说明
2013/06/20 PHP
js 页面刷新location.reload和location.replace的区别小结
2009/12/24 Javascript
基于jquery实现图片广告轮换效果代码
2011/07/07 Javascript
DOM基础教程之使用DOM
2015/01/19 Javascript
讲解JavaScript的Backbone.js框架的MVC结构设计理念
2016/02/14 Javascript
JavaScript实现图片自动加载的瀑布流效果
2016/04/11 Javascript
基于JavaScript Array数组方法(新手必看篇)
2016/08/20 Javascript
用AngularJS来实现监察表单按钮的禁用效果
2016/11/02 Javascript
jQuery EasyUI 获取tabs的实例解析
2016/12/06 Javascript
Jquery获取radio选中的值
2017/05/05 jQuery
ES6新特性:使用export和import实现模块化详解
2017/07/31 Javascript
jQuery实现文件编码成base64并通过AJAX上传的方法
2018/04/12 jQuery
jQuery实现图片简单轮播功能示例
2018/08/13 jQuery
详解微信小程序胶囊按钮返回|首页自定义导航栏功能
2019/06/14 Javascript
layer.alert回调函数执行关闭弹窗的实例
2019/09/11 Javascript
JS如何在数组指定位置插入元素
2020/03/10 Javascript
详解vue 组件的实现原理
2020/11/12 Javascript
简析Python的闭包和装饰器
2016/02/26 Python
Python 探针的实现原理
2016/04/23 Python
Pycharm学习教程(4) Python解释器的相关配置
2017/05/03 Python
Python温度转换实例分析
2018/01/17 Python
python将文本中的空格替换为换行的方法
2018/03/19 Python
对python sklearn one-hot编码详解
2018/07/10 Python
Pandas分组与排序的实现
2019/07/23 Python
numpy.transpose()实现数组的转置例子
2019/12/02 Python
详解向scrapy中的spider传递参数的几种方法(2种)
2020/09/28 Python
python生成word合同的实例方法
2021/01/12 Python
使用Canvas操作像素的方法
2018/06/14 HTML / CSS
HTML5 textarea高度自适应的两种方案
2020/04/08 HTML / CSS
劳资协议书范本
2014/04/23 职场文书
小组名称和口号
2014/06/09 职场文书
心理咨询专业自荐信
2014/07/07 职场文书
党员学习中国梦心得体会
2016/01/05 职场文书
提高系统的吞吐量解决数据库重复写入问题
2022/04/23 MySQL
Python使用plt.boxplot()函数绘制箱图、常用方法以及含义详解
2022/08/14 Python