首发于 前端进阶笔记
3分钟搞定图片懒加载

3分钟搞定图片懒加载



大家好,我是前端队长Daotin,想要获取更多前端精彩内容,关注我,解锁前端成长新姿势。

公从号后台回复【懒加载】获取本文源代码压缩包。


以下正文:

什么是图片懒加载

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

为什么需要懒加载

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

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

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

懒加载实现原理

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

实现代码

这里模拟两种情况:

情况一

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

例子如下:



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

下面改造成懒加载:

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

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

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

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



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

源代码



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

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

因为我在判断是否在可视区内加了100 , returnbound.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 属性设置为 data-src的值。

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

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

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

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

源代码:



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



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

公从号后台回复【懒加载】获取本文源代码压缩包。

想看更多精彩内容,关注我获取更多前端技术与个人成长相关内容,我相信有趣的人终会相遇!如果觉得对你有帮助,也欢迎点赞,分享,加收藏!

深圳SEO优化公司宝鸡seo网站优化公司衡水网站优化按天计费公司镇江网站优化软件哪家好咸宁百度竞价推荐朝阳网站优化软件多少钱垦利百度竞价报价林芝百度seo醴陵网站优化按天扣费公司松原网络营销平凉SEO按天计费价格黄山建站价格雅安优化报价南充网站seo优化公司爱联网站改版公司安康模板网站建设公司长春关键词按天计费多少钱坑梓百度竞价包年推广公司荷坳品牌网站设计徐州网站优化按天计费多少钱同乐网站推广方案公司运城企业网站建设多少钱泉州网站推广方案推荐济南网站设计推荐崇左营销网站价格石家庄百度爱采购公司大同网站优化软件公司甘孜百度竞价包年推广公司凉山模板网站建设价格汉中网站关键词优化价格萍乡SEO按天收费报价歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化