vue3 - 按需导入使用Element Plus图标、iconify图标、本地SVG/PNG图标

GitHub Demo 地址

在线预览

vue3 - 按需导入使用Element Plus图标、iconify图标、本地SVG/PNG图标

      • [GitHub Demo 地址](https://github.com/iotjin/jh-vue3-admin)
      • [在线预览 ](https://iotjin.github.io/jh-vue3-admin)
  • 一、iconify插件
    • 安装
    • 使用
    • 效果图
  • 二、通过自动导入使用iconify
    • 安装Element Plus
    • 安装自动导入插件
    • 安装自动导入 Icon 插件
    • 通过iconify使用Element Plus图标
    • 效果图
    • 通过 UnoCSS,Element Plus 像 Element UI 一样使用 Icon
    • 效果图
  • 三、SVG本地图标
    • 效果图
  • 四、本地PNG图标
    • 效果图

vue项目使用的图标一般有本地的png、svg图标,Element图标,还有就是通过自动导入使用三方库iconify的图标

一、iconify插件

Iconify for Vue 官方文档

Iconify内的 element-plus图标

Iconify 是一个开源的图标集和图标管理工具。它提供了一个庞大的图标库,包含数千个常用图标,涵盖了各种主题和风格,如 Material Design、Font Awesome、Feather 等。这些图标可以以矢量格式(SVG)使用,适用于各种项目,如网站、移动应用、桌面应用等。

安装

npm install --save-dev @iconify/vue

使用

用法

import { Icon } from '@iconify/vue'<!-- https://github.com/iconify/iconify/tree/main/components/vue --><Icon icon="ep:add-location" height="24" /><Icon icon="mdi-light:home" width="16" height="16" /><Icon icon="mdi-light:home" height="24" /><Icon icon="mdi-light:home" height="2em" /><Icon icon="mdi-light:home" height="auto" /><Icon icon="eva:alert-triangle-fill" color="orange" /><Icon icon="eva:alert-triangle-fill" color="#f00" /><div><!-- 水平翻转图标: --><Icon icon="eva:alert-triangle-fill" :h-flip="true" /><Icon icon="eva:alert-triangle-fill" :horizontal-flip="true" /><Icon icon="eva:alert-triangle-fill" flip="horizontal" /><!-- 垂直翻转图标 --><Icon icon="eva:alert-triangle-fill" :v-flip="true" /><Icon icon="eva:alert-triangle-fill" :vertical-flip="true" /><Icon icon="eva:alert-triangle-fill" flip="vertical" /><!-- 水平和垂直翻转图标(与180度旋转相同): --><Icon icon="eva:alert-triangle-fill" :h-flip="true" :v-flip="true" /><Icon icon="eva:alert-triangle-fill" :horizontal-flip="true" :vertical-flip="true" /><Icon icon="eva:alert-triangle-fill" flip="horizontal,vertical" /><!-- 90度旋转的例子: --><Icon icon="eva:alert-triangle-fill" :rotate="1" /><!-- <Icon icon="eva:alert-triangle-fill" rotate="90deg" /><Icon icon="eva:alert-triangle-fill" rotate="25%" /> --></div>

效果图

在这里插入图片描述

二、通过自动导入使用iconify

安装Element Plus

element plus 按需导入 官方文档
element plus 使用icon图标 官方文档

通过element plus使用icon图标,可以通过以下两种方式(本文通过方式2)
1、可以通过命令 npm install @element-plus/icons-vue单独安装icons-vue组件,然后使用
2、也可以通过使用 unplugin-icons 和 unplugin-auto-import 从 iconify 中自动导入任何图标集。 您可以参考此模板。

element plus使用icon图标一般是通过组件的方式使用的,如 <Search />,或者自动导入配置后<i-ep-edit />

npm install element-plus

安装自动导入插件

安装两个按需导入的插件,避免在多个页面重复引入 API 或 组件
unplugin-auto-import 按需自动导入API,如:ref,reactive,watch,computed 等API
unplugin-vue-components 按需自动导入组件,如:Element Plus 等三方库和指定目录下的自定义组件

npm install -D unplugin-auto-import unplugin-vue-components

安装自动导入 Icon 插件

使用 unplugin-iconsunplugin-auto-import 可以从 iconify 中自动导入图标

npm i -D unplugin-icons

vite.config.ts 配置自动导入,新建 /src/types 目录用于存放自动导入函数auto-imports.d.ts和组件的TS类型声明文件components.d.ts

import AutoImport from "unplugin-auto-import/vite";
import Components from "unplugin-vue-components/vite";
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'plugins: [AutoImport({// 自动导入 Vue 相关函数,如:ref, reactive, toRef 等imports: ['vue', '@vueuse/core'],// imports: ['vue', 'vue-router', 'pinia', '@vueuse/core'],eslintrc: {enabled: false, // 是否自动生成 eslint 规则,建议生成之后设置 false,手动维护filepath: './.eslintrc-auto-import.json', // 指定自动导入函数 eslint 规则的文件路径globalsPropValue: true},resolvers: [// 自动导入 Element Plus 相关函数,如:ElMessage, ElMessageBox... (带样式)ElementPlusResolver(),IconsResolver({})],vueTemplate: true,// 配置文件生成位置(false:关闭自动生成)dts: false// dts: 'src/types/auto-imports.d.ts' // 指定自动导入函数TS类型声明文件路径}),Components({resolvers: [// 自动导入 Element Plus 组件ElementPlusResolver(),// 自动导入图标组件IconsResolver({// @iconify-json/ep 是 Element Plus 的图标库enabledCollections: ['ep']})],// 指定自定义组件位置(默认:src/components)dirs: ['src/**/components'],// 配置文件位置(false:关闭自动生成)dts: false// dts: "src/types/components.d.ts",}),Icons({// 自动安装图标库autoInstall: true}),
]

在这里插入图片描述

.eslintrc.cjs 添加自动导入函数 eslint 规则

"extends": ["./.eslintrc-auto-import.json"
]

tsconfig.json 添加自动导入TS类型声明文件

{"include": ["src/**/*.d.ts"]
}

运行项目 npm run dev 查看效果

在这里插入图片描述

通过iconify使用Element Plus图标

<template><h1>iconify 图标:</h1><div><icon1 /><!-- <icon2 /> --><icon3 /></div><div><i-ep-edit /><el-icon :size="19.2" color="#409eff"><i-ep-edit /></el-icon></div>
</template><script setup lang="ts">
// element-plus图标
// https://icon-sets.iconify.design/ep/
import icon1 from '~icons/ep/help-filled'
// import { HelpFilled } from '@element-plus/icons-vue'// 其他的
// https://icon-sets.iconify.design/
// import icon2 from '~icons/mdi/home-clock'
// 动态图标
// https://icon-sets.iconify.design/line-md/
// https://icon-sets.iconify.design/svg-spinners/
import icon3 from '~icons/line-md/home'
</script>

效果图

在这里插入图片描述

通过 UnoCSS,Element Plus 像 Element UI 一样使用 Icon

Vue3!Element Plus 如何像 Element UI 一样使用 Icon?

UnoCSS官网

UnoCSS 是一个具有高性能且极具灵活性的即时原子化 CSS 引擎 ,用于构建响应式网页和应用程序界面。它提供了一套简洁、易于使用的样式类,帮助开发者快速搭建漂亮且功能强大的界面。

npm add -D unocss

vite.config.ts 配置

import UnoCSS from 'unocss/vite'
import { presetIcons } from 'unocss'export default {plugins: [// 配置UnoCSS,使其可以直接使用标签 <i-ep-edit /> | <el-button icon="i-ep-edit" > edit </el-button>// UnoCSS({})UnoCSS({presets: [presetIcons({scale: 1.2,warn: true})],// 以下配置是为了可以直接使用标签 <i-ep-edit /> | <el-button icon="i-ep-edit" > edit </el-button>variants: [{match: (s) => {if (s.startsWith('i-')) {return {matcher: s,selector: (s) => {return s.startsWith('.') ? `${s.slice(1)},${s}` : s}}}}}]})],
}

main.ts 引入 uno.css

import 'uno.css'

示例

    <h2>el-button+图标:</h2><el-button type="primary"><el-icon> <i-ep-edit /> </el-icon> 新增</el-button><el-button type="primary" icon="i-ep-edit"> 新增 </el-button>

效果图

在这里插入图片描述

三、SVG本地图标

通过 vite-plugin-svg-icons 插件使用 Iconfont 第三方图标库实现本地SVG图标展示
vite-plugin-svg-icons 官方文档

npm install -D fast-glob
npm install -D vite-plugin-svg-icons

先指定一个存放svg的路径,如:src/assets/iconssrc/assets/error

vite.config.ts 中配置插件

import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import path from 'path'const resolve = (dir: string) => path.resolve(process.cwd(), dir)plugins: [createSvgIconsPlugin({// 指定需要缓存的图标文件夹iconDirs: [resolve('src/assets/icons'), resolve('src/assets/error')],// iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],// 指定symbolId格式symbolId: 'icon-[dir]-[name]'}),
]

src/main.ts 内引入注册脚本

import 'virtual:svg-icons-register'

封装一个SVG 组件以供项目使用
在src/components/创建SvgIcon文件夹,创建index.vue

<template><svg aria-hidden="true" class="svg-icon" :style="'width:' + size + ';height:' + size"><use :xlink:href="symbolId" :fill="color" /></svg>
</template><script setup lang="ts">
const props = defineProps({prefix: {type: String,default: 'icon'},iconClass: {type: String,required: false,default: ''},color: {type: String,default: ''},size: {type: String,default: '1em'}
})const symbolId = computed(() => `#${props.prefix}-${props.iconClass}`)
</script><style scoped>
.svg-icon {display: inline-block;width: 1em;height: 1em;overflow: hidden;vertical-align: -0.15em; /* 因icon大小被设置为和字体大小一致,而span等标签的下边缘会和字体的基线对齐,故需设置一个往下的偏移比例,来纠正视觉上的未对齐效果 */outline: none;fill: currentcolor; /* 定义元素的颜色,currentColor是一个变量,这个变量的值就表示当前元素的color值,如果当前元素未设置color值,则从父元素继承 */
}
</style>
<template><h1>img SVG本地图片:</h1><svg-icon icon-class="homepage" /><svg-icon icon-class="user" color="red" />
</template><script setup lang="ts">
import SvgIcon from '@/components/SvgIcon/index.vue'
</script>

效果图

在这里插入图片描述

四、本地PNG图标

vue3中使用本地图标和vue2还是有点区别

vue2使用的require,如:<img :src="require('@/assets/test.png')" />

vue3和vite中使用require会报错(require is not definedrequire is not defined),因为requirewebpack提供的方法,在vite中不适用。在vite中,由于使用了 ES modules 的方式来加载模块,因此不能使用 require,而是使用 import

以下是vue3中使用本地PNG图标的方式(调试和线上图标都显示)

<template><h1>img 本地PNG图片:</h1><img src="../../../assets/images/static/icon.png" /><img :src="imgPath2" /><img :src="imgPath3" /><img :src="imgPath4" /><img :src="imgPath5" /><h2>img 本地图片动态导入:</h2><img :src="getImgPath2('icon2.png')" /><img :src="getImgPath3('icon3.png')" />
</template><script setup lang="ts">
import imgPath2 from '@/assets/images/static/icon2.png'
const imgPath3 = getImgPath('icon3.png')
const imgPath4 = new URL(`../../../assets/images/static/icon4.png`, import.meta.url).href
const imgPath5 = new URL(`@/assets/images/static/icon5.png`, import.meta.url).hrefconst getImgPath2 = (name: string): any => {return new URL(`/src/assets/images/static/${name}`, import.meta.url).href
}const getImgPath3 = (name: string): any => {return new URL(`../../../assets/images/static/${name}`, import.meta.url).href
}</script>

效果图

在这里插入图片描述

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

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

相关文章

如何利用React和Sass实现可定制的前端样式

如何利用React和Sass实现可定制的前端样式 引言&#xff1a; React是一种流行的JavaScript库&#xff0c;用于构建用户界面。它提供了组件化的方式来开发复杂的前端应用程序。而Sass是一种CSS预处理器&#xff0c;通过将CSS代码分解为模块&#xff0c;可以更方便地管理和组织样…

AIGC: 区块链与数据安全

随着国家将区块链纳入战略发展规划&#xff0c;数字经济蓬勃发展。近年来&#xff0c;数据的流通成为了实体经济赋能的关键&#xff0c;而在这一过程中&#xff0c;区块链技术和数据安全变得至关重要。 中国已经成为全球最大的数据体&#xff0c;每天产生大量数据。数字经济已…

软件测试人员必须知道的接口测试基础

一、首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。系统对外的接口&#xff1a;比如你要从别的网站或服务器上获取资源或信息&#xff0c;别人肯定不会把数据库共享给你&#xff0c;他只能…

axios回调函数中this指向已经改变的解决方法

在axios回调函数中&#xff0c;this指向的是回调函数本身的作用域&#xff0c;而不是Vue实例的作用域。因此&#xff0c;你不能直接通过this访问Vue实例中的数据。为了解决这个问题&#xff0c;有几种方法&#xff1a; 1.使用箭头函数&#xff0c;箭头函数会绑定当前作用域的t…

【Linux】——基操指令(一)

个人主页 代码仓库 C语言专栏 初阶数据结构专栏 Linux专栏 LeetCode刷题 算法专栏 目录 前言 基操前的碎碎念 计算机的层状结构 基础指令 查看登录用户指令 查看用户指令 查看当前所处工作目录 清屏指令 基操指令 ls命令 cd命令 makdir指令 rmdir指令 &…

Mac电脑信息大纲记录软件 OmniOutliner 5 Pro for Mac中文

OmniOutliner 5 Pro是一款专业级的Mac大纲制作工具&#xff0c;它可以帮助用户更好地组织和管理信息&#xff0c;以及制作精美的大纲。以下是OmniOutliner 5 Pro的主要功能和特点&#xff1a; 强大的大纲组织和管理功能。OmniOutliner 5 Pro为用户提供了多层次的大纲结构&…

SpringBoot+MinIO8.0开箱即用的启动器

一、代码拉取及安装 1.码云地址 https://gitee.com/qiangesoft/rdp-starter/tree/master/rdp-starter-minio 2.本地安装 代码接入 1.引入依赖 <dependency><groupId>com.qiangesoft.rdp</groupId><artifactId>rdp-starter-minio</artifactId&g…

Chinese-LLaMA-AIpaca 指令精调

文章目录 一、继续训练 Chinese-AIpaca 模型的 LoRA权重二、基于中文Chinese-LLaMA训练全新的指令精调LoRA权重1、合并2、基于中文 Chinese-LLaMA 训练全新的指令精调 LoRA权重一、继续训练 Chinese-AIpaca 模型的 LoRA权重 下载数据集 alpaca_data_zh_51k.json https://github…

Learn Prompt- Midjourney案例:动漫设计

使用 Midjourney 生成动漫有两种方法&#xff1a;使用Niji模式或使用标准的 Midjourney 模型。Niji V5 是 Midjourney 的动漫专用模型。它建立在标准 Midjourney 模型的全新架构之上&#xff0c;更擅长生成命名的动漫角色。Niji V4于2023年12月发布&#xff0c;Niji V5于2023年…

邮件功能-python中的SMTP协议邮件发送

文章目录 一、SMTP协议邮件准备二、smtplib模块1.使用smtplib封装一个邮件类2.发送邮件 补充 一、SMTP协议邮件准备 需要一个smtp服务器 二、smtplib模块 smtplib模块是python自带的模块 1.使用smtplib封装一个邮件类 import smtplib import logging # 加入日志&#xff…

Linux nohup

nohup 命令用于在 Linux 中将命令或程序在后台运行&#xff0c;并且在终端关闭后仍然保持运行。 nohup命令 描述 nohup 命令用于将命令或程序以不受终端挂断影响的方式在后台运行。 语法 nohup command [arguments] &参数 command&#xff1a;要在后台运行的命令或程…

Java中的泛型

一. 泛型简介 泛型&#xff0c;即“参数化类型”。 作为Java中常用且重要的一个概念&#xff0c;泛型帮我们实现了代码重用&#xff0c;也保证了类型安全。但关于它的详细内容&#xff0c;目前很多同学还不清楚&#xff0c;所以接下来就带各位来学习这个重要的知识点。 背景 …

网络工程师基础笔记(一)

一、接入网 接入网&#xff0c;是指将端系统物理连接到边缘路由器的网络。 &#xff08;1&#xff09;家庭接入&#xff1a;数字用户线(DSL)、电缆、光纤到户&#xff08;FTTH&#xff09;卫星和拨号接入。 &#xff08;2&#xff09;企业&#xff08;家庭&#xff09;接入&…

ArduPilot开源飞控之GCS显示DPS310异常问题

ArduPilot开源飞控之GCS显示DPS310异常问题 1. 源由2. 现象3. 分析3.1 Mission Planner3.2 Ardupilot3.3 AP_Baro分析3.4 AP_Baro定位 4. 修复5. 效果6. 参考资料7. 补充7.1 Ardupilot提交PR注意事项7.2 修复主要使用到的命令 1. 源由 2020年Ardupilot官网论坛就有开始讨论DPS…

计算机竞赛 深度学习卫星遥感图像检测与识别 -opencv python 目标检测

文章目录 0 前言1 课题背景2 实现效果3 Yolov5算法4 数据处理和训练5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **深度学习卫星遥感图像检测与识别 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐…

python基于轻量级卷积神经网络模型GhostNet开发构建养殖场景下生猪行为识别系统

养殖业的数字化和智能化是一个综合应用了互联网、物联网、人工智能、大数据、云计算、区块链等数字技术的过程&#xff0c;旨在提高养殖效率、提升产品质量以及促进产业升级。在这个过程中&#xff0c;养殖生猪的数字化智能化可以识别并管理猪的行为。通过数字化智能化系统&…

idea 通过tomcat 配置 https方式访问

步骤1&#xff1a;管理员模式打开cmd命令进行生成密匙 D:\software\apache-tomcat-8.5.93\bin\tomcat.keystore 是生成密匙存放的路径&#xff0c;修改成自己tomcat的路径即可 keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore "D:\s…

【新版】系统架构设计师 - 案例分析 - 架构设计<Web架构>

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 案例分析 - 架构设计&#xff1c;Web架构&#xff1e;Web架构知识点单台机器 到 数据库与Web服务器分离应用服务器集群负载均衡负载均衡技术静态与动态算法Session共享机制有状态与无状态 持久化技…

使用香橙派 在Linux环境中安装并学习Python

前言 在实际项目中&#xff0c;经常会遇到需要使用人工智能的场景&#xff0c;如人脸识别&#xff0c;车牌识别等...其一般的流程就是由单片机采集数据发送给提供人工智能算法模型的公司&#xff08;百度云&#xff0c;阿里云...&#xff09;&#xff0c;然后人工智能将结果回…

C++ 继承详解

目录 C 继承介绍 继承中的特点 public 继承 protected 继承 private 继承 在类里面不写是什么类型&#xff0c;默认是 private 的 如果继承时不显示声明是 private&#xff0c;protected&#xff0c;public 继承&#xff0c;则默认是 private 继承&#xff0c;在 struct …