图片懒加载也就是图片的延迟加载,实现图片的懒加载总共有两种方法
- 事件监听:监听scroll事件,鼠标滚动就触发
- IntersectionObserver:按字面意思就是交叉观察,也就是目标元素和可视窗口会产生交叉区域,观察交叉区域发生什么事情,执行什么程序
第一种scroll事件
当图片距离视窗顶部的距离大于浏览器窗口显示区的高度时,图片不可见,反之可见
html代码
<body>
<p>图片懒加载也就是图片的延迟加载</p>
<p>图片懒加载也就是图片的延迟加载</p>
<p>图片懒加载也就是图片的延迟加载</p>
<p>图片懒加载也就是图片的延迟加载</p>
<p>图片懒加载也就是图片的延迟加载</p>
<p>图片懒加载也就是图片的延迟加载</p>
<p>图片懒加载也就是图片的延迟加载</p>
<p>图片懒加载也就是图片的延迟加载</p>
<p>图片懒加载也就是图片的延迟加载</p>
<p>图片懒加载也就是图片的延迟加载</p>
<p>图片懒加载也就是图片的延迟加载</p>
<p>图片懒加载也就是图片的延迟加载</p>
<p>图片懒加载也就是图片的延迟加载</p>
<p>图片懒加载也就是图片的延迟加载</p>
<p>图片懒加载也就是图片的延迟加载</p>
<p>图片懒加载也就是图片的延迟加载</p>
<p>图片懒加载也就是图片的延迟加载</p>
<p>图片懒加载也就是图片的延迟加载</p>
<img data-src="./images/bargain.png" />
<img data-src="./images/bargain.png" />
<img data-src="./images/bargain.png" />
<p>图片懒加载也就是图片的延迟加载</p>
<p>图片懒加载也就是图片的延迟加载</p>
<p>图片懒加载也就是图片的延迟加载</p>
<script src="./images/bargain.png"></script>
</body>
javascript代码
window.addEventListener("scroll", e => {
// 先判断每张图片的位置是否在可视区域
images.forEach(image => {
const imageTop = image.getBoundingClientRect().top;
if (imageTop < window.innerHeight) {
const data_src = image.getAttribute("data-src");
image.setAttribute("src", data_src);
}
console.log("scroll");
});
});
问题每一次滚动都会触发事件,即使滚动结束依旧会触发事件
通过第二种方法IntersectionObserver可以更好的解决
通过IntersectionObserver来监视,当检查区域与元素发生了交互的时候会产生什么
该方法有两个参数
var observer = new IntersectionObserver(callback[, options]);
通过observe
来触发,通过unobserve
来解绑
当加载完成的时候就解绑,调用unobserve
const callback=entries=>{
entries.forEach(entry => {
if (entry.isIntersecting) {
const image = entry.target;
const data_src = image.getAttribute("data-src");
image.setAttribute("src", data_src);
// 图片被加载后取消观察
console.log('触发了');
observer.unobserve(image);
}
});
}
const observer = new IntersectionObserver(callback)
images.forEach(image=>{
observer.observe(image)
})
第三种方案三:直接给标签添加属性loading="lazy"就好了
<img src="lazy.jpg" loading="lazy" />
除了谷歌浏览器暂不支持