vue3.0 实现图片延迟加载 自定义属性

根目录下创建文件 directive.js

export default function directive(app) {
  // 图片延迟加载
  let ob = new IntersectionObserver(changes => {
    changes.forEach(item => {
      let {
        target, // 被观察的目标元素,是一个 DOM 节点对象
        isIntersecting // 目标元素是否显示
      } = item;
      if (!isIntersecting) return;
      target.$imgBox.src = target.$src;
      target.$imgBox.style.opacity = 1;
      ob.unobserve(target); // 取消对某个目标元素的观察
    });
  }, {
    // 当目标元素和根元素相交的面积占目标元素面积的百分比到达或跨过某些指定的临界值时就会触发回调函数
    threshold: [0.5]
  });
  app.directive('lazyimg', {
    mounted(el, binding) {
      let imgBox = el.querySelector('img');
      if (!imgBox) return;
      imgBox.src = '';
      imgBox.style.opacity = 0;
      imgBox.style.transition = 'opacity .3s';
      el.$src = binding.value;
      el.$imgBox = imgBox;
      ob.observe(el); // 观察某个目标元素
    }
  });
};

main.js中进行使用 

import { createApp } from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';
import directive from './directive';

const app = createApp(App);
app.use(router);
app.use(store);
directive(app);
app.mount('#app');

使用 Home.js

<div class="wrap-img" v-if="item.list_image_url" v-lazyimg="item.list_image_url">
  <img src="" alt="" />
</div>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值