问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

H5页面如何实现图片懒加载?

发布网友 发布时间:2024-10-02 05:56

我来回答

1个回答

热心网友 时间:2024-11-21 17:16

图片懒加载,往往作为减少首页白屏时间的一个解决方案而出现。直观的来说,就是不要直接加载所有图片,而是满足一定条件后才加载,也就是”惰性加载“。实现图片懒加载的方式有很多,如果要简单点那就直接使用第三方插件:vue-lazyload,如果想探究一下别人的插件是怎么实现图片懒加载的,那么可以看看本文是如何实现的。

实现思路

实现图片懒加载我们需要先明白具体的场景,一般来说,我们会在首屏先加载几张图片,其他的图片则先不加载,在页面滚动时,图片快出现在视窗中的时候才来加载图片。为什么要这么实现呢,因为对于图片很多的场景,如果一次性加载出所有的图片,可能会导致页面白屏时间比较长,特别是图片比较大的时候。

实现过程:

使用data-*自定义数据属性给img标签新增一个data-src属性

全局监听滚动事件,使用节流处理回调函数

在回调函数中,判断图片是否已经出现在可视区域,如果已经出现在可视区域,则加载该图片

页面初始化的时候执行一下回调函数,保证首屏有图片显示

在这个实现过程中,涉及一些知识点,我们来快速回顾一下:

准备知识data-*

data-*是可自定义数据属性的属性,可用在所有的HTML元素上面,嵌入自定义的数据内容。这些自定义的数据可以在HTMMLElement.dataset中被访问到,例如:

<imgid="img"src="loading.gif"data-src="xxx.png"data-name="img"/>//访问datasetconstimg=document.getElementById('img')console.log(img.dataset.src);//xxx.pngconsole.log(img.dataset.name);//img

我们实现图片懒加载的最终目的,就是在恰当的时候使用data-src的值替换到src,加载真实的图片。data-*定义的数据不仅可以在js中访问,也可以在CSS中访问,具体可参考:dataset

getBoundingClientRect()

Element.getBoundingClientRect()方法会返回一个DOMRect对象,其包含了当前元素的大小,以及相对于视窗的位置信息。听名字可能会有点迷糊,但是结合图来看就比较好理解了:

DOMRect对象中的width和height是包含了元素的padding和border-width,其位置信息指的是包含元素的最小矩形的每条边距离视窗原点(0,0)的位置。

throttle

由于我们会全局监听scroll滚动事件,如果每次滚动都触发回调函数的话会造成不必要的计算成本,因此我们考虑使用节流来处理滚动事件。节流的具体细节就不在此重复,我们先简单实现一个节流:

functionthrottle(fn,delay=200){lettimer=null;returnfunction(){if(timer)return;timer=setTimeout(()=>{fn.apply(this,arguments);timer=null;},delay);}}window.innerHeight

有几个很相似的”height“,我们就简单都梳理一下:

window.innerHeight:浏览器可视区域的高度;如果有水平滚动条,也会包含滚动条高度

window.outerHeight:获取整个浏览器的高度

Element.scrollHeight:元素内容的高度,包括由于溢出导致隐藏的内容高度

Element.clientHeight:元素内部的高度,包含内边距,但不包括水平滚动条、边框、外边距

这里我们使用innerHeight即可,因为我们是在window对象上监听scroll滚动事件。

准备工作已经完毕,接下来就直接上手代码。

完整代码

代码中都有相应的注释,在了解上面的准备知识后,代码就挺简单的了:

js部分

//使用for循环批量创建img,html中可没有v-for可以使用for(letindex=0;index<10;index++){letimg=document.createElement("img");img.src="./loading.gif";img.dataset.src="./dog.jfif";//由于我们是通过js创建的,因此就无法直接使用data-*,如果是在html上面,需要添加此属性document.body.appendChild(img);img=null;}//节流functionthrottle(fn,delay=200){lettimer=null;returnfunction(){if(timer)return;timer=setTimeout(()=>{fn.apply(this,arguments);timer=null;},delay);};}//懒加载-回调函数functionlazyLoad(){constimgs=document.querySelectorAll('img[data-src]');if(!imgs.length)return;imgs.forEach(img=>{constrect=img.getBoundingClientRect();if(rect.top<window.innerHeight){img.src=img.dataset.src;img.removeAttribute('data-src');//我们是通过img[data-src]查找所有img标签的,渲染后就删除data-src可减少forEach循环的计算成本}})}//全局监听scroll滚动事件window.addEventListener('scroll',throttle(()=>{lazyLoad();},100));//初始化的时候执行一下加载图片的函数lazyLoad();

CSS部分

<style>body{display:flex;flex-direction:column;align-items:center;}img{margin:10pxauto;width:600px;height:400px;object-fit:cover;border-radius:4px;border:1pxsolid#070707;}</style>

运行结果:

首屏展示:

首先我们会默认加载三张图片,查看元素节点,这三张图片的data-src都没有,而另外没有加载的图片是有data-src的。

滚动中展示:

滚动时会触发图片加载的回调函数,DOM树也会跟着改变

滚动结束展示

所有图片都将只有src,没有data-src。

总结

本文通过监听滚动事件,在图片出现在可视区域前才加载真正的图片,如果未出现则使用默认的loading图片的方式实现了图片懒加载。一般来说,loading图片都会比较小,而实际的图片会大很,因此使用loading图片来代替是可以减少图片渲染时间的。

原文:https://juejin.cn/post/7111609083441971208
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
如果两个男生喜欢上同一个女生怎么办 玛丽居里学者 玛丽居里奖学金含金量 玛丽居里学者含金量 玛丽居里学者什么级别 豆渣肥料适合什么花 豆渣拌在土里能种花吗-豆渣怎样做肥料好 生物化学和微生物学是一个专业吗 请问这狗狗是什么品种?是不是杂交的啊? ...鉴别下这是啥狗狗?大概三个月不到点。个人感觉像是蝴蝶和土狗... 上海火车站到成都11点18分发车南站上车还是北站上车 H5页面加载慢?一招秒解!WebView性能优化实战! 龙血树为什么叫龙血树 龙血树为什么叫龙血树呢? ...cyok是木马吗?用金山毒霸和QQ电脑管家杀毒提示为木马。 ...是被改动,360和腾讯电脑管家都查不出来是什么木马. ...怎么回事 电脑管家提醒被改 谁能告诉我是怎么回事?谢谢 我IE今天一下出来3个关都关不了怎么回事 电脑管家提醒被改 谁能告诉... 柚子茶不适合那些人 大麦茶上火还是去火,大麦茶的功效与作用 大麦茶其他用途 山西护理学可以自考吗 护理专业可以自考吗 我是外地来济南打工的,孩子今年该上学了,那位知道历城区的小学有不... 户口是济南郊区的,儿子在济南上小学要收借读费吗 外边的孩子在济南能不能不交借读费? 少点的也行 电脑全屏缩小快捷键是什么? 25mm美工刀用处 Excel和word中20以上带圈数字的输入技巧 什么商场可以分期付款吗 上海1156列车终点站是火车北站吗? web view无法打开H5页面怎么办? 诺基亚bh501501诺基亚 如何将pdf文件图片插入word文档中? 如何查每日电费 邮政卡手机银行叫什么 邮局卡下载什么app银行 光伏电站国内光伏电站的前景受制于三个因素 天津工业大学软件学院 天津工业大学的软件学院 韭菜鸡蛋饺子馅怎么调好吃(韭菜鸡蛋饺子馅怎么调好吃又嫩) 天津工业大学计算机科学与软件学院学院简介 天津工业大学计算机科学与软件学院办学规模 天津市大学软件学院天津市大学软件学院探索全新人才培养模式 天津工业大学计算机科学与软件学院教学模式 2014年农历9月初十酉时出生,五行缺什么 脑鸣会影响平常的工作吗? 五行查询2014年农历9月2日下午4点15分出生的女孩缺少什么 手柄震动设计——以FPS游戏为例 2014年农历1月初10早晨4点10出生看五行缺什么 刚才有个高手说缺土,我...