原生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 相关文章推荐
给artDialog 5.02 增加ajax get功能详细介绍
Nov 13 Javascript
对JavaScript中this指针的新理解分享
Jan 31 Javascript
整理Javascript基础入门学习笔记
Nov 29 Javascript
Vue.js一个文件对应一个组件实践
Oct 27 Javascript
原生js实现弹出层效果
Jan 20 Javascript
React Native日期时间选择组件的示例代码
Apr 27 Javascript
如何在js代码中消灭for循环实例详解
Jul 29 Javascript
JavaScript数组、json对象、eval()函数用法实例分析
Feb 21 Javascript
JS中的算法与数据结构之栈(Stack)实例详解
Aug 20 Javascript
解决layer.confirm快速点击会重复触发事件的问题
Sep 23 Javascript
在vue项目中 实现定义全局变量 全局函数操作
Oct 26 Javascript
vue2.0 watch里面的 deep和immediate用法说明
Oct 30 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入门学习知识点三 PHP上传
2011/07/14 PHP
php 模拟 asp.net webFrom 按钮提交事件的思路及代码
2013/12/02 PHP
关于php中一些字符串总结
2016/05/05 PHP
php版阿里云OSS图片上传类详解
2016/12/01 PHP
统计jQuery中各字符串出现次数的工具
2012/05/03 Javascript
6款经典实用的jQuery小插件及源码(对话框/提示工具等等)
2013/02/04 Javascript
iframe子页面获取父页面元素的方法
2013/11/05 Javascript
js点击按钮实现带遮罩层的弹出视频效果
2015/12/19 Javascript
JS制作适用于手机和电脑的通知信息效果
2016/10/28 Javascript
详解如何较好的使用js
2016/12/16 Javascript
使用 Vue 绑定单个或多个 Class 名的实例代码
2018/01/08 Javascript
Vue 页面状态保持页面间数据传输的一种方法(推荐)
2018/11/01 Javascript
jQuery实现每日秒杀商品倒计时功能
2019/09/06 jQuery
es6数组的flat(),flatMap()函数用法实例分析
2020/04/18 Javascript
Node.js API详解之 zlib模块用法分析
2020/05/19 Javascript
pycharm 使用心得(八)如何调用另一文件中的函数
2014/06/06 Python
python每隔N秒运行指定函数的方法
2015/03/16 Python
python链接Oracle数据库的方法
2015/06/28 Python
Python使用pickle模块储存对象操作示例
2018/08/15 Python
Python面向对象实现一个对象调用另一个对象操作示例
2019/04/08 Python
Python基础之字符串操作常用函数集合
2020/02/09 Python
在python中利用dict转json按输入顺序输出内容方式
2020/02/27 Python
python自动化测试三部曲之unittest框架的实现
2020/10/07 Python
学年自我鉴定范文
2013/10/01 职场文书
清洁工表扬信
2014/01/08 职场文书
30年同学聚会邀请函
2014/01/25 职场文书
幼儿园中秋节活动方案2013
2014/01/29 职场文书
外国人聘用意向书
2014/04/01 职场文书
2014副镇长民主生活会个人对照检查材料思想汇报
2014/09/30 职场文书
小学英语复习计划
2015/01/19 职场文书
销售经理工作检讨书
2015/02/19 职场文书
会计专业求职信范文
2015/03/19 职场文书
士兵突击观后感
2015/06/16 职场文书
python爬虫请求库httpx和parsel解析库的使用测评
2021/05/10 Python
Redis主从配置和底层实现原理解析(实战记录)
2021/06/30 Redis
python中数组和列表的简单实例
2022/03/25 Python