使用
<ul>
<li v-for="(item, index) in state.imgs" :key="index" border>
<div class="item">
<img v-lazy="item.url" :src="item.url" alt="" />
<p>
{{ item.content }}
</p>
</div>
</li>
</ul>
实现
function isVisible(el: HTMLElement) {
let windowHeight = window.innerHeight;
let position = el.getBoundingClientRect();
if (position.top < windowHeight && position.top > -position.height) {
return true;
}
return false;
}
const lazyLoad = (img: HTMLElement, src?: string) => {
console.log(1);
if (img && src && isVisible(img)) {
setTimeout(function () {
img.setAttribute("src", src);
}, 500);
}
};
const lazy = {
mounted(el: HTMLElement, binding: any) {
el.setAttribute(
"src",
"https://tse1-mm.cn.bing.net/th/id/R-C.764319db0b103f9edcac08842b453651?rik=nOM%2f%2bYrpvFyNWg&riu=http%3a%2f%2fimg.zcool.cn%2fcommunity%2f016ea057314efc0000002bf08c5256.gif&ehk=EI0ZnD397cFSVpHTK4URJJfxM0xjDprc5GCTMRvFaxs%3d&risl=&pid=ImgRaw&r=0"
);
lazyLoad(el, binding.value);
window.addEventListener("scroll", function () {
lazyLoad(el, binding.value);
});
},
inserted: function (el: HTMLElement) {
lazyLoad(el);
},
};