dw自动滚动图片_3分钟搞定图片懒加载

563ae806e6f79081ad3a0e828f4a2ab5.png

什么是图片懒加载

图片的懒加载就是在页面打开的时候,不要一次性全部显示页面所有的图片,而是只显示当前视口内的图片,一般在移动端使用(PC端主要是前端分页或者后端分页)。

为什么需要懒加载

对于一个页面加载速度影响最大的因素之一就是图片资源,如果一个页面图片太多(比如某宝,某东等),整个页面的图片大小可以到达几百兆,即使在百兆宽带,全部下载的话,也需要上十秒的时间,这对于用户耐心的考验是巨大的,更别说网络差的地方了。

因此,懒加载是必须要做的,对于页面未在可视区域内显示的图片先不做加载处理,只加载第一映入眼帘的图片,由于可视区域显示的图片少,加载速度就会大大提升,用户体验也会更好。

而且,用户可能只翻看一两页就退出了,剩下未查看的图片也就不需要加载了。这也相当于节省了带宽资源。

懒加载实现原理

由于浏览器会自动对页面中的img标签的src属性发送请求并下载图片。因此,通过html5自定义属性data-xxx先暂存src的值,然后在需要显示的时候,再将data-xxx的值重新赋值到img的src属性即可。

实现代码

这里模拟两种情况:

情况一

1、前端已经获取到所有的图片了,现在需要将这些图片以懒加载的形式展示。

例子如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>懒加载Demo1</title><style>.box {width: 600px;margin: 0 auto;}img {width: 100%;}</style>
</head>
<body><div class="box"><img src="./images/1.jpg" alt=""><img src="./images/2.jpg" alt=""><img src="./images/3.jpg" alt=""><img src="./images/4.jpg" alt=""><img src="./images/5.jpg" alt=""><img src="./images/6.jpg" alt=""><img src="./images/7.jpg" alt=""><img src="./images/8.jpg" alt=""><img src="./images/9.jpg" alt=""><img src="./images/10.jpg" alt=""></div>
</body>
</html>

a92b88c40ac4505cb88ab31275e7117c.png

可以看出,10张图片是一次性全部加载完的。

下面改造成懒加载:

首先将页面上的图片的 src 属性设为空字符串,而图片的真实路径则设置在src属性中。

当页面滚动的时候需要去监听scroll事件,在scroll事件的回调中,判断我们的懒加载的图片判断是否出现在视口内,如果出现在视口内,则将src赋值到src。

如何判断一个元素是否在视口内呢?

通过getBoundingClientRect()方法来获取元素的大小以及位置。这个方法返回一个名为ClientRect的DOMRect对象,包含了top、right、botton、left、width、height这些值。

c38c2576b04c9c9d2c5da35a2406617d.png

随着滚动条的向下滚动,bound.top会越来越小,也就是图片到可视区域顶部的距离越来越小,当bound.top <= clientHeight时,图片的上沿应该是位于可视区域下沿的位置的临界点,再滚动一点点,图片就会进入可视区域。

function isInSight(el) {const bound = el.getBoundingClientRect();const clientHeight = window.innerHeight;//如果只考虑向下滚动加载//const clientWidth = window.innerWeight;return bound.top <= clientHeight + 100; // 这里有个+100是为了提前加载。
}

源代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>懒加载Demo1</title><style>.box {width: 600px;margin: 0 auto;}img {width: 100%;height: 600px;}</style>
</head>
<body><div class="box"><img src="" alt="" src="./images/1.jpg"><img src="" alt="" src="./images/2.jpg"><img src="" alt="" src="./images/3.jpg"><img src="" alt="" src="./images/4.jpg"><img src="" alt="" src="./images/5.jpg"><img src="" alt="" src="./images/6.jpg"><img src="" alt="" src="./images/7.jpg"><img src="" alt="" src="./images/8.jpg"><img src="" alt="" src="./images/9.jpg"><img src="" alt="" src="./images/10.jpg"></div>
</body>
<script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
<script>$(function () {// 第一次需要先加载一次lazyLoad();$(window).scroll(lazyLoad);function isInSight(el) {const bound = el.getBoundingClientRect();const clientHeight = $(window).height(); // 可视区高度return bound.top <= clientHeight + 100; // 这里有个+100是为了提前加载。}function lazyLoad() {$.each($('.box img'), (index,item)=>{if(isInSight(item)) {$(item).attr('src', $(item).attr('src'));}});}});
</script>
</html>

0474e061bd060444e2e4ff589a41ba69.png

当向下滑动的时候,从Network面板可以看到,剩下的图片是一个个加载的。

可能有人疑问为什么第一次加载了4张,而不是3张?

因为我在判断是否在可视区内加了100 ,return bound.top <= clientHeight + 100; 可以提前加载一张图片。

注意:一定要设置图片的高度。
提示:src的赋值在js原生和jq是不同的,混用的话不会生效。
用js原生方法:document.getElementById("imageId").src = "xxxx.jpg"; 用Jquery方法:$("#imageId").attr("src","xxxx.jpg");
而下面的两种都不会生效: $("#imageId").src = "xxxx.jpg"; document.getElementById("imageId").attr("src","xxxx.jpg");
切记!

情况二

2、前端从后端获取图片进行展示,后端进行分页。

思路:当页面滚动的时候需要去监听scroll事件,在scroll事件的回调中,判断滚动条是否滚动到最底部,如果是,则将将图片的 src 属性设置为src的值。

判断是否滚动到最底部的方法:滚动条到顶部距离 + 可视页面高度 >= 当前页面高度

var seeHeight = document.documentElement.clientHeight; // 可视页面高度 
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; // 滚动条到顶部距离
var bodyHeight = document.body.offsetHeight // 当前页面高度然后判断: scrollTop  + seeHeight  >= bodyHeight

当滚动条到达底部的时候,获取后端分页的数据。

这里使用一个模拟接口来获取数据: https://www.apiopen.top/meituApi?page=1

page为页码数,一次返回20条数据。当page=0时,会随机返回一页数据,page>=1时会返回相应页码的数据。

源代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>懒加载Demo1</title><style>.box {width: 600px;margin: 0 auto;}img {width: 100%;height: 600px;}</style>
</head>
<body><div class="box"></div>
</body>
<script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
<script>$(function () {let pageNum = 2; // 因为第一页没有图片,我从第二页开始的getImage(pageNum);$(window).scroll(lazyLoad);function getImage(pageNum) {$.ajax({url:'https://www.apiopen.top/meituApi?page='+pageNum,type: 'GET',success(res) {// 遍历图片,将图片加入div中if(res.code === 200 && res.data) {res.data.forEach((item,index)=>{$('.box').append(`<img src="${item.url}">`);});}},});}function lazyLoad() {let seeHeight = document.documentElement.clientHeight;let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;let bodyHeight = document.body.offsetHeight;if((Math.ceil(seeHeight + scrollTop) >= bodyHeight)) {  // 向上取整的原因是可能有小数getImage(++pageNum);}}});
</script>
</html>

ed41f213bbfdadc4078e028c68705d11.png

当滚动到20张图的底部的时候,就会发出ajax请求,请求下一页数据。

25b09c062acf16c23b274b412e836db2.png

至此本文完,有疑问可以在评论区随时交流哈。

(啾咪 ^.<)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

获利40多万,工地技术员自学开发外挂被抓

全世界只有3.14 % 的人关注了数据与算法之美今年年初&#xff0c;江苏省公安厅召开新闻发布会&#xff0c;通报全省公安机关开展“净网”专项行动战果。随后平安江苏 在微博中公布了多个案件&#xff0c;其中有个涉及利用技术定位侵犯公民个人信息的案件。【案发】欠债老板在吃…

使用C#在VS Code中编写Notebook

提到大名鼎鼎的Jupyter Notebook&#xff0c;大家应该都听说过。它是基于网页的用于交互计算的应用程序。其可被应用于全过程计算&#xff1a;开发、文档编写、运行代码和展示结果。但是Jupyter Notebook需要使用Python编写代码&#xff0c;对.Neter不太友好。不过&#xff0c;…

显卡mx150和230哪个好_建模渲染用专业图形显卡和游戏显卡哪个更好?

最近很多朋友让小杨写配置单顺带装机&#xff0c;70%的用户是游戏需求&#xff0c;20%的是设计需求&#xff0c;为数不多的是办公需求&#xff0c;那么问题来了&#xff0c;建模渲染用专业图形显卡和游戏显卡哪个更好&#xff1f;下面小杨给大家深度剖析一番。(建模渲染)今天小…

计算机录取高考生过程,解密高考录取过程:人机结合 打造“阳光高招”

考生的档案怎么被投到志愿高校?每个院校的录取分数线怎么划定?哪些学生容易被退档?15日下午&#xff0c;记者随部分省人大代表探访设在大学城的高招录取现场&#xff0c;为您详解高招录取关键环节。先来看下文史、理工类本一批次实行的按院校平行志愿的网上录取的大致流程&a…

每日一笑 | 如果把大脑看成CPU的话...

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图片来源于网络&#xff0c;侵权删&#xff09;

C# 三种方式实现Socket数据接收(经典)

Stream.Read 方法当在派生类中重写时&#xff0c;从当前流读取字节序列&#xff0c;并将此流中的位置提升读取的字节数。语法&#xff1a;public abstract int Read(byte[] buffer, int offset, int count)参数&#xff1a;buffer: 字节数组。此方法返回时&#xff0c;该缓冲区…

服务器运维监控指标,运维体系~指标监控~Prometheus监控告警与日志

一 Prometheus 入门1.1 入门介绍运维体系~指标监控先来一张图&#xff0c;说明一下Prometheus监控相关的软件和知识点。1: 首先要安装&#xff1a;Prometheus, 负责收集各种监控指标&#xff0c;也包括自己定监控2: 接着安装Grafana全面瓦解,负责展示监控指标3&#xff1a;接着…

限时秒杀┃月销10000+件,风靡全国的steam科学实验套装

▲数据汪特别推荐点击上图进入玩酷屋之前小木有推荐过“彩虹实验”&#xff0c;这款是可以让孩子在探索中能够独立思考&#xff0c;主动地构建知识库&#xff0c;培养创造力。&#xff08;传送门&#xff09;让孩子们在家开展科学游戏&#xff0c;既能提升动手能力&#xff0c;…

面向.NET开发人员的Dapr——入门

目录&#xff1a;面向.NET开发人员的Dapr——前言面向.NET开发人员的Dapr——分布式世界面向.NET开发人员的Dapr——俯瞰DaprGet started with DaprDapr 入门In the first two chapters, you learned basic concepts about Dapr. Its time to take it for a test drive. This c…

比乐高还要好玩,50种奇妙装置玩法,将STEM教育一网打尽

▲数据汪特别推荐点击上图进入玩酷屋致砖《小小机器人》套装全新首发电动机械的完美结合先来看看视频过过眼瘾吧来自美国STEAM教育让孩子跨学科学知识积木向来是STEAM教育很重要的一部分&#xff0c;因为它涉及到了多种学科&#xff1a;要搭建得稳固——这是工程学&#xff1b;…

capslock键英语怎么读_刚开始读英文原版书该怎么做?商务英语专业有前途吗?...

是的&#xff0c;看我的朋友圈也能学英文#26从最近的朋友圈和微博中选了一些内容&#xff0c;分享给大家。1. 如何开始读英文原版书&#xff1f;关于读英文原版书&#xff0c;我给出一个简单粗暴的开始和进阶方案。启动方案&#xff1a;首先找一本你特别感兴趣的书&#xff0c;…

【12图】你管这破玩意叫Pulsar

这两年pulsar发展比较快&#xff0c;有好多大公司引入了pulsar&#xff0c;相关的资料和课程也多了&#xff0c;今天一起来了解一下pulsar这款中间件。下图是几款消息中间件的历史&#xff1a;2012年pulsar在Yahoo内部开发&#xff0c;2016年开源并捐献给Apache&#xff0c;201…

每日一笑 | 为什么英语老师让我们养成背单词的习惯?

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图片来源于网络&#xff0c;侵权删&#xff09;

把C#.NET程序移植到DB2上的经验浅谈(C#连接DB2可以用IBM.Data.DB2.dll)

感谢博客园不再封杀&#xff0c;差点儿搬家的念头都产生了&#xff0c;博客园还是有大胸怀&#xff0c;继续留在博客园写口水文应该没错&#xff0c;娱乐自己、娱乐大家&#xff0c;给枯燥的编程生活增加一点儿笑料&#xff0c;也给大家充当个开心果&#xff0c;让大家高兴一下…

postgis数据库优化_国内首个 Serverless 数据库来了,技术架构全揭秘!

头图 | CSDN 下载自东方 IC本文为企业投稿省却成本&#xff0c;缩短产品上市时间&#xff0c;减少运维与开发团队之间的摩擦是 Serverless 最核心的所在&#xff0c;从 AWS 发布「Lambda」让「Serverless」越来越多地为开发者所知到今天&#xff0c;已经过去了 6 年的时光&…

丰富自己, 比取悦他人更有力量

如果有那么一天&#xff0c;你不再记得&#xff0c;我也不再记得&#xff0c;时光一定会代替我们记得。丰富自己&#xff0c; 比取悦他人更有力量&#xff01;下面给大家推荐几个优秀公众号它们每天更新有态度、有干货的原创文字坚持看一段时间 颜值和人生都不一样了【关注方式…

WPF Grid动态显示或隐藏一列的一种方法

项目中有一个需求&#xff0c;需要根据用户的设置动态显示一列&#xff0c;研究了一波后&#xff0c;发现&#xff0c;Grid并没有这个功能&#xff0c;于是通过绑定宽度 的方法&#xff0c;实现的需求。。思路&#xff1a;将需要隐藏的列宽度 绑定到一个属性上&#xff0c;隐藏…

.Net Core with 微服务 - Seq 日志聚合

上一次我们介绍并演示了如果使用 Consul 做为我们微服务的注册中心&#xff0c;来实现服务的注册与发现。那么本次我们讲会演示如何做日志聚合。日志聚合比较常用的有 ELK 等&#xff0c;但是这次我想要介绍的是一款比较小众的日志聚合工具 - Seq 。日志聚合日志是我们写程序离…

苹果白屏一直显示苹果_最新消息显示:苹果还要发新品

距离2020年结束已经进入了倒计时阶段&#xff0c;但最新消息显示苹果可能还会在这个最后的时间节点上召开一场新品发布会。今日&#xff0c;有外媒援引一份苹果内部备忘录报道&#xff0c;称苹果通过内部备忘录向服务提供商发送通知&#xff0c;计划在美国太平洋标准时间 12月8…

“探月计划”来袭,美国米德天文望远镜助孩子观月赏月

▲数据汪特别推荐点击上图进入玩酷屋孩子对于未知的世界充满了好奇&#xff0c;尤其是对于月亮&#xff0c;总是有问不完的问题。例如月亮上是怎么样的&#xff1f;怎么很多人说十五的月亮十六圆&#xff1f;月亮有动物吗&#xff1f;不是说有月兔吗&#xff1f;月亮怎么有时是…