简述图片的懒加载原理

news/2025/2/26 7:26:06

懒加载原理

一张图片就是一个<img>标签,浏览器是否发起请求图片是根据<img>的src属性,所以实现懒加载的关键就是,在图片没有进入可视区域时,先不给<img>的src赋值,这样浏览器就不会发送请求了,等到图片进入可视区域再给src赋值。

实现懒加载有四个步骤,如下:

1.加载loading图片

2.判断哪些图片要加载【重点】

3.隐形加载图片

4.替换真图片

这里介绍下几个API函数:

页可见区域宽: document.body.clientWidth;

网页可见区域高: document.body.clientHeight;

网页可见区域宽: document.body.offsetWidth (包括边线的宽);

网页可见区域高: document.body.offsetHeight (包括边线的宽);

网页正文全文宽: document.body.scrollWidth;

网页正文全文高: document.body.scrollHeight;

网页被卷去的高: document.body.scrollTop;

网页被卷去的左: document.body.scrollLeft;

网页正文部分上: window.screenTop;

网页正文部分左: window.screenLeft;

屏幕分辨率的高: window.screen.height;

屏幕分辨率的宽: window.screen.width;

屏幕可用工作区高度: window.screen.availHeight;

HTMLElement.offsetTop 为只读属性,它返回当前元素相对于其 offsetParent 元素的顶部的距离。

window.innerHeight:浏览器窗口的视口(viewport)高度(以像素为单位);如果有水平滚动条,也包括滚动条高度

 

js代码实现

// onload是等所有的资源文件加载完毕以后再绑定事件
window.onload = function(){
	// 获取图片列表,即img标签列表
	var imgs = document.querySelectorAll('img');

	// 获取到浏览器顶部的距离
	function getTop(e){
		return e.offsetTop;
	}

	// 懒加载实现
	function lazyload(imgs){
		// 可视区域高度
		var h = window.innerHeight;
		//滚动区域高度
		var s = document.documentElement.scrollTop || document.body.scrollTop;
		for(var i=0;i<imgs.length;i++){
			//图片距离顶部的距离大于可视区域和滚动区域之和时懒加载
			if ((h+s)>getTop(imgs[i])) {
				// 真实情况是页面开始有2秒空白,所以使用setTimeout定时2s
				(function(i){
					setTimeout(function(){
						// 不加立即执行函数i会等于9
						// 隐形加载图片或其他资源,
						//创建一个临时图片,这个图片在内存中不会到页面上去。实现隐形加载
						var temp = new Image();
						temp.src = imgs[i].getAttribute('data-src');//只会请求一次
						// onload判断图片加载完毕,真是图片加载完毕,再赋值给dom节点
						temp.onload = function(){
							// 获取自定义属性data-src,用真图片替换假图片
							imgs[i].src = imgs[i].getAttribute('data-src')
						}
					},2000)
				})(i)
			}
		}
	}
	lazyload(imgs);

	// 滚屏函数
	window.onscroll =function(){
		lazyload(imgs);
	}
}

https://zhuanlan.zhihu.com/p/112675546  //


http://www.niftyadmin.cn/n/3655815.html

相关文章

ActiveSync用红外接口PC与掌上电脑同步

用了三年多的IBM老本终于退居二线了&#xff0c;别说还真有些舍不得。幸好新买的HP Compaq nc4400的小本接口比较齐全 &#xff0c;算是一种心理上的补偿&#xff0c;唯感到遗憾的是自带Vista home版&#xff0c;用起来实在别扭&#xff0c;买后的第二天就把盘格了&#xff0c;…

const, let, var 关键字有什么区别?

1.let 块级作用域 定义变量 不允许重复定义 2.var 全局作用域或函数作用域定义变量允许重复定义如果不初始化会输出undefined&#xff0c;不会报错 3.const 块级作用域定义常量不允许重复定义

共享内存操作类(C#源码)

VC的共享内存操作代码实现起来相对比较容易&#xff0c;但是用C#语言来实现&#xff0c;就有一定难度&#xff0c;由于工作需要&#xff0c;把以前VC开发的共享内存代码要用C#实现&#xff0c;别说&#xff0c;还费了不少周折&#xff0c;毕竟C#操作API函数和地址指针不是那么直…

ini文件纯C++读写代码

前一段时间&#xff0c;一直有朋友在向我索要EVC版本的ini读取函数&#xff0c;由于是公司其他人完成的代码&#xff0c;我不便于公布&#xff0c;正好这段时间重新拾起了成都英创公司的NetBox / NetBoxII相关开发工作&#xff0c;它的系统平台为DOS&#xff0c;开发平台BC3.0。…

JavaScript 中的严格模式是什么,有什么作用?

严格模式是为JavaScript 定义了一种不同的解析与执行模型。在严格模式下&#xff0c;ECMAScript 3 中的一些不确定的行为将得到处理&#xff0c;而且对某些不安全的操作也会抛出错误。要在整个脚本中启用严格模式&#xff0c;可以在顶部添加如下代码&#xff1a; "use st…

SQL2005安装之sql.cab没找到释疑

最近安装SQL2005可把我折腾坏了&#xff0c;安装了无数次&#xff0c;不是性能计数器问题&#xff0c;就是sql.cab找不到&#xff0c;不过最后还是功夫不负有心人&#xff0c;终于安装成功。性能计数器问题&#xff0c;主要是卸载SQL2005&#xff0c;再重新安装的错误&#xff…

Vue 组件传值、通信 整理

1.父组件 > 子组件 属性 props // child 子组件 接收 props: { msg: String }// parent 父组件 传值 <HelloWorld msg"Welcome to Your Vue.js App"/>引用refs //parent 父组件 <HelloWorld ref"hw"> this.$refs.hw.xx "xxxx…

工业组态领头羊--组态王开始涉足.net程序开发(与林伟先生一次近距离接触)

最近为了推广我们的嵌入式设备&#xff0c;决定和组态王进行深层次的合作&#xff0c;昨天林伟先生一行人来到我们公司进行相关合作商谈&#xff0c;我有幸参与其中与林伟先生有了近距离接触的机会。 在我们总经理介绍我的时候&#xff0c;林总说好像见过我&#xff0c;我笑了笑…