js 图片懒加载
2023-06-29 本文已影响0人
云高风轻
1. 前言
- 之前写了react 图片懒加载的简单实现 ,vue的没找到
- 最近看了些博客又有新的理解 记录下
2. 是什么 what
- 懒加载是一种网页性能优化的方式,它能极大的提升用户体验。
- 因为现在都是5G网络普及了 图片,视频都已经在网站 是非常常见的了,但是呢他们也一直是影响网页性能的主要元凶,现在一张图片,视频超过几M已经是很经常的事了。
如果每次进入页面就请求所有的图片,视频资源,那么可能等图片,视频加载出来用户也早就走了。
所以,我们需要懒加载,进入页面的时候,只请求可视区域的图片资源
3. 最简单的实现方式是 html
- 哈哈给 img加个 loading 属性 ,现在大多数浏览器也都支持
- loading支持情况.png
<img src="./yzs.png" loading="lazy">
4. js 实现
- react 图片懒加载的简单实现 这里的大体思路
- 设置占位图
- 监听window 的 scroll 事件
- 遍历每个图片判断当前图片是否到了可视区范围内
- 如果到了就设置图片的 src 属性
- 优化
scroll
事件会在很短的时间内触发很多次,严重影响页面性能,为了提高网页性能,我们需要一个节流函数来控制函数的多次触发,在一段时间内(如 200ms)只执行一次回调
5. IntersectionObserver
- IntersectionObserver -MDN 定义
- 简单来说就是可以自动"观察"元素是否可见
- 由于可见(visible)的本质是,目标元素与视口产生一个交叉区,所以这个 API 叫做"交叉观察器"
构造函数
- IntersectionObserver()
- 创建一个新的 IntersectionObserver 对象,当其监听到目标元素的可见部分(的比例)超过了一个或多个阈值(threshold)时,会执行指定的回调函数。
let io = new IntersectionObserver(callback, option)
// 开始观察
io.observe(document.getElementById('example'))
// 停止观察
io.unobserve(element)
// 关闭观察器
io.disconnect()
懒加载的实现
核心代码
data-src
占位图属性
<!DOCTYPE html>
<html>
<head>
<style>
/* 假设图片的占位符具有固定的高度 */
.placeholder {
height: 200px;
background-color: #eee;
}
</style>
</head>
<body>
<div id="container">
<div class="placeholder"></div>
<img class="lazy-image" data-src="image.jpg" alt="Lazy Image">
<div class="placeholder"></div>
<img class="lazy-image" data-src="image2.jpg" alt="Lazy Image 2">
</div>
<script>
// 获取所有的懒加载图片元素
const lazyImages = document.querySelectorAll('.lazy-image');
// 创建 IntersectionObserver 实例
const observer = new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
// 当元素进入视窗时加载图片
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
img.classList.remove('lazy-image');
observer.unobserve(img); // 停止观察已加载的图片
}
});
});
// 遍历每个懒加载图片元素,并开始观察
lazyImages.forEach(image => {
observer.observe(image);
});
</script>
</body>
</html>
使用 IntersectionObserver 可以实现懒加载的功能,即在元素进入视窗之前不加载其内容,只有当元素可见时才加载相应的资源(如图片、视频等)