一、懒加载
1、懒加载的概念 懒加载也叫做延迟加载,按需加载,指的是在长网页中延迟加载图片数据,是一种比较好的网页性能优化的方式,在比较长的网页或应用中,如果图片很多,所有的图片都被加载出来,而用户只能看到可视窗口的那一部分图片数据,那这样就浪费了性能
如果使用图片的懒加载就可以解决以上问题,在滚动屏幕之前,可视化区域之外的图片不会进行加载,在滚动屏幕时才加载,这样可以让网页的加载速度更快,减少服务器的负载,;懒加载适用于图片较多,页面列表较长比如在电商的情景
2、懒加载的特点
- 提升用户体验:如果同时加载较多的图片,可能需要等待的时间较长,这样影响用户的体验,而使用懒加载就能提高用户的体验,其次可以提高页面的首屏渲染速度
- 减少无用的资源加载:使用懒加载减少了服务器的压力和浏览,同时也减少了浏览器的负担
- 防止加载过道图片而影响其他资源的文件加载:会影响网站应用的正常使用
3、懒加载的实现原理(敲重点)
图片的加载是因为src属性,当src赋值时,浏览器会请求图片的资源,根据这个原理我们可以使用html5的data-xxx属性来存储图片的路径,在需要加载图片的时候,将data-xxx图片的路径赋值为src,这样就完成了图片的按需加载,即懒加载。
对于data-xxx我暂时用data-src来定义
懒加载的实现重点在于,确定什么时候加载哪些图片,在浏览器中,可视区域内的资源就是用户需要的资源,所以当图片出现在可是区域时,获取图片的真实地址data-src并赋值给图片就可以了
理清:
(1) window.innerHeight 是浏览器可视区的高度
(2)document.body.scrollTop || document.documentElement.scrollTop是浏览器滚动过的距离
(3)imgs.offsetTop是元素顶部距离文档顶部的距离(包括滚动条的距离)
(4)图片加载条件:img.offsetTop < window.innerHeight + document.body.scrollTop
代码实现:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
.scrolltop {
position: fixed;
top: 0;
left: 0px;
background-color: red;
font-size: 30px;
}
.winHeight {
position: fixed;
top: 50px;
left: 0px;
background-color: red;
font-size: 30px;
}
</style>
</head>
<body>
<div class="scrolltop"></div>
<div class="winHeight"></div>
<div class="container">
<img src="./1.png" data-src="./2.png" alt="" />
<img src="./1.png" data-src="./2.png" alt="" />
<img src="./1.png" data-src="./2.png" alt="" />
<img src="./1.png" data-src="./2.png" alt="" />
<img src="./1.png" data-src="./2.png" alt="" />
<img src="./1.png" data-src="./2.png" alt="" />
<img src="./1.png" data-src="./2.png" alt="" />
<img src="./1.png" data-src="./2.png" alt="" />
</div>
<script>
let imgs = document.querySelectorAll("img");
let scrolltopInnerhtml = document.querySelector(".scrolltop");
let winHeighthtml = document.querySelector(".winHeight");
function lazyload() {
let scrollTop =
document.body.scrollTop || document.documentElement.scrollTop;
let winHeight = window.innerHeight;
scrolltopInnerhtml.innerHTML = "scrollTop:" + scrollTop + "px";
winHeighthtml.innerHTML = "winHeight:" + winHeight + "px";
for (let i = 0; i < imgs.length; i++) {
console.log(
`[Log] imgs[${i}].offsetTop-->`,
imgs[i].offsetTop,
winHeight,
scrollTop
);
if (imgs[i].offsetTop < winHeight + scrollTop) {
imgs[i].src = imgs[i].getAttribute("data-src");
// console.log("[Log] imgs[i]-->", i);
}
}
}
window.addEventListener("scroll", lazyload);
</script>
</body>
</html>
演示效果
赖加载与预加载的区别
这两种方式都是提高网页性能的方式,两者主要区别是一个是提前加载,一个是迟缓甚至不加载。懒加载对服务器前端有一定的缓解压力作用,预加载则会增加服务器前端压力。
- 懒加载也叫延迟加载,指的是在长网页中延迟加载图片的时机,当用户需要访问时,再去加载,这样可以提高网站的首屏加载速度,提升用户的体验,并且可以减少服务器的压力。它适用于图片很多,页面很长的电商网站的场景。懒加载的实现原理是,将页面上的图片的
src属性设置为空字符串,将图片的真实路径保存在一个自定义属性中,当页面滚动的时候,进行判断,如果图片进入页面可视区域内,则从自定义属性中取出真实路径赋值给图片的src属性,以此来实现图片的延迟加载。 - 预加载指的是将所需的资源提前请求加载到本地,这样后面在需要用到时就直接从缓存取资源。通过预加载能够减少用户的等待时间,提高用户的体验。我了解的预加载的最常用的方式是使用js中的image对象,通过为image对象来设置
scr属性,来实现图片的预加载。
本人菜鸡,欢迎大佬指正,希望giegie们给我点个star