封裝svg組件

如何封裝svg圖標組件

封裝svg圖標組件的方法有很多種,如果只是單純的想使用svg圖標,可以將svg導出fonts字體圖標使用,但這樣做會失去svg原有的樣式與尺寸,也可以當成img圖片或者背景引入,但這樣做非常繁瑣。

最近項目中需要用大量的svg圖標,這里介紹一種通過vue組件使用svg圖標的方式:

首先了解一下svg圖標的use元素。

<svg><defs><g id="shape"><rect x="0" y="0" width="50" height="50" /><circle cx="0" cy="0" r="50" /></g></defs><use xlink:href="#shape" x="50" y="50" /><use xlink:href="#shape" x="200" y="50" />
</svg>
復制代碼

比如我繪制了一個id為shape的svg元素,當我想復用時,不可能再復制粘貼一遍代碼,這時借助use元素,讓xlink:href指定為#shape,它會去尋找并克隆對應的svg元素,從而實現復用。

use元素方便的是,只要同處于一個文檔中,use都可以引用到,它可以重用單個元素,也可以重用一組<g>或者<symbol>元素,只需要通過id選擇器進行標時引用即可。

具體的想要了解use克隆的內容放在了哪里,以及svg更底層的內容,可參考:用CSS給SVG 的內容添加樣式

封裝vue組件

首先,將UI提供的需要使用的svg文件統一放在一個文件夾內:

├── src├── svg├── user.svg└── course.svg
復制代碼

開發vue組件:

// svg-icon.vue
<template><svg :class="svgClass" aria-hidden="true" v-on="$listeners"><use :xlink:href="iconName"></use></svg>
</template><script>
import './icons';export default {name: 'SvgIcon',props: {// svg圖標名稱name: {default: ''},// 自定義樣式className: {type: String,default: ''}},computed: {iconName() {return `#icon-${this.name}`;},svgClass() {return ['svg-icon',this.className ? this.className:'']}}
};
</script><style scoped>
.svg-icon {vertical-align: -0.15em;fill: currentColor;overflow: hidden;
}
</style>
復制代碼

我們期望使用svg-icon組件來統一使用所有的svg文件,通過指定name來變更對應的svg文件。

想要使用svg文件的話,還需要將所有svg文件統一加載到內存當中,可以使用import 'svg/user.svg'這種方式一個一個引用,這里借助require.context一次性引入所有svg文件。

// icons.jsconst req = require.context('@svg', false, /\.svg$/);
const requireAll = requireContext => requireContext.keys().map(requireContext);
requireAll(req);
復制代碼

這個時候,還不能通過svg-icon組件指定name的方式來引用兌用svg文件。我們還需要將每個svg文件進一步處理,將他們文件內容的icon封裝進symbol元素中,達到下面的使用效果:

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><symbol class="icon" viewBox="0 0 970 740" id="icon-user">...</symbol>
</svg>
復制代碼

這里可以借助webpack插件:svg-sprite-loader

改造項目的webpack配置

由于項目是基于vue-cli3定制的,所以這里只介紹一下如何在vue-cli3中配置svg-sprite-loader

代碼如下:

module.exports = {...chainWebpack: config => {...config.module.rule('svg').exclude.add(resolve('src/svg')).end();config.module.rule('svgs-loader').test(/\.svg$/).include.add(resolve('src/svg')).end().use('svg-sprite-loader').loader('svg-sprite-loader').options({symbolId: 'icon-[name]'}).end();}
}
復制代碼

這里要注意一下,配置svg-sprite-loader之前,要先替換vue-cli3本身的file-loader規則,該loader會把svg同圖片資源一樣單獨輸出出來,這里配置file-loader忽略svg下面所有的svg文件即可。

最后,在vue中就可以通過svg-icon組件來使用對應的svg圖標了。

相關文章

  • 未來必熱:SVG Sprite技術介紹
  • 用CSS給SVG 的內容添加樣式

如文章內容出現錯誤,敬請諒解,希望可以不吝賜教。

轉載請注明出處

轉載于:https://juejin.im/post/5cf79b8c518825382565ba19

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

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

相關文章

RabbitMQ 延遲隊列,消息延遲推送

應用場景 目前常見的應用軟件都有消息的延遲推送的影子&#xff0c;應用也極為廣泛&#xff0c;例如&#xff1a; 淘寶七天自動確認收貨。在我們簽收商品后&#xff0c;物流系統會在七天后延時發送一個消息給支付系統&#xff0c;通知支付系統將款打給商家&#xff0c;這個過程…

windows Navicat Premium連接oracle

需要下載并指定Instant Client 下載地址&#xff1a;在oracle官網搜索Instant Client Downloads選擇自己需要的客戶端 //說明 //Navicat 版本 9 或以上捆綁了 instant client&#xff0c;但是捆綁的用不了&#xff0c;捆綁的10.2。因此下載高版本替換之 //版本有要求&#xff0…

關于arraylist的擴容機制

ArrayList會自動改變size的長度&#xff1a; 首先&#xff0c;ArrayList定義了一個私有的未被序列化的數組elementData&#xff0c;用來存儲ArrayList的對象列表&#xff08;注意只定義未初始&#xff09;&#xff1a;private transient Object[] elementData;   其次&am…

不同級別UI設計師的區別有哪些?

不同等級的UI設計師在工作內容以及基本的薪資待遇方面也是有區別的&#xff0c;很多在UI培訓學校學習的小伙伴們并不知道各個等級的UI設計師工作內容有什么差別&#xff0c;那么合肥學碼思小編就給大家總結一下這些區別分別表現在哪些方面。 一、初級UI設計師 初級UI設計師的主…

Linux命令行參數前加--,-和不加杠

參數前“-”的表明后面的參數是字符形式。參數前“--”的則表明后面的參數是單詞形式。參數前有橫的是System V風格。 參數前沒有橫的是BSD風格。 轉載于:https://www.cnblogs.com/YYRise/p/9090476.html

反射筆記-----------------------------

1.反射基本概念&#xff1a; 01.定義&#xff1a; 反射是指在程序運行期間&#xff0c;能夠觀察和修改類或者類的對象的屬性和行為的特性&#xff01; 02.作用&#xff1a; 001.在運行期間獲取類的修飾符&#xff0c;包名&#xff0c;類名&#xff0c;實現的接口&#xff0c;繼…

kubernetes 集群部署

kubernetes 集群部署 環境JiaoJiao_Centos7-1(152.112) 192.168.152.112JiaoJiao_Centos7-2(152.113) 192.168.152.113JiaoJiao_Centos7-3(152.114) 192.168.152.114已開通 4C8G80G 集群規劃 部署方式 環境準備&#xff1a;基于主機名稱通信&#xff0c;時間同步&#xff0c;關…

PHP學習筆記--抽象類和抽象方法的應用

抽象類** 什么是抽象方法&#xff1f;** 定義&#xff1a;如果一個類中的方法&#xff0c;沒有方法體的方法就是抽象方法(就是一個方法沒有使用{}而直接使用分號結束)* * abstract function test(); //抽象方法* * function test(){ //有方法體…

wordpress 顯示數學公式 (MathJax-LaTeX)

blog 不放一堆數學公式怎么能顯得高大上&#xff0c;所以 MathJax-LaTeX 也是必裝的插件之一了。 一、安裝 MathJax-LaTex 插件 直接在 wordpress 插件中&#xff0c;搜索并安裝 MathJax-LaTeX 二、安裝本地 MathJax 服務 不過由默認的 MathJax cdn 服務經常被墻&#xff0c;所…

長春理工大學第十四屆程序設計競賽(重現賽)F.Successione di Fixoracci

鏈接&#xff1a;https://ac.nowcoder.com/acm/contest/912/F 題意&#xff1a; 動態規劃(Dynamic programming&#xff0c;簡稱dp)是一種通過把原問題分解為相對簡單的子問題的方式求解復雜問題的方法。例如&#xff0c;假設小x一步能爬1層或2層臺階&#xff0c;求小x爬n層臺階…

ConstraintLayout

ConstraintLayout使用筆記 具體使用參考&#xff1a;http://blog.csdn.net/guolin_blog/article/details/53122387 ConstraintLayout 好處還是很明顯&#xff0c;確實可以減少嵌套。性能對比參閱&#xff1a;http://www.cnblogs.com/liujingg/p/7161319.html 簡單嵌套Constrain…

css權重

權重大小 內嵌權重為1000 <p style"color: yellow;">ALEX</p> id選擇器的權重為100&#xff0c;類選擇器的權重為10&#xff0c;標簽選擇器的權重為1. /*1 1 1*/ #box1 .wrap2 p{color: red; }當權重一樣的時候&#xff0c;是以后設置的屬性為準&#xf…

手機兩列布局,正方形

手機兩列布局&#xff0c;正方形。 直接貼出調試網站的結果&#xff0c;閱讀效果還不錯。 轉載于:https://www.cnblogs.com/blogzhang/p/11002428.html

python(5)- 基礎數據類型

一 int 數字類型 #abs(x)      返回數字的絕對值&#xff0c;如abs(-10) 返回 10 # ceil(x)    返回數字的上入整數&#xff0c;如math.ceil(4.1) 返回 5 # cmp(x, y)    如果 x < y 返回 -1, 如果 x y 返回 0, 如果 x > y 返回 1 # exp(x)…

B s

666 轉載于:https://www.cnblogs.com/lovelgx/articles/9099239.html

基于HTK的語音撥號系統

為什么80%的碼農都做不了架構師&#xff1f;>>> 基于 HTK 的語音撥號系統 Veket NWPU 2011-6-22 目標&#xff1a; 該系統能夠識別連續說出的數字串和若干組姓名。建模是針對子詞&#xff08; sub-word,eg.. 音素&#xff09;&#xff0c;具有一定的…

MySQL無法重啟問題解決Warning: World-writable config file '/etc/my.cnf' is ignored

為什么80%的碼農都做不了架構師&#xff1f;>>> 今天幫朋友維護服務器&#xff0c;在關閉數據庫的命令發現mysql關不了&#xff0c;提示Warning: World-writable config file /etc/my.cnf is ignored &#xff0c;大概意思是權限全局可寫&#xff0c;任何一個用戶都…

用戶體驗分析: 以 “南通大學教務管理系統微信公眾號” 為例

基于實例分析&#xff0c;體會用戶體驗設計的 7 條準則&#xff0c;分析“南通大學教務管理系統微信公眾號” 在用戶體驗設計方面讓你覺得滿意的地方&#xff08;不少于2點&#xff09;&#xff1b;&#xff08;20分&#xff09;&#xff0c;請陳述理由。 同樣&#xff0c;分析…

JVM學習筆記(一):Java內存區域

由于Java程序是交由JVM執行的&#xff0c;所以我們在談Java內存區域劃分的時候事實上是指JVM內存區域劃分。在討論JVM內存區域劃分之前&#xff0c;先來看一下Java程序具體執行的過程&#xff1a; 首先Java源代碼文件(.java后綴)會被Java編譯器編譯為字節碼文件(.class后綴)&am…

EdgeRouter X設置外網遠程訪問和HTTPS連接指定出口網關

EdgeRouter X雖然小巧&#xff0c;但功能強大&#xff0c;為方便遠程管理&#xff0c;必須對防火墻進行設置&#xff0c;允許從外部進行訪問&#xff0c;由于公網的80、443端口都已被運營商關閉&#xff0c;必須設置端口轉發才能從外部訪問。一、設置外網遠程訪問通過瀏覽器進入…