当前位置: 首页 > article >正文

vue自定义指令-图片懒加载

这里封装好了一个兼容各浏览器的版本的指令,主要是判断浏览器支不支持 IntersectionObserver API,支持就用它实现懒加载,不支持就用监听 scroll 事件+节流的方式实现

const LazyLoad = {
  // install方法
  install(Vue, options) {
    const defaultSrc = options.default
    Vue.directive('lazy', {
      bind(el, binding) {
        LazyLoad.init(el, binding.value, defaultSrc)
      },
      inserted(el) {
        if (IntersectionObserver) {
          LazyLoad.observe(el)
        } else {
          LazyLoad.listenerScroll(el)
        }
      },
    })
  },
  // 初始化
  init(el, val, def) {
    el.setAttribute('data-src', val)
    el.setAttribute('src', def)
  },
  // 利用IntersectionObserver监听el
  observe(el) {
    var io = new IntersectionObserver((entries) => {
      const realSrc = el.dataset.src
      if (entries[0].isIntersecting) {
        if (realSrc) {
          el.src = realSrc
          el.removeAttribute('data-src')
        }
      }
    })
    io.observe(el)
  },
  // 监听scroll事件
  listenerScroll(el) {
    const handler = LazyLoad.throttle(LazyLoad.load, 300)
    LazyLoad.load(el)
    window.addEventListener('scroll', () => {
      handler(el)
    })
  },
  // 加载真实图片
  load(el) {
    const windowHeight = document.documentElement.clientHeight
    const elTop = el.getBoundingClientRect().top
    const elBtm = el.getBoundingClientRect().bottom
    const realSrc = el.dataset.src
    if (elTop - windowHeight < 0 && elBtm > 0) {
      if (realSrc) {
        el.src = realSrc
        el.removeAttribute('data-src')
      }
    }
  },
  // 节流
  throttle(fn, delay) {
    let timer
    let prevTime
    return function (...args) {
      const currTime = Date.now()
      const context = this
      if (!prevTime) prevTime = currTime
      clearTimeout(timer)
 
      if (currTime - prevTime > delay) {
        prevTime = currTime
        fn.apply(context, args)
        clearTimeout(timer)
        return
      }
 
      timer = setTimeout(function () {
        prevTime = Date.now()
        timer = null
        fn.apply(context, args)
      }, delay)
    }
  },
}
export default LazyLoad


http://www.kler.cn/a/442917.html

相关文章:

  • 21、Transformer Masked loss原理精讲及其PyTorch逐行实现
  • Agentless:OpenAI 采用的非代理框架
  • 【大模型】使用DPO技术对大模型Qwen2.5进行微调
  • linux下解压文件夹
  • ISP用到的一些名词简介
  • YOLOv9改进,YOLOv9引入LDConv线性可变形卷积,2024,二次创新RepNCSPELAN4结构
  • 04、Python爬虫——批量爬取douyin视频,下载到本地,半个小时内解决批量下载douyin视频
  • WEB开发: Node.js路由之由浅入深(三)自动配置路由 - 全栈工程师入门
  • redis问题解决方法
  • 深度学习常见名词概念:Sota、Benchmark、Baseline、端到端模型、迁移学习等的定义
  • 修改springboot的配置文件
  • ElasticSearch06-分片节点分配
  • 34.在 Vue 3 中使用 OpenLayers 上传 GeoJSON 文件并显示地图数据
  • 【DevOps基础篇】SCM(Source Code Management)
  • 网络安全管理员三级考试整理
  • 大数据治理相关工具:提升数据质量与合规性
  • 密码编码学与网络安全(第五版)答案
  • Redis篇--实际应用篇1--缓存穿透(布隆过滤器)
  • MySQL中in和exists的使用场景
  • Python 中使用 pymysql 操作 MySQL 数据库的基础指南
  • 2_使用 HTML5 Canvas API (1) --[HTML5 API 学习之旅]
  • Java毕设项目:基于Springboot生鲜销售商城网站系统设计与实现开题报告