在 React、Vue項(xiàng)目中使用SVG的方法
在一些現(xiàn)代的扁平化設(shè)計(jì)網(wǎng)站,特別是移動(dòng)端網(wǎng)站,經(jīng)常會(huì)包含許多簡(jiǎn)單而清晰的小圖標(biāo),例如網(wǎng)站圖標(biāo)、用戶的默認(rèn)頭像、移動(dòng)端網(wǎng)頁(yè)首頁(yè)底部固定的切換欄等,這些小圖標(biāo)一般都是由美工做好,可能會(huì)放到精靈圖上,前端再進(jìn)行裁切展示。
而實(shí)際上,這些簡(jiǎn)單的小圖標(biāo)完全沒必要讓美工來(lái)做,前端完全可以通過(guò) svg使用代碼把這些簡(jiǎn)單的圖標(biāo)畫出來(lái),并且,因?yàn)檫@些圖標(biāo)是用代碼描述出來(lái)的,所以如果想要修改這些圖標(biāo),例如改變圖標(biāo)的顏色、圖標(biāo)的形狀、大小等,都只是改幾行代碼的事情,非常簡(jiǎn)單,根本無(wú)需美工返工重做。
本文不是闡述如何利用 svg 來(lái)進(jìn)行畫圖的,不了解 svg的可以前往 這里查看, 本文主要說(shuō)一下如何在網(wǎng)站中使用 svg。
SVG在一般網(wǎng)頁(yè)中的使用
svg使用 XML 格式定義圖像,你也可以把它看做是一般的 HTML標(biāo)簽,鑲嵌在網(wǎng)頁(yè)中呈現(xiàn)出某種效果,在網(wǎng)頁(yè)中使用svg的基本示例如下:
<body> <svg width="100" height="100" version="1.1" xmlns="http://www.w3.org/2000/svg"> <rect width="100%" height="100%" style="fill:pink;stroke-width:1;stroke:rgb(0,0,0)"/> </svg></body>
效果如下:
可以看到,普通網(wǎng)頁(yè)中使用 svg是很簡(jiǎn)單的,只要你能把 svg圖標(biāo)畫出來(lái),在網(wǎng)頁(yè)中的呈現(xiàn)完全不是問(wèn)題。
在 Vue中使用 Svg
你完全可以像在 普通網(wǎng)頁(yè)中使用 svg那樣在Vue中使用,不過(guò),既然已經(jīng)是選擇 vue來(lái)組件化開發(fā)項(xiàng)目了,那么在一堆組件中,穿插一大段的 svg畢竟有點(diǎn)不太好看。
一種解決方法是,利用 svg的 use標(biāo)簽,不直接在主頁(yè)面中編寫繪制svg圖標(biāo)的代碼,而是把這一大段的代碼放到另外的文件中,然后使用 use引用這段繪制圖標(biāo)的代碼即可(好像餓了么移動(dòng)端就是這么干的)。
例如,將所有繪制 svg的代碼放到 svg-icon.vue文件中,所有圖標(biāo)的繪制代碼使用 symbol標(biāo)簽分隔開并單獨(dú)命名,避免錯(cuò)亂,然后將這個(gè)文件當(dāng)做是一個(gè)組件導(dǎo)出,在主頁(yè)面中引入此組件,接著,在需要 使用 svg圖標(biāo)的地方,通過(guò) use標(biāo)簽將其引入。
svg-draw.vue代碼示例如下:
<template> <svg xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" style={{position:'absolute',width:0,height:0}}> <defs> <symbol viewBox="0 0 26 31" id="location"> <path xmlns="http://www.w3.org/2000/svg" d="M512.571517 65.907059c-204.736964 0-370.715183 165.979242-370.715183 370.724393 0 94.440929 35.320437 180.625824 93.462648 246.083651 1.572822 2.690272 3.50994 5.225001 5.817496 7.531534l240.297878 251.597225c1.279133 1.864464 2.736321 3.64297 4.393054 5.298679 2.111081 2.111081 4.418636 3.90596 6.856152 5.402033 14.458293 10.06524 34.491559 8.658194 47.393403-4.242627 3.26537-3.263323 5.78782-6.987135 7.582699-10.960633L783.610536 690.24766c1.867534-1.866511 3.489474-3.88447 4.876054-6.010901 58.951647-65.640999 94.819552-152.431691 94.819552-247.604284C883.305119 231.886301 717.325877 65.907059 512.571517 65.907059zM512.390391 588.611865c-82.734306 0-149.814074-67.087954-149.814074-149.842727 0-82.753749 67.079768-149.833517 149.814074-149.833517 82.772168 0 149.851936 67.079768 149.851936 149.833517C662.242328 521.523911 595.161536 588.611865 512.390391 588.611865z" fill="#d81e06"/> </symbol> </defs> </svg></template>
整個(gè) vue組件導(dǎo)出一個(gè)大的 svg,此svg中包含了許多小的圖標(biāo),類似于精靈圖,每個(gè)圖標(biāo)使用 symbol分隔,并單獨(dú)命名以方便引用。
使用示例如下:
// index.vue ...<svg class="location-icon"> <use xlink:href="#location" rel="external nofollow" ></use></svg>...
然后,就可以看到網(wǎng)頁(yè)中順利出現(xiàn)對(duì)應(yīng)的 svg圖標(biāo)了:
不過(guò),還有個(gè)問(wèn)題,如果當(dāng)前網(wǎng)站需要用到的 svg圖標(biāo)很多,勢(shì)必就造成 svg-icon.vue這個(gè)文件體積逐漸變大,當(dāng)前網(wǎng)頁(yè)命名只需要用到其中一個(gè) svg圖標(biāo),結(jié)果你把幾百個(gè)圖標(biāo)的 svg代碼,全部加載了進(jìn)來(lái),明顯不太友好,最好是能夠按需加載,當(dāng)前網(wǎng)頁(yè)需要哪些圖標(biāo)就加載哪些,甚至一些可能出現(xiàn)可能不出現(xiàn)的圖標(biāo),也在該出現(xiàn)時(shí)再加載,如果沒有機(jī)會(huì)出現(xiàn),那么永遠(yuǎn)不加載。
Github上有很多此類的插件,我介紹一個(gè)我覺得很好用的插件:vue-svg-icon,簡(jiǎn)單易用、快速上手。
首先,安裝此插件,就不多說(shuō)了,安裝完成后,在項(xiàng)目的入口文件中注冊(cè)此插件以方便全局調(diào)用:
import Icon from 'vue-svg-icon/Icon.vue'Vue.component('icon', Icon)
然后在根目錄的 /src目錄下新建一個(gè) svg目錄(目前這個(gè)路徑只能是這樣,不可配置為其他路徑和目錄),然后再這個(gè)目錄中放入你想要使用的 svg圖標(biāo)的 svg文件即可。
例如一個(gè)微信圖標(biāo)的 svg如下:
<?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg t="1502683891821" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2885" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"> <defs> <style type="text/css"></style> </defs> <path d="M282.6 363.8c-23.7 0-47-15.7-47-38.9 0-23.7 23.3-38.9 46.5-38.9 23.7 0 38.9 15.2 38.9 38.9 0.5 23.2-15.1 38.9-38.4 38.9zM500.4 286c23.7 0 38.9 15.2 38.9 38.9 0 23.3-15.2 38.9-38.9 38.9-23.3 0-47-15.7-47-38.9 0-23.7 23.7-38.9 47-38.9z m167.7 84.5c9.8 0 19.7 0.5 30 1.8-27.3-125.6-161.4-218.7-314.4-218.7C212.4 153.6 72 270.3 72 418.3c0 85.9 46.5 155.6 124.8 210.2l-31.3 93.9 109.1-54.6c38.9 7.6 70.2 15.7 109.1 15.7 9.4 0 19.2-0.5 29.1-1.3-6.3-20.6-9.8-42.9-9.8-65.3-0.1-136 116.6-246.4 265.1-246.4z" p-id="2886"></path><path d="M772.7 573.9c-15.2 0-30.9-15.2-30.9-30.9 0.5-15.7 15.7-31.3 30.9-31.3 23.7 0 39.4 15.7 39.4 31.3-0.1 15.7-15.7 30.9-39.4 30.9z m-171.3 0c-15.2 0-30.9-15.2-30.9-30.9s15.7-31.3 30.9-31.3c23.7 0 38.9 15.7 38.9 31.3 0.5 15.7-15.2 30.9-38.9 30.9zM952 613.3C952 488.5 827.2 387 687.3 387c-148 0-264.7 101.5-264.7 226.3 0 124.8 116.7 225.8 264.7 225.8 31.3 0 62.6-8.1 93.5-15.7l85.9 47-23.7-77.8c62.5-47 109-109.1 109-179.3z" p-id="2887"> </path> </svg>
將上述代碼保存到一個(gè) .svg的文件中,例如 wx.svg,放到 /src/svg目錄中,這樣就完成了準(zhǔn)備工作。
接著,想要使用的話,很簡(jiǎn)單,直接在 vue組件中這么寫:
<template> <icon class="wx-icon" name="wx"></icon></template>
刷新頁(yè)面時(shí),打開控制臺(tái),可以看到頁(yè)面中加載了這個(gè) wx.svg文件,這樣,就實(shí)現(xiàn)了 svg文件的按需引入。
在 React中使用 Svg
在 React中使用Svg和 vue一樣,同樣存在 3種方案,一種是直接在 react的 reader方法中寫入 svg代碼,第二種則是將所有 svg繪制代碼放到一個(gè)文件中,然后將這個(gè)文件一次性載入,使用 use標(biāo)簽引用響應(yīng)的 svg圖案,第三種則是使用插件按需引入。
第一種直接在 渲染方法中寫入 svg的方法就不多說(shuō)了,第二種也很簡(jiǎn)單 ,和 vue一樣,只不過(guò)寫法上需要注意一下。
render() { return ( <svg xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" style={{position:'absolute',width:0,height:0}}> <defs> <symbol viewBox="0 0 26 31" id="location"> <path fill="#FFF" fillRule="evenodd" d="M22.116 22.601c-2.329 2.804-7.669 7.827-7.669 7.827-.799.762-2.094.763-2.897-.008 0 0-5.26-4.97-7.643-7.796C1.524 19.8 0 16.89 0 13.194 0 5.908 5.82 0 13 0s13 5.907 13 13.195c0 3.682-1.554 6.602-3.884 9.406zM18 13a5 5 0 1 0-10 0 5 5 0 0 0 10 0z"></path> </symbol> <symbol viewBox="0 0 14 8" id="arrow"> <path fill="#FFF" fillRule="evenodd" d="M5.588 6.588c.78.78 2.04.784 2.824 0l5.176-5.176c.78-.78.517-1.412-.582-1.412H.994C-.107 0-.372.628.412 1.412l5.176 5.176z"></path> </symbol> </svg> ) }
主要是需要注意,因?yàn)?react使用 jsx語(yǔ)法,不允許出現(xiàn) - 連字符,所以像 fill-rule這樣的屬性,就必須寫成 fillRule,引用的時(shí)候同樣如此。
// 引用的時(shí)候需要將 `xlink:href` 改寫成 xlinkHref<svg className="arrow-left"> <use xlinkhref="#arrow-left" rel="external nofollow" ></use> </svg>
第三種按需引入,只加載當(dāng)前需要的 svg形狀,同樣是將每一個(gè) svg圖片作為一個(gè)單獨(dú)的文件保存,然后再需要使用的地方進(jìn)行引用。 Github上有個(gè)項(xiàng)目 react-svg,這個(gè)項(xiàng)目?jī)?nèi)部其實(shí)是對(duì) SVGInjector的包裝,
安裝 react-svg之后,就可以像下面這樣使用了:
import ReactSVG from 'react-svg' ReactDOM.render( <ReactSVG path="atomic.svg" callback={svg => console.log(svg)} className="example" />, document.querySelector('.Root') )
一般都只是在使用小圖標(biāo)的時(shí)候才考慮 svg,而這些小圖標(biāo)一般都比較簡(jiǎn)約,繪制起來(lái)也沒什么難度,不過(guò)大部分情況下沒有必要自己來(lái)畫,很多網(wǎng)站都提供svg的圖標(biāo)下載,例如阿里的 iconfont,圖標(biāo)數(shù)量眾多,基本可以滿足絕大部分的需求,另外,類似的網(wǎng)站還有 easyicon 、 icomoon等。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue-cli3 配置開發(fā)與測(cè)試環(huán)境詳解
這篇文章主要介紹了vue-cli3 配置開發(fā)與測(cè)試環(huán)境詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05vue移動(dòng)端自適應(yīng)適配問(wèn)題詳解
這篇文章主要介紹了vue移動(dòng)端自適應(yīng)適配問(wèn)題,本文通過(guò)實(shí)例代碼詳解給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-04-04vue element項(xiàng)目引入icon圖標(biāo)的方法
這篇文章主要介紹了vue element項(xiàng)目引入icon圖標(biāo)的方法,本文圖文并茂給大家介紹的非常詳細(xì),需要的朋友可以參考下2018-06-06vue實(shí)現(xiàn)無(wú)限消息無(wú)縫滾動(dòng)
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)無(wú)限消息無(wú)縫滾動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04使用 Element UI Table 的 slot-scope方法
這篇文章主要介紹了使用 Element UI Table 的 slot-scope方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10