一、效果图
实现效果:图片出现时才进行加载,否则处于加载截断
加载前:
加载后:
二、data-src属性
由于直接给图片绑定src属性会导致图片直接加载,我们可以给图片添加自定义属性按需加载,同时在加载前显示加载动态图
<img src="/loading.gif" :data-src="item.img" class="music-img" />
三、IntersectionObserver(交叉观察器)
1.创建IntersectionObserver对象,接受一个回调函数,当监听元素进入可视区域触发
const observer = new IntersectionObserver(observerCallback)
2.创建回调函数,回调函数接受一个IntersectionObserverEntry 对象,里面存储每一个监听的dom状态,其中isIntersecting为true,则监听dom出现在视野中,同时为了防止图片多次加载,我们在图片加载后卸载监听
const observerCallback = (entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
const img = entry.target
const data_src = img.getAttribute('data-src')
img.setAttribute('src', data_src)
observer.unobserve(img)
}
})
}
3.监听图片
const imgs = document.querySelectorAll('.music-img')
imgs.forEach((img) => {
observer.observe(img)
})
或者使用自定义指令
const vLazy = {
mounted: (el) => {
observer.observe(el)
}
}
<img src="/loading.gif" :data-src="item.img" class="music-img" v-lazy />