在vue3+ts+vite中使用svg图片

news2025/1/15 12:52:01

目录

前言

步骤

1.安装svg-sprite-loader,这里使用的是6.0.11版本

2.项目的svg图片存放在src/icons下,我们在这里创建两个文件index.ts和index.vue(在哪创建和文件名字并没有任何要求)

 3.在index.ts中加入下列代码(如果报错找不到fs模块请跳转到文章末尾 附录-导入@type/node)

4.在svgIcon.vue中加入下列代码

5.在src/main.ts导入组件

6.在vite.config.ts中导入index.ts,在defineConfig()中加入createSvg(),如下所示

7.配置完毕,我们可以用以下方式导入自己的svg图片

附录-导入@type/node


前言

SVG(Scalable Vector Graphics)是一种用于描述二维矢量图像的XML语言。它可以实现图像的高质量缩放和无损放大,因此被广泛应用于Web开发和图形设计领域。

SVG的优点之一是它具有跨平台和跨浏览器的兼容性。由于SVG图像是基于XML的,所以可以在任何支持SVG的浏览器中进行渲染和显示。这使得开发人员能够创建只需一次编码就能在各种设备上完美呈现的图像。

与其他图像格式(如JPEG和PNG)相比,SVG的文件大小较小,因为它使用的是矢量图形而不是像素。这意味着SVG图像可以无损放大或缩小,而不会失真。这对于需要在不同屏幕尺寸和分辨率上显示一致的图像非常有用。

SVG提供了丰富的绘图和动画功能,可以通过CSS或JavaScript进行样式和交互控制。使用SVG,开发人员可以创建复杂的图形、图表和动态效果,以及响应用户事件和用户界面交互。

在使用SVG时,可以直接编写SVG标记或使用专业的图形编辑工具生成SVG文件。SVG标签可以用于绘制各种形状,例如线条、矩形、圆形、椭圆和路径。此外,SVG还支持渐变、滤镜、文字和图像嵌入等功能,使得图像呈现更加丰富和多样化。

除了静态图像,SVG还可以用于创建动画效果。通过使用SVG的内置动画元素和事件处理,可以实现平滑的过渡、旋转、缩放和颜色变换等效果。这使得SVG成为创建交互式和动态图像的理想选择。

总之,SVG是一种强大的图像格式,适用于各种场景,包括图形设计、数据可视化、动态图像和Web应用程序等。它的优势在于可伸缩性、跨平台兼容性和丰富的绘图和动画功能。无论是您希望创建静态图像还是交互式动画,SVG都是一个值得考虑的选择。

步骤

1.安装svg-sprite-loader,这里使用的是6.0.11版本

npm install svg-sprite-loader

2.项目的svg图片存放在src/icons下,我们在这里创建两个文件index.ts和index.vue(在哪创建和文件名字并没有任何要求)

 3.在index.ts中加入下列代码(如果报错找不到fs模块请跳转到文章末尾 附录-导入@type/node)

import { readFileSync, readdirSync } from "fs";
let idPerfix = "";
const svgTitle = /<svg([^>+].*?)>/;
const clearHeightWidth = /(width|height)="([^>+].*?)"/g;
const hasViewBox = /(viewBox="[^>+].*?")/g;
const clearReturn = /(\r)|(\n)/g;
// 查找svg文件
function svgFind(e) {
    const arr = [];
    const dirents = readdirSync(e, { withFileTypes: true });
    for (const dirent of dirents) {
        if (dirent.isDirectory()) arr.push(...svgFind(e + dirent.name + "/"));
        else {
            const svg = readFileSync(e + dirent.name)
                .toString()
                .replace(clearReturn, "")
                .replace(svgTitle, ($1, $2) => {
                    let width = 0,
                        height = 0,
                        content = $2.replace(clearHeightWidth, (s1, s2, s3) => {
                            if (s2 === "width") width = s3;
                            else if (s2 === "height") height = s3;
                            return "";
                        });
                    if (!hasViewBox.test($2))
                        content += `viewBox="0 0 ${width} ${height}"`;
                    return `<symbol id="${idPerfix}-${dirent.name.replace(
                        ".svg",
                        ""
                    )}" ${content}>`;
                })
                .replace("</svg>", "</symbol>");
            arr.push(svg);
        }
    }
    return arr;
}
// 生成svg
export const createSvg = (path: any, perfix = "icon") => {
    if (path === "") return;
    idPerfix = perfix;
    const res = svgFind(path);
    return {
        name: "svg-transform",
        transformIndexHtml(dom: String) {
            return dom.replace(
                "<body>",
                `<body><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="position: absolute; width: 0; height: 0">${res.join(
                    ""
                )}</svg>`
            );
        },
    };
};

4.在svgIcon.vue中加入下列代码

<template>
  <svg :class="svgClass" v-bind="$attrs" :style="{ color: color, fontSize: size }">
    <use :href="iconName"></use>
  </svg>
</template>
​
<script setup lang="ts">
import { computed } from "vue";
const props = defineProps({
  name: {
    type: String,
    required: true,
  },
  color: {
    type: String,
    default: "",
  },
  size: {
    type: Number,
  },
});
const iconName = computed(() => `#icon-${props.name}`);
const svgClass = computed(() => {
  if (props.name) return `svg-icon icon-${props.name}`;
  return "svg-icon";
});
</script>
​
<style scoped>
.svg-icon {
  width: 1em;
  height: 1em;
  fill: currentColor;
  vertical-align: middle;
}
</style>

5.在src/main.ts导入组件

import { createApp } from "vue";
import App from "./App.vue";
​
import svgIcon from "@/icons/index.vue";
​
createApp(App)
    .component('svg-icon', svgIcon)
    .mount("#app");

6.在vite.config.ts中导入index.ts,在defineConfig()中加入createSvg(),如下所示

import { fileURLToPath, URL } from "node:url";
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
​
//这里会报svgIcon.ts不在tsconfig.config.json文件列表中,在tsconfig.config.json的include里加
//"./src/icons/svgIcon.ts"就行,不加对npm run dev没影响
import { createSvg } from "./src/icons/index";
​
// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue(), createSvg('./src/icons/svg/')],
  resolve: {
    alias: {
      "@": fileURLToPath(new URL("./src", import.meta.url)),
    },
  },
});

tsconfig.node.json配置

{
  "compilerOptions": {
    "composite": true,
    "skipLibCheck": true,
    "module": "ESNext",
    "moduleResolution": "bundler",
    "allowSyntheticDefaultImports": true
  },
  "include": ["vite.config.ts","src/icons/"]
}

7.配置完毕,我们可以用以下方式导入自己的svg图片

   <svg-icon
        :name="你自己的svg文件名"
        class="svg-container"
        :size="48"
        :color="active == item.path ? '#253FE4' : '#A8B2F4'"
   ></svg-icon>

注意 svg文件 删除所有fill字段 反之可能导致颜色不生效(示例)

<svg width="48" height="48" viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg">
<g id="&#232;&#174;&#190;&#229;&#164;&#135;&#231;&#138;&#182;&#230;&#128;&#129; 1">
<rect width="48" height="48" rx="8"  />
<path id="Vector" d="M33.4286 12H14.5714C13.8894 12 13.2354 12.2709 12.7532 12.7532C12.2709 13.2354 12 13.8894 12 14.5714V30C12 30.682 12.2709 31.336 12.7532 31.8183C13.2354 32.3005 13.8894 32.5714 14.5714 32.5714H23.1429V34.2857H17.1429C16.9155 34.2857 16.6975 34.376 16.5368 34.5368C16.376 34.6975 16.2857 34.9155 16.2857 35.1429C16.2857 35.3702 16.376 35.5882 16.5368 35.7489C16.6975 35.9097 16.9155 36 17.1429 36H30.8571C31.0845 36 31.3025 35.9097 31.4632 35.7489C31.624 35.5882 31.7143 35.3702 31.7143 35.1429C31.7143 34.9155 31.624 34.6975 31.4632 34.5368C31.3025 34.376 31.0845 34.2857 30.8571 34.2857H24.8571V32.5714H33.4286C34.1106 32.5714 34.7646 32.3005 35.2468 31.8183C35.7291 31.336 36 30.682 36 30V14.5714C36 13.8894 35.7291 13.2354 35.2468 12.7532C34.7646 12.2709 34.1106 12 33.4286 12ZM14.5714 13.7143H33.4286C33.6559 13.7143 33.8739 13.8046 34.0347 13.9653C34.1954 14.1261 34.2857 14.3441 34.2857 14.5714V26.5714H13.7143V14.5714C13.7143 14.3441 13.8046 14.1261 13.9653 13.9653C14.1261 13.8046 14.3441 13.7143 14.5714 13.7143ZM34.2857 30C34.2857 30.2273 34.1954 30.4453 34.0347 30.6061C33.8739 30.7668 33.6559 30.8571 33.4286 30.8571H14.5714C14.3441 30.8571 14.1261 30.7668 13.9653 30.6061C13.8046 30.4453 13.7143 30.2273 13.7143 30V28.2857H34.2857V30Z" fill="white"/>
</g>
</svg>

 

附录-导入@type/node

1.安装@type/node

npm install @types/node

2.在tscongfig.json中加入"types": ["node"],如下所示

{
  "extends": "@vue/tsconfig/tsconfig.web.json",
  "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"]
    },
    "types": ["node"]
  },

  "references": [
    {
      "path": "./tsconfig.config.json"
    }
  ]
}

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

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

相关文章

Redis的基本操作

文章目录 1.Redis简介2.Redis的常用数据类型3.Redis的常用命令1.字符串操作命令2.哈希操作命令3.列表操作命令4.集合操作命令5.有序集合操作命令6.通用操作命令 4.Springboot配置Redis1.导入SpringDataRedis的Maven坐标2.配置Redis的数据源3.编写配置类&#xff0c;创还能Redis…

ubuntu修改默认文件权限umask

最近在使用ubuntu的过程中发现一个问题&#xff1a; 环境是AWS EC2&#xff0c;登录用户ubuntu&#xff0c;系统默认的umask是027&#xff0c;修改/etc/profile文件中umask 027为022后&#xff0c;发现从ubuntu用户sudo su过去root用户登录查询到的umask还是027&#xff0c;而…

2023-8-22 单调栈

题目链接&#xff1a;单调栈 #include <iostream>using namespace std;const int N 100010;int n; int stk[N], tt;int main() {cin >> n;for(int i 0; i < n; i ){int x;cin >> x;while(tt && stk[tt] > x) tt--;if(tt) cout << st…

第十章,搜索模块

10.1添加搜索框 <template><div class="navbar-form navbar-left hidden-sm"><div class="form-group"><inputv-model.trim="value"type="text"class="form-control search-input mac-style"placeho…

数据传输过程

2 数据传输过程 了解网络中常用的分层模型后&#xff0c;现在来学习一下数据在各层之间是如何传输的。 2.1数据封装与解封装过程(一) 下面我们将以TCP/IP五层结构为基础来学习数据在网络中传输的“真相”。由于这个过程比较 抽象&#xff0c;我们可以类比给远在美国的朋友邮寄…

人工智能深度估计技术

人工智障&#xff08;能&#xff09;走起&#xff01;&#xff01;&#xff01; 下面是基本操作&#xff1a; 在Hugging Face网页中找到Depth Estimation的model&#xff0c;如下图&#xff1a; Hugging Face – The AI community building the future. &#xff08;上Huggin…

从自动驾驶到智能助理:AI和ML技术的革命性应用与前景

人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;的快速发展正在改变我们的世界。它们以惊人的速度渗透到各个领域&#xff0c;从自动驾驶汽车到智能助理、语音识别和自然语言处理等。AI和ML技术的应用范围和影响力越来越广泛&#xff0c;为我们的日常…

SpringMVC拦截器学习笔记

SpringMVC拦截器 拦截器知识 拦截器(Interceptor)用于对URL请求进行前置/后置过滤 Interceptor与Filter用途相似但实现方式不同 Interceptor底层就是基于Spring AOP面向切面编程实现 拦截器开发流程 Maven添加依赖包servlet-api <dependency><groupId>javax.se…

【Rust】Rust学习 第十八章模式用来匹配值的结构

模式是 Rust 中特殊的语法&#xff0c;它用来匹配类型中的结构&#xff0c;无论类型是简单还是复杂。结合使用模式和 match 表达式以及其他结构可以提供更多对程序控制流的支配权。模式由如下一些内容组合而成&#xff1a; 字面值解构的数组、枚举、结构体或者元组变量通配符占…

CSS笔记

介绍 CSS导入方式 三种方法都将文字设置成了红色 CSS选择器 元素选择器 id选择器 图中div将颜色控制为红色&#xff0c;#name将颜色控制为蓝色&#xff0c;谁控制的范围最小&#xff0c;谁就生效&#xff0c;所以第二个div是蓝色的。id属性值要唯一&#xff0c;否则报错。 clas…

【STM32RT-Thread零基础入门】 6. 线程创建应用(线程挂起与恢复)

硬件&#xff1a;STM32F103ZET6、ST-LINK、usb转串口工具、4个LED灯、1个蜂鸣器、4个1k电阻、2个按键、面包板、杜邦线 文章目录 前言一、RT-Thread相关接口函数1. 挂起线程2. 恢复线程 二、程序设计1. car_led.c2.car_led.h3. main.c 三、程序测试总结 前言 在上一个任务中&a…

Mysql group by使用示例

文章目录 1. groupby时不能查询*2. 查询出的列必须在group by的条件列中3. group by多个字段&#xff0c;这些字段都有索引也会索引失效&#xff0c;只有group by单个字段索引才能起作用4. having条件必须跟group by相关联5. 用group by做去重6. 使用聚合函数做数量统计7. havi…

ShardingSphere02-MySQL主从同步配置

1、MySQL主从同步原理 基本原理&#xff1a; slave会从master读取binlog来进行数据同步 具体步骤&#xff1a; step1&#xff1a;master将数据改变记录到二进制日志&#xff08;binary log&#xff09;中。step2&#xff1a; 当slave上执行 start slave 命令之后&#xff0c…

mysql------做主从复制,读写分离

1.为什么要做主从复制&#xff08;主从复制的作用&#xff09; 做数据的热备&#xff0c;作为后备数据库&#xff0c;主数据库服务器故障后&#xff0c;可切换到从数据库继续工作&#xff0c;避免数据丢失。 架构的扩展。业务量越来越大,I/O访问频率过高&#xff0c;单机无法满…

matlab面向对象

一、面向对象编程 1.1 面向过程与面向对象 区别&#xff1a; 面向过程的核心是一系列函数&#xff0c;执行过程是依次使用每个函数面向对象的核心是对象&#xff08;类&#xff09;及其属性、方法&#xff0c;每个对象根据需求执行自己的方法以解决问题 对象&#xff1a;单个…

JAVA 读取jar包中excel模板

1、在resources路径下&#xff0c;新建report文件夹&#xff0c;放入excel模板 2、配置文件中的目录&#xff0c;分隔符使用 / template: /report/报告模板V1.0.xlsx3、使用getResourceAsStream()读取 XSSFWorkbook wb;try {//需要以/开始InputStream resourceAsStream this.g…

中国芯,寻找新赛道迫在眉睫

北京华兴万邦管理咨询有限公司 商瑞 陈皓 近期国内半导体行业的热点可以用两个“有点多”来描述&#xff0c;一个是中国芯群体中上市公司股价闪崩的有点多&#xff0c;另一个是行业和企业的活动有点多。前者说明了许多国内芯片设计企业&#xff08;fabless商业模式&#xff09;…

怎么去选消息队列? Kafka vs. RabbitMQ

在上周&#xff0c;我们讨论了使用消息队列的好处。然后我们回顾了消息队列产品的发展历史。如今&#xff0c;在项目中需要使用消息队列时&#xff0c;Apache Kafka似乎是首选产品。然而&#xff0c;考虑到特定需求时&#xff0c;它并不总是最佳选择。 基于数据库的队列 让我们…

【由于无法验证发布者,所以 windozs 已经阳止此软件。】

由于无法验证发布者&#xff0c;所以 windozs 已经阳止此软件。 由于无法验证发布者&#xff0c;所以 windozs 已经阳止此软件。IE点击【Internet选项】在打开Internet选项的对话框中&#xff0c;点击“安全”选项卡在打开的新窗口中点击“受信任的站点”图标&#xff0c;然后点…

Linux查看文本内容的一些技巧

Linux查看文本内容的一些技巧 headtailcat输出filename.txt中第二列的内容awkcutvimdiff abc.txt def.txt 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语…