img-lazyload
demo
参考
https://web.dev/lazy-loading-images/
实现
img的loading属性
<img loading="lazy" />
IntersectionObserver
除了 IE 浏览器,其他主流浏览器全部支持,使用IntersectionObserver
需要两步进行:
- 在
html
注入这段代码,以监听所有img
元素使用懒加载
// 获取所有带有 lazy class 的 img 元素
const lazyImages = [...document.querySelectorAll("img.lazy")];
const lazyBackgrounds = [...document.querySelectorAll("img.lazy-background")];
let lazyImageObserver = new IntersectionObserver(function(entries, observer) {
entries.forEach(function(entry) {
if (entry.isIntersecting) {
if(entry.target instanceof HTMLImageElement) {
}
let lazyImage = entry.target as HTMLImageElement;
lazyImage.src = lazyImage.dataset.src!;
lazyImage.srcset = lazyImage.dataset.srcset!;
lazyImage.classList.remove("lazy");
lazyImageObserver.unobserve(lazyImage);
}
});
});
lazyImages.forEach(function(lazyImage) {
lazyImageObserver.observe(lazyImage);
});
- 使用
img
的时候用data-src
和data-srcset
分别替换src
和srcset
属性,而原本的src
属性传递图像加载过程中过渡显示的图像,可以使用较小图片的dataUrl-base64
编码格式
<img
class="lazy"
data-src="https://res.cloudinary.com/drp9iwjqz/image/upload/f_auto,q_auto/v1508210556/jeremywagner.me/using-webp-images/tacos-2x.jpg"
data-srcset="https://res.cloudinary.com/drp9iwjqz/image/upload/f_auto,q_auto/v1508210556/jeremywagner.me/using-webp-images/tacos-2x.jpg 2x, https://res.cloudinary.com/drp9iwjqz/image/upload/f_auto,q_auto/v1508210556/jeremywagner.me/using-webp-images/tacos-1x.jpg 1x"
width="240"
height="240"
alt="图像"
/>
- 对于在 CSS 中使用
background
的元素,也可以通过IntersectionObserver
来实现懒加载背景图:
<div class="lazy"></div>
<style>
.lazy {
padding-top: 28.0519480519%;
background-image: url("https://res.cloudinary.com/drp9iwjqz/image/upload/e_blur:2000,f_auto,q_auto/v1508291830/jeremywagner.me/using-webp-images/tacos-1x.jpg");
}
.lazy.visible {
background-image: url("https://res.cloudinary.com/drp9iwjqz/image/upload/f_auto,q_auto/v1508210556/jeremywagner.me/using-webp-images/tacos-2x.jpg");
}
</style>