原生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 API来处理不同的浏览器事件
Dec 09 Javascript
JS教程:window.location使用方法的区别介绍
Oct 04 Javascript
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
Jan 02 Javascript
js轮盘抽奖实例分析
Apr 17 Javascript
详解Angular的双向数据绑定(MV-VM)
Dec 26 Javascript
js 单引号替换成双引号,双引号替换成单引号的实现方法
Feb 16 Javascript
JS验证input输入框(字母,数字,符号,中文)
Mar 23 Javascript
实例详解JavaScript中setTimeout函数的执行顺序
Jul 12 Javascript
Vue-Cli中自定义过滤器的实现代码
Aug 12 Javascript
vue实现微信获取用户信息的方法
Mar 21 Javascript
JavaScript实现左右滚动电影画布
Feb 06 Javascript
vue-amap根据地址回显地图并mark的操作
Nov 03 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
简单的过滤字符串中的HTML标记
2006/12/25 PHP
解析php中array_merge与array+array的区别
2013/06/21 PHP
php中Array2xml类实现数组转化成XML实例
2014/12/08 PHP
smarty模板引擎之内建函数用法
2015/03/30 PHP
js压缩工具 yuicompressor 使用教程
2010/03/31 Javascript
IE和Firefox的Javascript兼容性总结[推荐收藏]
2011/10/19 Javascript
javascript分页代码(当前页码居中)
2012/09/20 Javascript
图片动画横条广告带上下滚动的JS代码
2013/10/25 Javascript
一个JavaScript获取元素当前高度的实例
2014/10/29 Javascript
JavaScript 模块化编程(笔记)
2015/04/08 Javascript
JavaScript中for循环的使用详解
2015/06/03 Javascript
仅30行代码实现Javascript中的MVC
2016/02/15 Javascript
js指定步长实现单方向匀速运动
2017/07/17 Javascript
vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法
2018/01/25 Javascript
elementUI中Table表格问题的解决方法
2018/12/04 Javascript
微信小程序把百度地图坐标转换成腾讯地图坐标过程详解
2019/07/10 Javascript
[02:40]DOTA2超级联赛专访430 从小就爱玩对抗性游戏
2013/06/18 DOTA
[03:39]2015国际邀请赛主赛事首日精彩回顾
2015/08/05 DOTA
[01:56]生活中的妖精之七夕特别档
2016/08/09 DOTA
[01:50]《我与DAC》之玩家:iG夺冠时的那面红旗
2018/03/29 DOTA
Python迭代器和生成器介绍
2015/03/06 Python
numpy中实现二维数组按照某列、某行排序的方法
2018/04/04 Python
python实现音乐下载器
2018/04/15 Python
关于pytorch多GPU训练实例与性能对比分析
2019/08/19 Python
IntelliJ 中配置 Anaconda的过程图解
2020/06/01 Python
Python 使用 PyQt5 开发的关机小工具分享
2020/07/16 Python
四方通行旅游网:台湾订房、出国旅游
2017/09/20 全球购物
自荐书模板
2013/12/19 职场文书
小学运动会表扬稿
2014/01/19 职场文书
本科生职业生涯规划书范文
2014/01/21 职场文书
我心目中的好老师活动方案
2014/08/19 职场文书
2014年政协工作总结
2014/12/09 职场文书
2015年关爱留守儿童工作总结
2015/05/22 职场文书
宣传部部长竞选稿
2015/11/21 职场文书
golang switch语句的灵活写法介绍
2021/05/06 Golang
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/07 其他游戏