JavaScript如何实现图片懒加载(lazyload) 提高用户体验(增强版)


Posted in Javascript onNovember 30, 2016

目录:

  • 懒加载的意义(为什么要使用懒加载)
  • 原理
  • 代码

在上篇文章给大家介绍了JavaScript实现图片懒加载(Lazyload),大家可以参考下。

懒加载的意义(为什么要使用懒加载)

对页面加载速度影响最大的就是图片,一张普通的图片可以达到几M的大小,而代码也许就只有几十KB。当页面图片很多时,页面的加载速度缓慢,几S钟内页面没有加载完成,也许会失去很多的用户。

所以,对于图片过多的页面,为了加速页面加载速度,所以很多时候我们需要将页面内未出现在可视区域内的图片先不做加载, 等到滚动到可视区域后再去加载。这样子对于页面加载性能上会有很大的提升,也提高了用户体验。

原理

将页面中的img标签src指向一张小图片或者src为空,然后定义data-src(这个属性可以自定义命名,我才用data-src)属性指向真实的图片。src指向一张默认的图片,否则当src为空时也会向服务器发送一次请求。可以指向loading的地址。

注:图片要指定宽高

<img src="default.jpg" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" />

当载入页面时,先把可视区域内的img标签的data-src属性值负给src,然后监听滚动事件,把用户即将看到的图片加载。这样便实现了懒加载。

代码

在写代码前,需要了解各种高度。先看这篇文章scrollTop,offsetTop,scrollLeft,offsetLeft

<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
img {
display: block;
margin-bottom: 50px;
width: 400px;
height: 400px;
}
</style>
</head>
<body>
<img src="default.jpg" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
<img src="default.jpg" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
<img src="default.jpg" data-src="http://ww1.sinaimg.cn/large/006y8mN6gw1fa7kaed2hpj30sg0l9q54.jpg" alt="">
<img src="default.jpg" data-src="http://ww1.sinaimg.cn/large/006y8mN6gw1fa7kaed2hpj30sg0l9q54.jpg" alt="">
<img src="default.jpg" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
<img src="default.jpg" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
<img src="default.jpg" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
<img src="default.jpg" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
<img src="default.jpg" data-src="http://ww1.sinaimg.cn/large/006y8mN6gw1fa7kaed2hpj30sg0l9q54.jpg" alt="">
<img src="default.jpg" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
<img src="default.jpg" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
</body>

JavaScript

<script>
var num = document.getElementsByTagName('img').length;
var img = document.getElementsByTagName("img");
var n = 0; //存储图片加载到的位置,避免每次都从第一张图片开始遍历
lazyload(); //页面载入完毕加载可是区域内的图片
window.onscroll = lazyload;
function lazyload() { //监听页面滚动事件
var seeHeight = document.documentElement.clientHeight; //可见区域高度
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; //滚动条距离顶部高度
for (var i = n; i < num; i++) {
if (img[i].offsetTop < seeHeight + scrollTop) {
if (img[i].getAttribute("src") == "default.jpg") {
img[i].src = img[i].getAttribute("data-src");
}
n = i + 1;
}
}
}
</script>

jQuery

<script>
var n = 0,
imgNum = $("img").length,
img = $('img');
lazyload();
$(window).scroll(lazyload);
function lazyload(event) {
for (var i = n; i < imgNum; i++) {
if (img.eq(i).offset().top < parseInt($(window).height()) + parseInt($(window).scrollTop())) {
if (img.eq(i).attr("src") == "default.jpg") {
var src = img.eq(i).attr("data-src");
img.eq(i).attr("src", src);
n = i + 1;
}
}
}
}
</script>

使用节流函数进行性能优化

如果直接将函数绑定在scroll事件上,当页面滚动时,函数会被高频触发,这非常影响浏览器的性能。

我想实现限制触发频率,来优化性能。

节流函数:只允许一个函数在N秒内执行一次。下面是一个简单的节流函数:

// 简单的节流函数
//fun 要执行的函数
//delay 延迟
//time 在time时间内必须执行一次
function throttle(fun, delay, time) {
var timeout,
startTime = new Date();
return function() {
var context = this,
args = arguments,
curTime = new Date();
clearTimeout(timeout);
// 如果达到了规定的触发时间间隔,触发 handler
if (curTime - startTime >= time) {
fun.apply(context, args);
startTime = curTime;
// 没达到触发间隔,重新设定定时器
} else {
timeout = setTimeout(fun, delay);
}
};
};
// 实际想绑定在 scroll 事件上的 handler
function lazyload(event) {}
// 采用了节流函数
window.addEventListener('scroll',throttle(lazyload,500,1000));

以上所述是小编给大家介绍的JavaScript如何实现图片懒加载(lazyload) 提高用户体验(增强版),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
javascript一些不错的函数脚本代码
Sep 10 Javascript
基于jquery 的一个progressbar widge
Oct 29 Javascript
jquery监控数据是否变化(修正版)
Apr 12 Javascript
javascript if条件判断方法小结
May 17 Javascript
浅谈javascript中自定义模版
Jan 29 Javascript
jQuery使用hide方法隐藏指定元素class样式用法实例
Mar 30 Javascript
JQUERY简单按钮轮换选中效果实现方法
May 07 Javascript
vue mixins组件复用的几种方式(小结)
Sep 06 Javascript
React中常见的动画实现的几种方式
Jan 10 Javascript
Vue基本使用之对象提供的属性功能
Apr 30 Javascript
JS计算斐波拉切代码实例
Sep 12 Javascript
继承行为在 ES5 与 ES6 中的区别详解
Dec 24 Javascript
微信小程序 欢迎界面开发的实例详解
Nov 30 #Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
Nov 30 #Javascript
微信小程序之小豆瓣图书实例
Nov 30 #Javascript
微信小程序之ES6与事项助手的功能实现
Nov 30 #Javascript
关于Vue.js 2.0的Vuex 2.0 你需要更新的知识库
Nov 30 #Javascript
Vuex2.0+Vue2.0构建备忘录应用实践
Nov 30 #Javascript
BootStrap实现响应式布局导航栏折叠隐藏效果(在小屏幕、手机屏幕浏览时自动折叠隐藏)
Nov 30 #Javascript
You might like
PHP防CC攻击实现代码
2011/12/29 PHP
PHP实现变色验证码实例
2014/01/06 PHP
php操作csv文件代码实例汇总
2014/09/22 PHP
PHP遍历数组的方法汇总
2015/04/30 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
php实现微信企业转账功能
2018/10/02 PHP
JQuery Tips(2) 关于$()包装集你不知道的
2009/12/14 Javascript
使用jquery mobile做幻灯播放效果实现步骤
2013/01/04 Javascript
深入剖析JavaScript中的枚举功能
2014/03/06 Javascript
抛弃Nginx使用nodejs做反向代理服务器
2014/07/17 NodeJs
DOM中事件处理概览与原理的全面解析
2016/08/16 Javascript
jQuery基于ajax操作json数据简单示例
2017/01/05 Javascript
JavaScript该如何学习 怎样轻松学习JavaScript
2017/06/12 Javascript
react-native ListView下拉刷新上拉加载实现代码
2017/08/03 Javascript
微信小程序picker组件下拉框选择input输入框的实例
2017/09/20 Javascript
[02:42]DOTA2英雄基础教程 杰奇洛
2013/12/23 DOTA
[02:36]DOTA2上海特锦赛 回忆电竞生涯的重要瞬间
2016/03/25 DOTA
Python正则获取、过滤或者替换HTML标签的方法
2016/01/28 Python
Python高级特性 切片 迭代解析
2019/08/23 Python
python用opencv完成图像分割并进行目标物的提取
2020/05/25 Python
python的setattr函数实例用法
2020/12/16 Python
Linux不知道文件后缀名怎么判断文件类型
2012/04/26 面试题
生产车间班组长岗位职责
2014/01/06 职场文书
实习单位接收函
2014/01/11 职场文书
工作失误检讨书范文大全
2014/01/13 职场文书
教师试用期自我鉴定
2014/02/12 职场文书
股份合作协议书范本
2014/04/14 职场文书
争做文明公民倡议书
2014/08/29 职场文书
学习实践科学发展观心得体会
2014/09/10 职场文书
公司离职证明范本(汇总)
2014/09/10 职场文书
党的群众路线教育实践活动查摆问题自查报告
2014/10/10 职场文书
2014年语文教研组工作总结
2014/12/06 职场文书
宾馆卫生管理制度
2015/08/06 职场文书
python使用glob检索文件的操作
2021/05/20 Python
用Python可视化新冠疫情数据
2022/01/18 Python
Mybatis-plus配置分页插件返回统一结果集
2022/06/21 Java/Android