vue3圖標終極方案【npm包推薦】vue3-icon-sui(含源碼詳解)

簡介

為徹底實現 vue3 項目圖標自由,特開發此 npm包 vue3-icon-sui,全品類圖標,通通支持!

  • iconify 圖標
  • svg 圖標
  • font-class 圖標

安裝

npm i vue3-icon-sui -S

使用

按需導入

任意頁面中

import myIcon from "vue3-icon-sui";

myIcon 可為任意自定義的組件名稱

全局注冊

src/main.ts

import myIcon from "vue3-icon-sui";const app = createApp(App);
app.component("myIcon", myIcon);

iconify 圖標

  • 必要傳參 icon – iconify 官網圖標的名稱,支持翻轉 flip
    • 水平翻轉 “horizontal”
    • 垂直翻轉 “vertical”
    • 水平垂直翻轉 “horizontal vertical”
  1. 在 iconify 官網搜索想要的圖標
    https://icon-sets.iconify.design/?query=home

在這里插入圖片描述
2. 頁面中使用
傳給屬性 icon

<myIcon icon="ic:baseline-home" color="red" size="36" />

在這里插入圖片描述

svg 圖標(支持多彩)

  • 必要傳參 name – 項目的 src/assets/icons/svg 目錄中svg 圖標的名稱
  1. 從https://www.iconfont.cn/ 中找到喜歡的圖標
    在這里插入圖片描述
    鼠標懸浮其上時,點擊下載

    在這里插入圖片描述
    在這里插入圖片描述

    可直接下載svg,將其放入項目的 src/assets/icons/svg 目錄中,改名為 nice.svg

    也可以復制 svg 代碼,新建 src/assets/icons/svg/nice.svg 文件,再將 svg 代碼粘貼到 nice.svg 中

  2. 頁面中使用
    將 svg 圖標的名稱傳給屬性 name

    <myIcon name="nice" size="36" />
    

    效果如下
    在這里插入圖片描述
    傳入 color 可自定義顏色,但會喪失多彩

    <myIcon name="nice" size="36" color="red" />
    

    在這里插入圖片描述

font-class 圖標

  1. 從https://www.iconfont.cn/ 中找到喜歡的圖標
    在這里插入圖片描述

鼠標懸浮其上時,點擊添加入庫
在這里插入圖片描述

在這里插入圖片描述

加入已有項目,或新建項目

在這里插入圖片描述
在這里插入圖片描述
得到 url

//at.alicdn.com/t/c/font_2261937_vumtsyzbq7d.css

鼠標懸浮在項目的圖標上,可一鍵復制代碼,得到 type

icon-nice

在這里插入圖片描述

  1. 頁面中使用
    必傳參數 url 和 type

      <myIconurl="//at.alicdn.com/t/c/font_2261937_vumtsyzbq7d.css"type="icon-nice"size="36"color="red"/>
    

    在這里插入圖片描述

屬性

屬性名屬性值說明
iconiconify 官網圖標的名稱,如 “ic:baseline-home”iconify圖標必傳
flip水平翻轉 “horizontal”
垂直翻轉 “vertical”
水平垂直翻轉 “horizontal vertical”
僅iconify圖標支持
name項目的 src/assets/icons/svg 目錄中svg 圖標的名稱svg圖標必傳
rotate旋轉度數,數值即可,如 90 即順時針旋轉90度所有圖標都支持
color顏色,如 red所有圖標都支持,但svg的多彩圖標會變為純色
size大小,數值,如 36 即 36px所有圖標都支持
urlfont-class圖標的css地址,詳見使用范例font-class圖標必傳
typefont-class圖標的代碼,詳見使用范例font-class圖標必傳
fontFamilyfont-class圖標的前綴除非在項目設置中進行了修改,否則使用默認的 icon-font 即可

font-class 圖標自定義fontFamily

在這里插入圖片描述

在這里插入圖片描述
通常不建議修改!

假設修改為 myfont ,則頁面使用時,fontFamily屬性需傳入 myfont

  <myIconurl="//at.alicdn.com/t/c/font_2261937_vumtsyzbq7d.css"type="icon-nice"fontFamily="myfont"/>

源碼

詳解見源碼注釋

<script setup lang="ts">
// 優先推薦【iconify圖標】必要傳參 icon ,支持翻轉 flip
// 搜索圖標 https://icon-sets.iconify.design/// 【svg圖標-支持多彩圖標】必要傳參 name
// 需將svg圖標放在 src/assets/icons/svg 目錄中,// 【font圖標-不支持多彩圖標】必要傳參 url 和 type
// 整個項目使用多個圖標時,只需有一個圖標傳入 url 即可import { computed, onBeforeMount, ref, watch, onMounted } from "vue";
import { Icon } from "@iconify/vue";// 接收的屬性
const props = defineProps({icon: {type: String,},// 水平翻轉 "horizontal"// 垂直翻轉 "vertical"// 水平垂直翻轉 "horizontal vertical"flip: {type: String,},name: {type: String,},// 旋轉角度rotate: {type: Number,},// 圖標顏色color: {type: String,},// 圖標大小size: {type: [Number, String],default: 16,},url: {type: String,default: "//at.alicdn.com/t/c/font_2261937_dg35xe8b86.css",},type: {type: String,},fontFamily: {type: String,default: "iconfont",},
});onBeforeMount(() => {if (props.url) {const existingLink = document.querySelector(`link[href="${props.url}"]`);if (!existingLink) {const link = document.createElement("link");link.href = props.url;link.rel = "stylesheet";document.head.appendChild(link);}}
});const className = computed(() => `${props.fontFamily} ${props.type}`);// 計算樣式
const newStyle = computed(() => {const style: Record<string, string | number> = {};if (props.size) {style.width = `${props.size}px`;style.height = `${props.size}px`;}if (props.color) {style.color = props.color;}if (props.rotate) {style.transform = `rotate(${props.rotate}deg)`;}return style;
});// 狀態管理
const svgContainer = ref<HTMLDivElement>();
const loading = ref(true);
const error = ref(null);// 加載并渲染SVG的函數
const loadAndRenderSvg = async () => {try {// 重置狀態loading.value = true;error.value = null;// 使用動態import導入SVG文件,獲取原始內容// 加上 ?raw 后,Vite 會直接將 SVG 文件的內容以純文本字符串的形式返回const svgUrl = "/src/assets/icons/svg/" + props.name + ".svg";const module = await import(svgUrl + "?raw");const svgContent = module.default;// 清空容器if (svgContainer.value) {(svgContainer.value as any).innerHTML = "";}// 創建臨時元素解析SVG內容const tempDiv = document.createElement("div");tempDiv.innerHTML = svgContent;// 獲取SVG元素const svgElement = tempDiv.querySelector("svg");if (!svgElement) {throw new Error("導入的文件不是有效的SVG");}// 設置SVG屬性svgElement.setAttribute("width", props.size + "px");svgElement.setAttribute("height", props.size + "px");if (props.color) {// 替換SVG顏色replaceSvgFillColor(svgElement, props.color);// svg 圖片本身沒有 fill 時,添加fillsvgElement.setAttribute("fill", props.color);}// 將SVG元素添加到容器if (svgContainer.value) {svgContainer.value.appendChild(svgElement);}} catch (err: any) {error.value = err.message || `無法加載圖標: ${props.name}`;} finally {loading.value = false;}
};/*** 替換SVG元素的fill顏色值* @param svgElement 目標SVG元素* @param newColor 新的顏色值(可以是十六進制、rgb、rgba或顏色名稱)* @returns 是否成功替換顏色*/
function replaceSvgFillColor(svgElement: SVGElement,newColor: string
): boolean {if (!svgElement) {return false;}try {// 查找所有帶有fill屬性的路徑元素const pathElements = svgElement.querySelectorAll("path[fill]");if (pathElements.length === 0) {return false;}// 替換每個path元素的fill屬性pathElements.forEach((path) => {path.setAttribute("fill", newColor);});return true;} catch (error) {return false;}
}// 監聽props變化,重新加載圖標
watch(() => [props.name, props.size, props.color],() => {loadAndRenderSvg();}
);// 組件掛載時加載圖標
onMounted(() => {if (props.name) {loadAndRenderSvg();}
});
</script><template><Iconv-if="props.icon":icon="props.icon":style="newStyle":flip="props.flip"/><template v-else-if="props.name"><!-- 加載狀態 --><div v-if="loading" class="loading">加載中...</div><!-- 錯誤狀態 --><div v-if="error" class="error">圖標加載失敗: {{ error }}</div><!-- SVG容器 - 動態渲染的SVG將插入到這里 --><div ref="svgContainer" v-else></div></template><iv-else="props.type":class="className":style="{fontSize: props.size + 'px',color: props.color,...newStyle,}"style="display: inline-block"></i>
</template>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/95700.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95700.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/95700.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

redis----持久化

Redis 提供了兩種主要的持久化機制&#xff0c;用于將內存中的數據保存到磁盤&#xff0c;以防止服務器重啟或故障導致數據丟失。這兩種機制分別是 RDB&#xff08;Redis Database&#xff09;和 AOF&#xff08;Append Only File&#xff09;。1. RDB 持久化RDB 是 Redis 默認…

Docker快速部署Mongodb主副本集實踐

系列文章目錄 第一章 Mongodb的主副本集 文章目錄系列文章目錄前言一、Mongodb基礎介紹數據庫&#xff08;Database&#xff09;集合&#xff08;Collection&#xff09;文檔&#xff08;Document&#xff09;BSON&#xff08;Binary JSON&#xff09;_id&#xff08;主鍵&…

FC平臺安裝Windows Server2016并連接V6存儲

創建 windows server2016 上傳ISO創建虛擬機安裝OS 加載光盤掛載成功之后&#xff0c;重啟虛擬機重啟之后VNC登錄即可。在FC上安裝windows&#xff0c;安裝完成后&#xff0c;必須安裝tools工具&#xff0c;不然沒有虛擬網卡&#xff0c;無法配置ip地址。Windows主機安裝toolsW…

農業XR數字融合工作站,賦能農業專業實踐學習

隨著數字技術與農業的深度融合&#xff0c;農業專業XR數字融合工作站為農業專業學生提供了沉浸式、交互式的學習體驗。農業專業XR數字融合工作站作為集PC、VR、MR技術于一體的軟硬件集成平臺&#xff0c;通過虛擬仿真、數字孿生等技術手段&#xff0c;有效解決了傳統農業教育中…

積分球的使用——簡易版

這篇寫的比較雜。積分球的功能積分球——測量燈具等光源的總光通量、光效、色溫、顯色指數等參數。使用方法1.開啟積分球系統&#xff08;探測器、光度計、光譜儀&#xff09;&#xff0c;充分預熱&#xff08;15-30分鐘&#xff09;&#xff0c;使得電子設備穩定&#xff0c;減…

[光學原理與應用-435]:晶體光學 - 晶體的結構-基元/原胞/晶胞/點陣

晶體的結構可通過基元、原胞、晶胞和點陣四個核心概念進行系統描述&#xff0c;它們共同揭示了晶體中原子排列的周期性與對稱性規律&#xff0c;具體如下&#xff1a;1. 基元&#xff08;Structure Motif&#xff09;定義&#xff1a;基元是晶體中重復排列的最小結構單元&#…

電腦音頻錄制 | 系統麥克混錄 / 系統聲卡直錄 | 方法匯總 / 常見問題

注&#xff1a;本文為 “電腦音頻錄制 ” 相關合輯。 英文引文&#xff0c;機翻未校。 未整理去重&#xff0c;如有內容異常&#xff0c;請看原文。 How to Record Computer Audio in 6 Free Ways 如何用 6 種免費方式錄制電腦音頻 Sponsored by EaseUS Nov 28, 2023 4:34 a…

2025高教社國賽數學建模競賽B題完整參考論文(含模型和代碼)

2025國賽數學建模競賽B題完整參考論文 目錄 一、 問題重述 1.1 問題背景 1.2 問題回顧與分析 二、 模型假設 三、 符號說明 四、 問題求解與分析 4.1數據預處理 4.2 問題1求解與分析 4.2.1 問題1分析 4.2.2 問題1建模與求解 4.2.3 問題1結果與分析 4.3 問題2求解與分…

OpenSSL 1.0.1e 下載解壓和運行方法(小白適用 附安裝包)?

openssl-1.0.1e.zip? 是 OpenSSL 加密工具包的一個舊版本&#xff08;發布于 2013 年左右&#xff09;的 ?源代碼壓縮包&#xff0c;文件格式是 ZIP 壓縮格式。 一、下載與解壓 ?下載文件? 假如你已經有了 openssl-1.0.1e.zip 這個壓縮包&#xff0c;就跳過這步。 如果沒有…

MapStruct詳解

提到屬性拷貝&#xff0c;首先想到的BeanUtils。 先簡單的回憶下BeanUtils&#xff0c;處理Java Bean之間的屬性拷貝&#xff1b;不過由于它是通過反射來拷貝屬性&#xff0c;在數據量大一些的時候性能會降低&#xff1b; 且在安全方面也會比較弱&#xff1b; MapStruct是編譯期…

8.FC平臺模塊梳理

文章目錄8.FC平臺模塊梳理8.1. 內存復用技術特點應用價值8.2. 虛擬機啟用策略8.3. NUMA8.4. HA高可用8.5. 故障和響應策略8.6. DRS 和 DPM8.7. IMC8.FC平臺模塊梳理 8.1. 內存復用 內存共享內存交換內存氣泡 內存共享&#xff1a;多臺虛擬機共享數據內容相同的內存頁。內存交換…

貪心算法應用:DNA自組裝問題詳解

JAVA中的貪心算法應用&#xff1a;DNA自組裝問題詳解 1. DNA自組裝問題概述 DNA自組裝(DNA Self-Assembly)是分子計算和納米技術中的一個重要問題&#xff0c;它利用DNA分子的互補配對特性&#xff0c;通過精心設計DNA序列&#xff0c;使其自發地組裝成預定的納米結構。在計算機…

數據湖如何打造統一存儲與處理方案(結構化數據、半結構化數據和非結構化數據)

目錄 1. 數據湖的“包容哲學”:為什么需要統一方案? 數據湖的核心訴求 案例:零售企業的痛點 2. 存儲層設計:給數據找個舒適的家 分區與分層存儲 選擇存儲格式 案例:Parquet的威力 云存儲的選擇 3. 元數據管理:給數據湖裝上“導航儀” 元數據管理的核心組件 主流…

AUTOSAR進階圖解==>AUTOSAR_SWS_TTCANDriver

TTCAN驅動器詳細規范 AUTOSAR TTCAN Driver Specification with Enhanced Visual Documentation目錄 1. 概述2. TTCAN控制器狀態機3. TTCAN模塊架構4. TTCAN時間觸發操作序列5. TTCAN錯誤處理流程6. 總結 1. 概述 TTCAN&#xff08;Time-Triggered CAN&#xff09;驅動器是AU…

equals 定義不一致導致list contains錯誤

錯誤代碼如下&#xff1a;for (int i0;i< rows.size();i) {Row r rows.get(i);if (r.equals(row)) {assertTrue(rows.contains(row));return;}}cassertTrue(rows.contains(row));返回了false&#xff0c;看起來很奇怪&#xff0c;此時equals 定義如下&#xff1a;public bo…

【Python基礎】 20 Rust 與 Python 循環語句完整對比筆記

一、基本循環結構對比 Rust 循環類型 // 1. loop - 無限循環 let mut count 0; loop {count 1;if count > 5 {break;} }// 2. while - 條件循環 let mut number 3; while number ! 0 {println!("{}!", number);number - 1; }// 3. for - 迭代循環 for i in 0..…

Redis 在互聯網高并發場景下的應用--個人總結

在現代互聯網系統中&#xff0c;高并發已經成為常態。無論是電商的秒殺場景、社交平臺的熱點推薦&#xff0c;還是支付接口的風控&#xff0c;系統需要同時應對成千上萬的請求。這時候&#xff0c;Redis 作為一個高性能的內存數據庫&#xff0c;憑借其極快的讀寫速度和豐富的數…

C++筆記之軟件設計原則總結

C++筆記之軟件設計原則總結 code review 文章目錄 C++筆記之軟件設計原則總結 1.軟件設計的六大原則 2.高內聚與低耦合 2.1.高內聚(High Cohesion) 2.2.低耦合(Low Coupling) 2.3.高內聚與低耦合的關系與重要性 3.DRY(Dont Repeat Yourself)原則 3.1.定義 3.2.好處 3.3.示…

ThreadLocal 深度解析:原理、應用場景與最佳實踐

一、ThreadLocal 核心概念與設計哲學?1.1 ThreadLocal 的基本概念?ThreadLocal 是 Java 中提供線程局部變量的類&#xff0c;它允許每個線程創建自己的變量副本&#xff0c;從而實現線程封閉&#xff08;Thread Confinement&#xff09;。簡單來說&#xff0c;ThreadLocal 為…

AMD顯卡運行GPT-OSS全攻略

AMD顯卡運行GPT-OSS全攻略 本文介紹如何在Windows系統上使用AMD顯卡&#xff08;以RX 7900XTX為例&#xff09;運行開源GPT-OSS模型。 前置要求 硬件&#xff1a;AMD顯卡&#xff08;如RX 7900XTX&#xff0c;具體支持型號參考ROCm文檔&#xff09;。軟件&#xff1a; Ollam…