懒加载(Lazy Loading)是一种在网页或应用程序中优化网页加载速度的技术。当我们加载一个页面时,通常会将页面中所有的内容,包括图片、视频等全部加载出来,这样就会使页面加载速度变得很慢,用户体验不佳。而懒加载则是将这些内容分块加载,只有当用户滚动到需要展示的部分时才会进行加载,这样可以加快页面的加载速度,提高用户的体验。
在小程序中,图片懒加载也是一种常用的优化方式。小程序中的图片懒加载有两种实现方式。下面我们将一一介绍。
一、IntersectionObserver实现懒加载
Intersection Observer是浏览器原生提供的一个API,它可以监听元素与文档顶部或浏览器可视区域的交叉状态。利用这个特性,我们可以很方便地实现图片的懒加载。
1. 简单实现
下面是一个简单的IntersectionObserver实现懒加载的例子。首先,我们将需要懒加载的图片的src属性值设置为一个小图片,然后给图片元素设置一个data-src属性,将真实的图片路径放在该属性中。接着,我们创建一个IntersectionObserver对象,将需要懒加载的图片的父容器传入,监听图片与文档顶部或浏览器可视区域的交叉状态。当图片与文档顶部或浏览器可视区域交叉时,我们将img元素的src属性设置为其data-src属性的值即可。
// 获取所有需要懒加载的图片
const imgs = document.querySelectorAll('.lazyload');
// 创建IntersectionObserver对象
const observer = new IntersectionObserver((entries) => {
// 遍历交叉状态集合
entries.forEach((entry) => {
// 如果图片与文档顶部或浏览器可视区域交叉,加载图片
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
// 取消监听该图片
observer.unobserve(img);
}
})
});
// 遍历所有需要懒加载的图片,监听其交叉状态
imgs.forEach((img) => {
observer.observe(img);
});
2. 实现图片淡入效果
上面的例子中,当图片进入到视图时,图片会突然出现,这并不美观。为了实现图片淡入效果,我们可以为需要懒加载的图片设置一个opacity为0的样式,当图片进入到视图时,我们将图片的opacity渐变到1即可。
// 获取所有需要懒加载的图片
const imgs = document.querySelectorAll('.lazyload');
// 创建IntersectionObserver对象
const observer = new IntersectionObserver((entries) => {
// 遍历交叉状态集合
entries.forEach((entry) => {
// 如果图片与文档顶部或浏览器可视区域交叉,加载图片并实现淡入效果
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
img.onload = () => {
img.style.opacity = 1;
};
// 取消监听该图片
observer.unobserve(img);
}
})
});
// 遍历所有需要懒加载的图片,监听其交叉状态
imgs.forEach((img) => {
img.style.opacity = 0;
observer.observe(img);
});
二、onReachBottom实现懒加载
小程序中还可以使用onReachBottom接口实现懒加载。onReachBottom是小程序提供的一个页面滚动到底部时触发的事件,我们可以在该接口中进行懒加载的操作。
1. 简单实现
下面是一个简单的onReachBottom实现懒加载的例子。首先,我们在页面中定义需要懒加载的图片,将img元素的src属性值设置为一个小图片,将真实的图片路径放在data-src属性中。接着,在onReachBottom接口中获取到需要懒加载的图片,当用户滚动到图片所在的区域时,将img元素的src属性设置为data-src属性的值即可。
// 监听页面滚动到底部事件
wx.onReachBottom(() => {
// 获取需要懒加载的图片
const imgs = document.querySelectorAll('.lazyload');
// 遍历需要懒加载的图片
imgs.forEach((img) => {
// 如果图片未加载,且用户滚动到其所在区域,加载图片
if (!img.src && img.getBoundingClientRect().top < wx.getSystemInfoSync().windowHeight) {
img.src = img.dataset.src;
}
})
});
2. 实现图片渐进加载效果
为了让懒加载的效果更加美观,我们可以采用渐进加载的方式,让图片在页面中逐渐展示。具体实现方式为,在图片加载完成后,利用CSS动画实现图片的渐进加载效果。
// 监听页面滚动到底部事件
wx.onReachBottom(() => {
// 获取需要懒加载的图片
const imgs = document.querySelectorAll('.lazyload');
// 遍历需要懒加载的图片
imgs.forEach((img) => {
// 如果图片未加载,且用户滚动到其所在区域,加载图片,实现渐进加载效果
if (!img.src && img.getBoundingClientRect().top < wx.getSystemInfoSync().windowHeight) {
img.width = img.offsetWidth;
img.src = img.dataset.src;
img.onload = () => {
img.classList.add('fade-in'); // 使用CSS动画实现渐进加载效果
};
}
})
});
通过上面的两种方式,我们可以实现小程序中图片的懒加载,提高小程序的加载速度,改善用户的体验。