vue3+vite:封装Svg组件

前言

在项目开发过程中,以svg图片引入时,会遇到当hover态时图片颜色修改的场景,我们可能需要去引入另一张不同颜色的svg图片,或者用css方式修改,为了方便这种情况,需要封装svg组件来自定义宽高和颜色,优化使用。

1. 什么是SVG

SVG (Scalable Vector Graphics) 是一种基于 XML 的矢量图形格式,用于描述二维图形和图像。与传统的栅格图像(如 JPEG、PNG)不同,SVG 使用数学公式来定义图形,因此可以无损地进行缩放和放大,并保持图像的清晰度和质量。
以下是一些关于 SVG 的特点和用途:

  • 矢量图形:SVG 使用几何形状、路径和文本对象来描述图形。这些对象可以通过调整大小、平移和变换等操作进行精确控制,而不会像栅格图像一样失真。
  • 可伸缩性:SVG 图形可以根据需要进行任意大小的缩放,而不会损失图像的清晰度。这使得 SVG 在不同的设备分辨率和屏幕尺寸下都能保持良好的呈现效果。
  • 文本支持:除了图形,SVG 还支持添加文本元素,可以在图形中嵌入文本内容,比如标题、标签、图例等。
  • 动画和交互性:SVG 支持通过 CSS、JavaScript 或 SMIL(Synchronized Multimedia Integration Language)实现动画效果和交互特性。可以使用这些技术为 SVG 图形添加动态效果、响应用户操作和实现无缝的用户体验。
  • Web 标准:SVG 是 Web 标准之一,被广泛支持和应用于各种 Web 技术中,包括网页设计、图标制作、数据可视化和交互式图形。

SVG 图像可以在各种图像编辑器(如 Adobe Illustrator、Inkscape)中创建和编辑,并嵌入到 HTML 文件中进行展示。通过 CSS 和 JavaScript,SVG 图像可以与网页的其他元素和样式进行集成和调整。

2. 封装Svg组件

2.1 方式一:vite-plugin-svg-icons

vite-plugin-svg-icons 是一个 Vite 插件,用于在 Vite 2 项目中方便地使用 SVG 图标。它可以自动将 SVG 图标文件转换为 Vue 组件,并且提供了一些配置选项来自定义生成的组件。
具体来说,vite-plugin-svg-icons 提供了以下功能:

  • 自动转换:当你将 SVG 文件放置在指定目录下时,插件会自动将它们转换为可用的 Vue 组件。你无需手动处理 SVG 文件转换的步骤,这样可以节省开发时间。
  • 自动导入:一旦 SVG 文件被转换为 Vue 组件,它们会被自动导入到你的项目中。你只需要在代码中使用这些组件即可,无需手动导入每个 SVG 文件。
  • 优化输出:插件会对 SVG 图标进行优化,包括移除冗余信息、压缩文件大小等。这样可以减少加载时间,并改善性能。
    vite-plugin-svg-icons官网
    使用步骤:
  1. 安装 vite-plugin-svg-icons:
npm install vite-plugin-svg-icons -D
  1. 在 vite 配置文件中添加插件
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { createSvgIconsPlugin } from "vite-plugin-svg-icons";
import path from "path";
export default defineConfig({
  plugins: [
    vue(),
    createSvgIconsPlugin({
      // 指定目录(svg存放目录)
      iconDirs: [path.resolve(process.cwd(), "src/assets/svgs")],
      // 使用 svg 图标的格式(name为图片名称)
      symbolId: "icon-[name]",
      //生成组件插入位置 只有两个值 boby-last | body-first
      inject: 'body-last'
    })
  ],
})
  1. 在main.ts文件中全局导入
import 'virtual:svg-icons-register';
  1. 封装svg组件
    封装svg组件,可修改宽高和颜色
<template>
  <svg
      aria-hidden="true"
      :width="width"
      :height="height"
      :fill="color"
  >
      <use :xlink:href="`#icon-${name}`"/>
  </svg>
</template>
<script setup lang="ts">
  defineProps<{
    name: string,
    width: string,
    height: string,
    color?: string
  }>();
</script>
  1. 使用
<template>
  <SvgIcon name="close" width="24" height="24"></SvgIcon>
  </template>
  <script setup>
  import SvgIcon from "@/components/svg-icon/svg-icon.vue";
</script>

问题:
● vite-plugin-svg-icons插件自动封装的组件只能选择插入到body前或后
在这里插入图片描述
如果项目中某个部分使用了shadow-dom,由于样式隔离的问题,使用svg组件不显示
解决:通过id(如上图为__svg__icons__dom)获取插件自动封装的组件dom元素,插入到shodaw-dom下即可解决

● 原本svg图片的宽高失效,需要重新设置宽高,而且不能直接改变颜色,想要改变颜色必须修改原svg图片,将其fill属性删掉或者置为空(“”)

2.2 方式二:通过css属性

CSS 中的 mask 属性用于创建遮罩效果,它可以通过另一个图像或者 SVG 图像来定义遮罩的形状。mask 属性可以应用于任何可视元素,并将遮罩应用于元素的内容和背景。
mask属性详情

<template>
  <div
      class="bot-svg-icon"
      :style="svgStyle"
  ></div>
</template>
<script setup lang="ts">
import {computed, ref} from 'vue';
const props = withDefaults(defineProps<{
    url: string,
    width: string|number,
    height: string|number,
    color?: string,
}>(), {
    color: 'var(--bot-color-black-1)',
});
const svgStyle = computed(() => ({
    width: props.width + 'px',
    height: props.height + 'px',
    backgroundColor: props.color
    maskImage: `url(${props.url})`,
}));

</script>

<style scoped>
.bot-svg-icon {
    display: inline-block;
    mask-repeat: no-repeat;
    mask-size: cover;
}
</style>

问题:原本的svg图片宽高失效,需要重新设置宽高,但是可以不用修改原svg文件就可改变颜色。

3. 其他问题

动态导入地址导致的问题:在本地图片显示正常,打包后部署,图片不能显示,如下例:

//第一种情况:在html中时候,本地运行和打包后线上运行都ok。
<img src="@/assets/close.svg" alt="" >

//第二种情况:用动态数据,本地运行ok,打包后线上运行不显示
const path = "@/assets/close.svg";
// 如果是vue3+webpack可以使用require引入,但vite没有require
<img :src="path">

// 第三种情况:用动态数据且本地和线上访问都可显示
const path = new URL("@/assets/close.svg", import.meta.url).href;
<img :src="path">

// 第四种情况:用动态数据且本地和线上访问都可显示
import close from "@/assets/close.svg";
<img :src="close">

参考vite官方文档:静态资源处理

参考文章:
https://juejin.cn/post/7261914349726597181

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(3)【Python数据分析进阶】Machine-Learning模型与算法应用-线性回归与逻辑回归

目录 一、Linear Regression线性回归应用 应用案例&#xff08;一&#xff09;——自定义数据&#xff08;Custom data&#xff09; 1、下载安装sklearn库 2、导入库函数 3、加载数据集 4、创建线性回归对象 5、模型训练 6、预测结果 7、绘制模型图像 8、应用模型进行…

Python小项目:还在为备份烦恼?这个tkinter项目帮你解决!

文章目录 1 引言2 Tkinter概览3 设计备份软件的界面4 文件夹选择逻辑5 备份方案介绍5.1 完全备份5.2 增量备份5.3 镜像备份 完整代码&#xff1a; import tkinter as tk from tkinter import filedialog, messagebox import os import shutil import filecmpdef choose_source(…

【K8S 云原生】K8S的对外服务—ingress

目录 一、K8S的Service 1、Service的作用 2、Service类型&#xff1a; 二、ingress 1、ingress的组成&#xff1a; 2、ingress资源的定义项&#xff1a; 三、nginx-ingress-controller暴露服务端的方式 1、DeploymentLoadBalancer模式&#xff1a; 1、工作流程图&…

vector讲解

在学习玩string后我们开始学习vector&#xff0c;本篇博客将对vector进行简单的介绍&#xff0c;还会对vector一些常用的函数进行讲解 vector的介绍 实际上vector就是一个数组的数据结构&#xff0c;但是vector是由C编写而成的&#xff0c;他和数组也有本质上的区别&#xff…

pandas操作excel

目录 一&#xff1a;创建excel 二&#xff1a;修改excel 三&#xff1a;查找excel 四&#xff1a;删除数据 五&#xff1a;合并excel数据 一&#xff1a;创建excel import pandas as pd # 创建DataFrame对象 data { Name: [Alice, Bob, Charlie], Age: [25, 30, 35], S…

ISA Server 2006部署网站对比nginx

2024年了&#xff0c;我还是第1次使用ISA Server 。没办法在维护一个非常古老的项目。说到ISA Server可能有小伙们不清楚&#xff0c;但是说到nginx大家应该都知道吧。虽然他们俩定位并不相同&#xff0c;但是本文中提到的需求&#xff0c;他俩是都可以实现。 网上找的到的教程…

力扣:(692. 前K个高频单词)

题目1&#xff1a; 题目链接 思路1&#xff1a;首先可以使用map来统计单词出现的次数。然后使用vector将pair存起来&#xff0c;接着使用stable_sort排序(要保证数据具有稳定性)&#xff0c;然后返回前k个单词即可。 难点&#xff1a;需要写一个比较函数&#xff08;仿函数&am…

SAP S/4HANA 2023 Fully-Activated Appliance 虚拟机版介绍

注&#xff1a;市面上所有在售虚拟机均为拷贝本人所作的虚拟机&#xff0c;存在各种技术问题&#xff0c;请知悉。 SAP S4HANA 2023 FAA版本内置了四个Client&#xff1a; 1、000&#xff1a;SAP初始Client&#xff0c;原则上不能动&#xff1b; 2、100&#xff1a;只激活了US…

java SSM网上小卖部管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM网上小卖部管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源 代码和数据库&#xff0c;系统主要…

【Docker篇】详细讲解容器相关命令

&#x1f38a;专栏【Docker】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f6f8;容器&#x1f339;相关命令&#x1f354;案例⭐创建并运…

WorkPlus Meet私有化视频会议软件-构建安全高效的内网会议体验

在企业内部&#xff0c;高效的会议协作是推动团队协同和工作效率的关键。而内网会议系统成为了构建安全高效的内部会议体验的必要工具。作为一家领先的内网会议系统&#xff0c;WorkPlus Meet以其卓越的性能和智能化的功能&#xff0c;助力企业实现高效安全的内部会议体验。 为…

GPU与SSD间的P2P DMA访问机制

基于PCIe&#xff08;Peripheral Component Interconnect Express&#xff09;总线连接CPU、独立GPU和NVMe SSD的系统架构。 在该架构中&#xff0c;PCIe Swicth支持GPU与SSD之间快速的点对点直接内存访问&#xff08;peer-to-peer, p2p DMA&#xff09;。通常情况下&#xff0…

详细版Git的下载安装与配置(Windows)

一、git的下载 Git是一个非常好用的版本控制工具。下载地址如下&#xff1a;Git - Downloads。建议使用国内浏览器下载&#xff0c;因为不用翻墙&#xff0c;速度快。 当你用浏览器去访问上面的地址后&#xff0c;下载页面会自动识别你的电脑系统&#xff0c;如下 点击&#…

RHEL - 为网络隔离主机构建本地软件 Repo

《OpenShift / RHEL / DevSecOps 汇总目录》 文章目录 构建本地共享软件 Repo 的方法说明准备可联网主机方法1&#xff1a;使用 ISO 制作本地共享 Repo方法2&#xff1a;使用 reposync 制作本地共享 Repo方法3&#xff1a;制作包含特定软件的本地独享 Repo方法4&#xff1a;使用…

electron-vite中的ipc通信

1. 概述 再electron中&#xff0c;进程间的通信通过ipcMain和ipcRenderer模块&#xff0c;这些通道是任意和双向的 1.1. 什么是上下文隔离进程 ipc通道是通过预加载脚本绑定到window对象的electron对象属性上的 2. 通信方式 2.1. ipcMain&#xff08;也就是渲染进程向主进…

WorkPlus内网通信软件的首选,助力企业实现高效内部沟通与协同

在企业内部&#xff0c;高效沟通是推动工作顺利进行的关键。而内网通信软件则成为了营造安全高效内部沟通环境的必要工具。作为一家领先的内网通信软件&#xff0c;WorkPlus以其卓越的性能和专业的功能&#xff0c;助力企业构建高效的内部沟通网络。 为什么选择WorkPlus作为内…

【Docker】部署和运行青龙面板:一个支持python3、javaScript、shell、typescript 的定时任务管理面板

引言 青龙面板是一个支持python3、javaScript、shell、typescript 的定时任务管理面板。 步骤 拉取镜像 从 Docker Hub 上拉取最新的 “qinglong” 镜像。 docker pull whyour/qinglong:latest启动容器 使用刚刚拉取的镜像来启动一个新的 Docker 容器。 docker run -dit \-v…

Java设计模式-前言

大家好&#xff0c;我是馆长&#xff01;从今天开始馆长开始对java设计模式进行讲解和整理分享给大家。馆长会尽快的整理完成设计模式的所有内容和讲解代码。从多方面进行模式的详细说明&#xff0c;方便各位看官理解和易学。 软件设计模式的概念 软件设计模式&#xff08;Sof…

Tensorflow2 GPU版本-极简安装方式

Tensorflow2 GPU版本-极简安装方式&#xff1a; 1、配置conda环境加速 https://wtl4it.blog.csdn.net/article/details/135723095https://wtl4it.blog.csdn.net/article/details/135723095 2、tensorflow-gpu安装 conda create -n STZZWANG_TF2 tensorflow-gpu2.0

11 - PXC集群|MySQL存储引擎

PXC集群&#xff5c;MySQL存储引擎 数据库系列文章PXC集群配置集群测试集群 MySQL存储引擎存储引擎介绍mysql服务体系结构mysql服务的工作过程处理查询访问的工作过程处理存储insert访问的工作过程 什么是搜索引擎 存储引擎管理查看存储引擎修改存储引擎 存储引擎特点myisam存储…