最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue3+Element?Plus使用svg加載iconfont的處理方法

 更新時間:2022年08月25日 11:15:27   作者:web老猴子  
這篇文章主要介紹了Vue3+Element?Plus使用svg加載iconfont的解決方案,本文詳細(xì)介紹了如何在Element?Plus中使用iconfont,簡單的說就是要將其封裝成SVG,并且支持動態(tài)修改顏色,需要的朋友可以參考下

安裝依賴

由于我們是Vue3項目,可以使用vite來快速創(chuàng)建一個Vu3項目:

npm install -g yarn
yarn create vite my-vue-app --template vue // 這里我們使用vue模板,默認(rèn)是Javascript語法,如果需要ts語法則需要指定模板為vue-ts
cd my-vue-app
yarn
yarn dev 

創(chuàng)建好項目后,我們再來引入Element Plus,安裝并引入的過程如下:

安裝

yarn add element-plus 

完整引入

// main.js
...
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
app.use(ElementPlus) 

引入后,我們就可以在Vue3項目中使用了:

<template><el-button>按鈕</el-button>
</template> 

Element Plus使用Icon會比Element UI稍微麻煩點。首先我們需要安裝Icon的依賴:

yarn add @element-plus/icons-vue 

我們在main.js中注冊所有的圖標(biāo),當(dāng)然也可以按需引入圖標(biāo):

// main.js
// 全局引入
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
...
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {app.component(key, component)
} 

el-icon的使用:

<template><el-icon><Edit /></el-icon>
</template>
<script setup> // import {Edit} from '@element-plus/icons-vue' // 按需引入,如果已經(jīng)全局引入了就不需要按需引入 </script> 

Element Plus的el-icon使用的是svg,這與Element UI使用的類名有很大的不同,也就是說我們無法直接在el-icon中使用iconfont的圖標(biāo)。雖然Element Plus的圖標(biāo)已經(jīng)能滿足大部分場景的需求,但是一些特殊場景只能從iconfont或者自定義的圖標(biāo)上獲取。

那么有沒有辦法將iconfont封裝成svg,并給el-icon調(diào)用呢?

將iconfont封裝成svg

可縮放矢量圖形(Scalable Vector Graphics),簡稱SVG,是一種基于XML的,可用于描述二維的矢量圖形。SVG可以優(yōu)雅而簡潔的渲染不同大小的圖形,并且可以被無限縮放并且保持不失真或者降低質(zhì)量,這一特性比JPEGPNG等好用太多。SVG的內(nèi)容相當(dāng)多,感興趣的可以去MDN上查看文檔:SVG。我們這里只是簡單實用SVG來封裝iconfont。

首先我們新建一個SvgIcon.vue的文件,

<template><svg :class="classList" aria-hidden="true">
  <use :xlink:href="iconName" rel="external nofollow"    :fill="color" /></svg>
</template>
<script setup> import { computed } from 'vue';
const props = defineProps({className: {
  type: String,
  default: ''},iconClass: {
  type: String,
  required: true},color: {
  type: String,
  default: '#409eff'},size: {
  type: String,
  default: '20px'}
})
const classList = computed(() => {return ['icon', props.className || '']
})
const iconName = computed(() => {return `#${props.iconClass}`
}) </script>
<style scoped> .icon {/* v-bind是Vue3才支持的功能,可以將CSS的值與js的值綁定 */width: v-bind('props.size');height: v-bind('props.size');position: relative;vertical-align: -2px;fill: currentColor;
} </style> 

這樣就將iconfont封裝成了svg來調(diào)用了,這里我們重點說幾個屬性:

  • aria-hidden:默認(rèn)為false,設(shè)置為true表示會把整個元素包括子元素從可訪問樹(AOM)上移除,但是在DOM樹上還是存在的
  • xlink:href:use元素的屬性
  • v-bind:Vue3的特性,可用于關(guān)聯(lián)CSS和js
  • fill:如果在動畫接收還需要保持動畫的值,可用于設(shè)置顏色

如何使用

使用已經(jīng)封裝好的SvgIcon.vue比較簡單,就和正常的組件一樣使用即可。例如:

<template><SvgIcon :icon-class="icon-pointer"></SvgIcon>
</template>
<script setup> import SvgIcon from './SvgIcon.vue'
</sript> 

如果不想在局部注冊組件,也可以注冊為全局組件:

// main.js
import SvgIcon from '@/SvgIcon.vue'
...
app.component('SvgIcon', SvgIcon); 

作為SVG組件,我們也可以直接使用在el-icon中,這樣就可以添加任意iconfontel-icon中了:

<template><el-icon><SvgIcon :icon-class="icon-pointer"></SvgIcon></el-icon>
</template> 

按理說到這里,本篇教程就應(yīng)該結(jié)束了。但是,在使用的過程中,按照正常的方式設(shè)置的hover樣式不生效,筆者嘗試了幾種方案,最終放棄hover,采用監(jiān)聽鼠標(biāo)事件的方式解決。

設(shè)置”hover“樣式

SVG不同于class樣式,其無法直接通過修改hover樣式來設(shè)置鼠標(biāo)懸浮在圖標(biāo)上面時顏色改變,這個時候我們就需要換一種思路了。我們在SvgIcon.vue中傳入了color,并且通過fillcolor作用到SVG上,因此我們可以在父組件中修改color的值來實現(xiàn)"hover"效果。

<template><div @mouseenter="() => handleMouseenter" @mouseleave="() => handleMouseleave"><SvgIcon :icon-class="icon-pointer" :color="color"></SvgIcon></div>
</template>
<script setup> import {ref} from 'vue'
const color = ref('red')
const handleMouseenter = () => {color.value = 'blue'
}
const handleMouseleave = () => {color.value = 'red'
}
</sript> 

上面的例子中適用于單個SvgIcon,如果是多個的話,就需要進一步改造了:

<template><div v-for="(item, index) in list" @mouseenter="($event) => handleMouseenter($event, index)" @mouseleave="($event) => handleMouseleave($event, index)"><SvgIcon :icon-class="icon-pointer" :color="hoverIconIndex == index ? 'blue' : 'red'"></SvgIcon></div>
</template>
<script setup> import {ref} from 'vue'
const list = ref([{name: '張三'}
])
const color = ref('red')
const hoverIconIndex = ref(-1)
const handleMouseenter = (event, index) => {hoverIconIndex.value = index;
}
const handleMouseleave = (event, index) => {hoverIconIndex.value = -1;
}
</sript> 

對比來看,其實也不復(fù)雜。

為什么圖標(biāo)顏色無法修改?

可能有點朋友按照上述的步驟操作后,發(fā)現(xiàn)并不能修改圖標(biāo)顏色,如果不是代碼有誤,那應(yīng)該就是導(dǎo)入的iconfont有問題。一般我們會直接在iconfont官網(wǎng)下載圖標(biāo):

將下載好的壓縮包解壓后,只復(fù)制iconfont.js到項目中即可:

// main.js
...
import '@/assets/iconfont/iconfont.js'; 

我們來看一下iconfont.jsicon-close1icon-close的源碼:

可以發(fā)現(xiàn),這兩個圖標(biāo)最大的差別就是一個有fill,另一個沒有,而這就是問題的關(guān)鍵。如果某一個圖標(biāo)的fill不為空,那么作為svg引用時將無法修改填充色

舉個例子:

<template><div>
  <SvgIcon :color="'red'" :icon-class="'icon-close'"></SvgIcon>
    <SvgIcon :color="'red'" :icon-class="'icon-close1'"></SvgIcon>
  </div>
</template> 

運行結(jié)果:

遇到這個問題應(yīng)該怎么解決呢,一種方式就是手動刪除所有Icon的fill屬性,另一個就是在iconfont上面使用批量去色。

批量去色后,我們再次下載圖標(biāo),并解壓后替換掉原來的iconfont.js,再去源碼看看就會發(fā)現(xiàn)所有圖標(biāo)的fill都沒有了,而且也可以修改顏色。

總結(jié)

本文詳細(xì)介紹了如何在Element Plus中使用iconfont,簡單的說就是要將其封裝成SVG,并且支持動態(tài)修改顏色。雖然操作上不難,但是容易踩一些坑,你學(xué)會了嗎?

相關(guān)文章

  • vue集成openlayers加載geojson并實現(xiàn)點擊彈窗教程

    vue集成openlayers加載geojson并實現(xiàn)點擊彈窗教程

    這篇文章主要為大家詳細(xì)介紹了vue集成openlayers加載geojson并實現(xiàn)點擊彈窗教程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • Vue實現(xiàn)圖片預(yù)覽功能的詳細(xì)指南

    Vue實現(xiàn)圖片預(yù)覽功能的詳細(xì)指南

    在現(xiàn)代 web 應(yīng)用程序中,圖片預(yù)覽功能提升了用戶體驗,使用戶可以在上傳圖片之前查看圖片內(nèi)容,本文將詳細(xì)介紹如何在 Vue.js 應(yīng)用中實現(xiàn)圖片預(yù)覽功能,包括基本實現(xiàn)、進階功能、與 Element UI 的集成、常見優(yōu)化技巧以及與其他庫的結(jié)合使用,需要的朋友可以參考下
    2024-09-09
  • Vue使用Three.js加載glTF模型的方法詳解

    Vue使用Three.js加載glTF模型的方法詳解

    這篇文章主要給大家介紹了關(guān)于Vue使用Three.js加載glTF模型的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Vue具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Vue組件data函數(shù)的具體使用

    Vue組件data函數(shù)的具體使用

    在Vue組件中,data函數(shù)用于定義組件的數(shù)據(jù),本文主要介紹了Vue組件data函數(shù)的具體使用,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • vue實現(xiàn)自定義el-table穿梭框功能

    vue實現(xiàn)自定義el-table穿梭框功能

    這篇文章主要介紹了vue實現(xiàn)自定義el-table穿梭框功能,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • vue3+vite應(yīng)用中添加sass預(yù)處理器問題

    vue3+vite應(yīng)用中添加sass預(yù)處理器問題

    這篇文章主要介紹了vue3+vite應(yīng)用中添加sass預(yù)處理器問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 使用vue3指令封裝一個圖片預(yù)覽功能

    使用vue3指令封裝一個圖片預(yù)覽功能

    這篇文章主要為大家詳細(xì)介紹了如何使用?vue3?指令封裝一個后臺管理系統(tǒng)圖片預(yù)覽功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • 關(guān)于el-col的使用,占據(jù)寬度的應(yīng)用解析

    關(guān)于el-col的使用,占據(jù)寬度的應(yīng)用解析

    這篇文章主要介紹了關(guān)于el-col的使用,占據(jù)寬度的應(yīng)用解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • vue-router啟用history模式下的開發(fā)及非根目錄部署方法

    vue-router啟用history模式下的開發(fā)及非根目錄部署方法

    這篇文章主要介紹了vue-router啟用history模式下的開發(fā)及非根目錄部署方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • Vite打包優(yōu)化之縮小打包體積實現(xiàn)詳解

    Vite打包優(yōu)化之縮小打包體積實現(xiàn)詳解

    這篇文章主要為大家介紹了使用Vite縮小打包體積如何實現(xiàn)的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01

最新評論

山西省| 六枝特区| 同仁县| 洪江市| 阳曲县| 河津市| 五河县| 兴安县| 吐鲁番市| 康保县| 丰台区| 尼勒克县| 周至县| 彝良县| 元谋县| 雅江县| 确山县| 海阳市| 壶关县| 冕宁县| 定远县| 松桃| 乌恰县| 孟村| 墨竹工卡县| 正蓝旗| 静宁县| 广丰县| 乌兰浩特市| 博乐市| 锦屏县| 娄烦县| 中牟县| 任丘市| 无棣县| 阿城市| 宜宾县| 寿阳县| 霞浦县| 四川省| 甘泉县|