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字符串拼接的效率问题
Dec 25 Javascript
jquery 卷帘效果实现代码(不同方向)
Feb 05 Javascript
JavaScript中getUTCMinutes()方法的使用详解
Jun 10 Javascript
D3.js中data(), enter() 和 exit()的问题详解
Aug 17 Javascript
IE7浏览器窗口大小改变事件执行多次bug及IE6/IE7/IE8下resize问题
Aug 21 Javascript
JS实现图片剪裁并预览效果
Aug 12 Javascript
完美的js div拖拽实例代码
Sep 24 Javascript
JS获取年月日时分秒的方法分析
Nov 28 Javascript
总结js函数相关知识点
Feb 27 Javascript
javascript中关于类型判断的一些疑惑小结
Oct 14 Javascript
vue实现pdf文档在线预览功能
Nov 26 Javascript
js实现图片实时时钟
Jan 15 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数组转换js数组操作及json_encode的用法详解
2013/10/26 PHP
php实现RSA加密类实例
2015/03/26 PHP
php获取今日开始时间和结束时间的方法
2017/02/27 PHP
Thinkphp5.0框架视图view的循环标签用法示例
2019/10/12 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
用js解决数字不能换行问题
2010/08/10 Javascript
改写一个简单的菜单 弹性大小
2010/12/02 Javascript
javascript获取隐藏元素(display:none)的高度和宽度的方法
2014/06/06 Javascript
举例讲解Node.js中的Writable对象
2015/07/29 Javascript
JavaScript原型及原型链终极详解
2016/01/04 Javascript
javascript获取select标签选中的值
2016/06/04 Javascript
Vue.js绑定HTML class数组语法错误的原因分析
2016/10/19 Javascript
Bootstrap3 多选和单选框(checkbox)
2016/12/29 Javascript
Vue组件tree实现树形菜单
2017/04/13 Javascript
JavaScript实现图片无缝滚动效果
2017/07/07 Javascript
使用JavaScript开发跨平台的桌面应用详解
2017/07/27 Javascript
react使用CSS实现react动画功能示例
2020/05/18 Javascript
OpenLayer学习之自定义测量控件
2020/09/28 Javascript
Linux 发邮件磁盘空间监控(python)
2016/04/23 Python
python+selenium识别验证码并登录的示例代码
2017/12/21 Python
python实现简单登陆流程的方法
2018/04/22 Python
pytorch cnn 识别手写的字实现自建图片数据
2018/05/20 Python
详解用python写网络爬虫-爬取新浪微博评论
2019/05/10 Python
Python应用领域和就业形势分析总结
2019/05/14 Python
解决python执行不输出系统命令弹框的问题
2019/06/24 Python
django 快速启动数据库客户端程序的方法示例
2019/08/16 Python
python程序 创建多线程过程详解
2019/09/23 Python
python3 求约数的实例
2019/12/05 Python
python脚本监控logstash进程并邮件告警实例
2020/04/28 Python
营业经理岗位职责
2013/11/10 职场文书
外贸业务员工作职责
2014/01/06 职场文书
学习优秀党务工作者先进事迹材料思想报告
2014/09/17 职场文书
美国旅游签证工作证明
2014/10/14 职场文书
通知的写法
2015/04/23 职场文书
Spring Cloud Gateway去掉url前缀
2021/07/15 Java/Android
JavaScript架构搭建前端监控如何采集异常数据
2022/06/25 Javascript