js 手写图片懒加载插件

news2024/9/23 16:11:15

一、目标

模仿vue-lazyload插件

只需将img标签的src属性名替换为自定义属性v-lazy,即可实现图片懒加载功能

例如:

二、实现

不清楚图片懒加载原理的参考我的上一篇博客

1.封装自定义插件:暴露一个对象,包含一个install方法

先介绍一下自定义插件使用方法和通用写法:

// main.js
import createApp from 'vue';
import App from './App.vue';
import MyPlugin from './myPlugin ';

const app = createApp(App);

// 使用插件 传入一个对象作为配置项
app.use(MyPlugin, {
  myProperty: 'some value'
});

app.mount('#app');
// myPlugin.js
export default {
  // 插件安装时调用 接收参数:Vue实例对象和配置项
  install(Vue, options) {
    // 添加全局指令
    Vue.directive('my-directive', {
      bind(el, binding) {
        // 指令逻辑
      }
      // 可以添加更多的钩子函数,如 inserted, update, componentUpdated 和 unbind
    });

    // 添加全局方法
    Vue.prototype.$myMethod = function() {
      // 方法逻辑
    };

    // 添加全局属性
    Vue.prototype.$myProperty = options.myProperty 
  }
};

2.利用交叉观察器Intersection Observer实现图片懒加载

  main.js引入插件

// main.js
import createApp from 'vue';
import App from './App.vue';
import lazyPlugin from './lazyPlugin';

const app = createApp(App);

// 使用插件 传入一个对象作为配置项
app.use(lazyPlugin);

app.mount('#app');

  定义插件,编写install函数       

//lazyPlugin.js
export default {
  install(Vue){
    //自定义指令(指令名,回调函数)
    //回调函数包含参数 el:绑定该指令的DOM元素(img元素) | binding:属性值(img的url)
    Vue.directive('lazy',(el,binding)=>{
      //编写回调函数 接收参数entries:被观察元素组成的数组 
      const callback = (entries)=>{
        entries.forEach(entry=>{
          //若与视口发生交叉  
          if(entry.isIntersecting){
            el.src = binding.value;
            observer.unobserve(el);
          }
        })
      }
      //构造观察器  
      const observer = new IntersectionObserver(callback)
      observer.observe(el);
    })
    
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2068057.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

咸鱼之王手游内购修复无bug运营版联网架设+后台

今天给大家带来一款单机游戏的架设:咸鱼之王手游。 另外:本人承接各种游戏架设(单机联网) 本人为了学习和研究软件内含的设计思想和原理,带了架设教程仅供娱乐。 教程是本人亲自搭建成功的,绝对是完整可…

在Ubuntu 部署 Grafana且监控MySQL数据

一、安装 打开终端按顺序执行以下命令 1.添加 Grafana 的 APT 仓库: sudo apt-get install -y software-properties-common sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main" 2.导入Grafana GPG key: wge…

国产光耦合器的应用和优势浅析

光耦合器,也称为光隔离器,是电子领域的关键元件,为系统的不同部分提供必要的电气隔离。在国内半导体行业,高性能光耦合器的开发已成为一个重点关注领域,因为它们广泛应用于各个领域,包括医疗设备、汽车电子…

安泰功率放大器怎么使用

功率放大器是电子电路中的重要组件,用于增加输入信号的幅度,以便驱动各种负载。在不同的应用中,功率放大器有不同的使用方法和技巧。下面安泰电子将介绍功率放大器的基本使用方法,以及一些常见的应用示例。 1.连接电源 首先&#…

创意无限:7 个顶级广告设计软件推荐

在竞争激烈的市场中,一款引人注目的平面广告设计能够为设计师带来显著的业绩提升和收益。然而,除了设计师的专业技能,设计软件的选择同样对广告的最终效果有着不可忽视的影响。本文将介绍几款经过作者亲自测试并极力推荐的平面广告设计软件&a…

安装 podman 与 podman-compose

文章目录 Github官网文档Podman 简介Podman 与 Docker 区别 Podman 安装下载安装(推荐)brew 安装(Mac) Podman 虚拟机虚拟机基础rootful 模式 Podman 镜像与容器安装 podman-composedocker-compose.yml Github https://github.co…

秋招突击——8/23——知识补充——反向代理和正向代理——负载均衡算法

文章目录 引言正文正向代理反向代理负载均衡 面试题1、nginx属于七层网络结构中的哪一层?2、Nginx有哪些负载均衡算法3、什么是反向代理?什么是正向代理? 总结 引言 一步一步把以前忘记的计算机网络知识再捡起来,重新整理一遍&am…

Linux线上安装遇到的一些问题

本文目录 一、基于Linux安装php8二、Linux线上连接数据库问题三、关于线上nginx报错问题 一、基于Linux安装php8 首先登录ubuntu系统后运行命令:sudo apt update 更新完之后,安装我们需要的软件: sudo apt install nginx 安装 mysql。运行命…

UneMeta创始人讲述自己在Web3+IP领域创业的心路历程

昨日,UneMeta创始人,Ann_tyrion在X分享了一篇推文,分享了自己在探索Web3与IP产业结合过程中的心路历程,她并没有像很多项目方那样一味的讲述宏大的叙事,而是字里行间透露出对这个行业的探索和不断给自己充实信念&#…

2024最新Python+PyCharm保姆级安装教程【附激活码】

PyCharm 是由捷克的 JetBrains 公司开发的一款强大的 Python 集成开发环境(IDE),它为 Python 开发者提供了一个全面的编程工具集,支持从代码编写到代码测试、调试和优化等各个环节 ,它支持代码自动完成、代码检查、实时…

多功能秒达工具箱全开源源码,可自部署且完全开源的中文工具箱

简介: 多功能秒达开源工具箱源码,,可自部署且完全开源的中文工具箱,永远的自由软件,轻量级运行,全平台支持(包括ARMv8),完全类似 GPT 的支持,与高效的 UI 高…

MDK报错 .error: unknown register name ‘msp‘ in asm

似乎只能安装 V5的编译器 才能解决,下面是安装链接 https://blog.csdn.net/u011436603/article/details/136419969 V5的编译器 CSDN免费下载链接: 以下办法解决不了 解决办法: 在MDK 桌面图标,右击打开安装位置,在:\K…

论文相关知识

一、论文注意事项一 1.选题原则 开拓性:前人没有专门研究过或虽已研究但尚无理想的结果,有待进一步探讨和研究,或是学术界有分歧,有必要深入研究探讨的问题; 创新性:硕士学位论文要有新的见解,博士学位论文要做出创…

买完服务器后,如何部署项目|如何通过宝塔部署项目

一、前言 很多人都会在腾讯云、阿里云等平台上买服务器,但是买了服务器后,不知道接下来要干什么,或者是怎么部署项目。 买完服务器后,第一步就是再买一个数据盘,然后将数据盘挂载到服务器上,不知道教程的…

深入解析CSS—基础

层叠、相对单位及盒模型是CSS最基本的部分。 1 基础 1.1 层叠、优先级和继承 层叠是指多个css样式在对同一个元素配置同一属性时,依据权重来处理冲突。 权重判断: 样式表来源:浏览器默认样式及开发时定义的样式。选择器优先级。源码顺序…

基于AT32F421的开源电调项目测试

基于AT32F421的开源电调项目测试 📍开源固件地址:https://github.com/lax-fly/lax-esc🧨开源硬件地址:https://oshwhub.com/lax-fly/lax-esc-dev📺演示视频:https://www.bilibili.com/video/BV1di421d7yH/?…

CTEA论文翻译

CTEA论文翻译 Embedding-Based Entity Alignment of Cross-Lingual Temporal Knowledge Graphs 基于嵌入的跨语言时序知识图谱实体对齐 ABSTRACT 实体对齐旨在通过匹配多源知识图谱中的相同实体来构建完整的知识图谱(KG)。现有的实体对齐研究主要集中在知识边缘图中的静态多…

【案例57】记一次类加载导致系统卡死

问题现象 顾问反馈系统卡顿,系统无法使用。所有节点打开都在转圈。 问题分析 排查了nmc,发现在master上有很多堵塞线程,都在做锁相关线程。 查看相关的线程信息发现是在做类加载。Master撑不住,需要把锁独立出来。 线程信息-1 …

EmguCV学习笔记 VB.Net 6.1 边缘检测

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

Docker中镜像文件的打包传输、容器导出镜像及虚拟机端口映射的实现

内网私有仓库 1、Docker 私有仓库 是集中存放镜像的地⽅,⽽注册服务器 (Registry)是存放仓库的具体服务器。仓库可以被认为是⼀个具体 的项⽬或⽬录。 Docker 公共仓库:https://hub.docker.com 2、Docker 私有仓库的作⽤&#…