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

目录

前言

步骤

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"
    }
  ]
}

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

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

相关文章

飞天使-k8s基础组件分析-控制器

文章目录 控制器含义解释pod的标签与注释ReplicaControllerReplicaSetDeploymentsDaemonSetJobCronjob参考文档 控制器含义解释 空调遥控器知道吧ReplicationController: ReplicationController确保在任何时候都运行指定数量的pod副本。换句话说&#xff0c;一个ReplicationCo…

无涯教程-Perl - wantarray函数

描述 如果当前正在执行的函数的context正在寻找列表值,则此函数返回true。在标量context中返回false。 语法 以下是此函数的简单语法- wantarray返回值 如果没有context,则此函数返回undef&#xff1b;如果lvalue需要标量,则该函数返回0。 例 以下是显示其基本用法的示例…

3种获取OpenStreetMap数据的方法【OSM】

OpenStreetMap 是每个人都可以编辑的世界地图。 这意味着你可以纠正错误、添加新地点&#xff0c;甚至自己为地图做出贡献&#xff01; 这是一个社区驱动的项目&#xff0c;拥有数百万注册用户。 这是一个社区驱动的项目&#xff0c;旨在在开放许可下向每个人提供所有地理数据。…

Centos 7 安装系列(8):openGauss 3.0.0

安装依赖包&#xff1a; yum -y install libaio-devel flex bison ncurses-devel glibc-devel patch redhat-lsb-core readline-devel openssl-devel sqlite-devel libnsl 安装插件&#xff1a; yum install -y bzip2 net-tools为什么要安装这两个&#xff1f; 安装bzip2 是…

SSRF 服务器端请求伪造

文章目录 SSRF(curl)网址访问通过file协议访问本地文件dict协议扫描内网主机开放端口 SSRF(file_get_content)网站访问http协议请求内网资源通过file协议访问本地文件 SSRF(Server-Side Request Forgery:服务器端请求伪造) 其形成的原因大都是由于服务端提供了从其他服务器应用…

三、MySQL 数据库安装集

一、CentOS—YUM 1. MySQL—卸载 # 1、查看存在的MySQL。 rpm -qa | grep -i mysql rpm -qa | grep mysql# 2、删除存在的MySQL。 rpm -e –-nodeps 包名# 3、查找存在的MySQL目录。 find / -name mysql# 4、删除存在的MySQL目录。 rm -rf 目录# 5、删除存在的MySQL配置文件。…

TCP/IP---网络层

一、网络层的主要功能 1、提供了通讯过程中&#xff0c;必须要使用的另一个地址&#xff1a;逻辑IP地址【ipv4、ipv6】 2、连接不同媒介类型【内网--外网&#xff08;intra -- inter&#xff09;】 3、根据运行的不同的路由协议&#xff0c;选择不同的最佳路径 4、在选择的最好…

【数据结构与算法】迪杰斯特拉算法

迪杰斯特拉算法 介绍 迪杰斯特拉&#xff08;Dijkstra&#xff09;算法是典型最短路径算法&#xff0c;用于计算一个节点到其他节点的最短路径。它的主要特点是以中心向外层层扩展&#xff08;广度优先搜索思想&#xff09;&#xff0c;直到扩展到终点为止。 算法过程 设置…

微信小程序 车牌号输入组件

概述 一个小组件&#xff0c;用于方便用户输入车牌号码 详细 概述 有时候我们开发过程中会遇到需要用户输入车牌号的情况&#xff0c;让客户通过自带键盘输入&#xff0c;体验不好且容易出错&#xff0c;例如车牌号是不能输入O和I的&#xff0c;因此需要有一个自定义的键盘…

2023/8/16 华为云OCR识别驾驶证、行驶证

目录 一、 注册华为云账号开通识别驾驶证、行驶证服务 二、编写配置文件 2.1、配置秘钥 2.2、 编写配置工具类 三、接口测试 3.1、测试接口 3.2、结果 四、实际工作中遇到的问题 4.1、前端传值问题 4.2、后端获取数据问题 4.3、使用openfeign调用接口报错 4.3、前端显示问题…

SQL 语句继续学习之记录二

三&#xff0c; 聚合与排序 对表进行聚合查询&#xff0c;即使用聚合函数对表中的列进行合计值或者平均值等合计操作。 通常&#xff0c;聚合函数会对null以外的对象进行合计。但是只有count 函数例外&#xff0c;使用count(*) 可以查出包含null在内的全部数据行数。 使用dis…

javeee eclipse项目导入idea中

步骤一 复制项目到idea工作空间 步骤二 在idea中导入项目 步骤三 配置classes目录 步骤四 配置lib目录 步骤五 添加tomcat依赖 步骤六 添加artifacts 步骤七 部署到tomcat

数学建模-模型详解(2)

微分模型 当谈到微分模型时&#xff0c;通常指的是使用微分方程来描述某个系统的动态行为。微分方程是描述变量之间变化率的数学方程。微分模型可以用于解决各种实际问题&#xff0c;例如物理学、工程学、生物学等领域。 微分模型可以分为两类&#xff1a;常微分方程和偏微分…

【计算机网络】日志与守护进程

文章目录 日志日志的创建logmessage 函数日志左边部分实现日志右边部分实现 完整代码log.hpp(整体实现)err.hpp (错误信息枚举&#xff09; 守护进程PGID SID TTY 的介绍shell中控制进程组的方式结论 为什么要有守护进程存在&#xff1f;守护进程的创建使用守护进程的条件守护进…

Tomcat线程池梳理

Tomcat梳理 文章目录 Tomcat梳理1.问题2.监控tomcat线程池springboot1.xspringboot2.x转为json格式打印输出 3.SpringBoot内置线程解析测试controlleryaml配置可知ThreadPoolExecutor有如下五种线程池状态。线程池监控指标并发测试并发请求数 < Tomcat最大线程数20并发请求数…

聊聊 Docker

聊聊 Docker Docker 是什么&#xff1f; 定义 Docker 是一款 开源的应用容器引擎。 简单来说&#xff0c;就是 以容器虚拟化技术为基础的软件。可以把应用程序和所依赖的包一起打包到一个可移植的镜像中&#xff0c;发布到 Linux 或者 Windows 上运行。&#xff08;代码 运…

从零开始学习YOLOv5 保姆级教程

一、前言 YOLO系列是one-stage且是基于深度学习的回归方法&#xff0c;而R-CNN、Fast-RCNN、Faster-RCNN等是two-stage且是基于深度学习的分类方法。 YOLOv5是一种单阶段目标检测算法&#xff0c;该算法在YOLOv4的基础上添加了一些新的改进思路&#xff0c;使其速度与精度都得…

使用 wxPython 和 pymupdf进行 PDF 加密

PDF 文件是一种常见的文档格式&#xff0c;但有时候我们希望对敏感信息进行保护&#xff0c;以防止未经授权的访问。在本文中&#xff0c;我们将使用 Python 和 wxPython 库创建一个简单的图形用户界面&#xff08;GUI&#xff09;应用程序&#xff0c;用于对 PDF 文件进行加密…

Lua之Lua源文件批量转换为luac字节码文件

准备的工具&#xff1a;luac.exe CSDNhttps://mp.csdn.net/mp_download/manage/download/UpDetailed Unity版: using System; using System.Collections; using System.Collections.Generic; using System.IO; using UnityEditor; using UnityEngine;public static class Bat…

前端开发中移动端开发需要注意什么? - 易智编译EaseEditing

在前端开发中&#xff0c;移动端开发具有一些独特的挑战和注意事项。以下是移动端开发时需要注意的一些重要点&#xff1a; 响应式设计&#xff1a; 移动设备的屏幕尺寸和分辨率多样&#xff0c;因此要采用响应式设计&#xff0c;确保你的网站或应用在各种设备上都能良好地呈…