簡介 因爲SVG自身的矢量性質,無論在什麼狀況下,圖標都很清晰,能夠適應不一樣尺寸大小和不一樣分辨率。不用擔憂模糊和鋸齒。同時還能更改圖標的填充顏色。javascript
CSS雪碧圖和SVG雪碧圖 傳統的CSS圖標能夠分爲圖片圖標和字體圖標。css
圖片圖標是將全部的icon整合到一張圖中,而後經過定位獲取其中的某個圖標。優勢是管理簡單,網絡請求少。缺點是在高像素屏幕上圖標和周邊內容相比會顯得比較模糊;大小固定;大多數樣式沒法修改,單個圖標使用場景有限。java
相對來講字體圖標會好不少。字體圖標的基本原理是將Icon定義爲字體圖像, 在CSS中用@font-face引入Icon Font自定義字體, 再利用font-family和字符碼顯示出指定的圖標。git
@font-face {
font-family: 'iconfont';
src: url(/res/icon2.ttf) format('truetype');
}
.icon2 {
font-family: 'iconfont';
}
複製代碼
字體圖標的優勢是能夠修改圖標的顏色和大小(font-size),網絡請求少。缺點就是添加圖標比較麻煩,圖標放大後有可能帶有鋸齒。跟SVG圖標相比,字體圖標能夠修改的樣式屬性也是頗有限的。github
相對於圖片圖標和字體圖標,SVG圖標能夠保持清晰的無限伸縮、具備較多的樣式能夠動態更改。網絡
SVG圖標 SVG在HTML代碼中是以SVG代碼節點存在而不是一個圖標連接的引用,這是它得以修改樣式的前提。但它又不是在須要用到的地方直接將SVG代碼添加上去,而是有固定的地方來管理全部的圖標,只需定義每一個圖標的Id,在須要用到的地方直接經過Id來引用便可。這種使用方式使得圖標在使用時不會被複雜的SVG代碼影響到業務代碼的可讀性,同時最主要的是能夠複用SVG圖標和統一管理。svg
SVG能夠作到這一點主要跟SVG中的兩個子標籤< symbol >、< use >相關。字體
symbol標籤 在SVG雪碧圖的使用中,< symbol >標籤用於定義圖標內容。動畫
symbol元素是什麼呢?url
symbol元素用來定義一個圖形模板對象,只是單單的定義不會渲染出來,定義後能夠在自身所在的SVG中或者其餘的SVG中經過< use >標籤元素實例化圖標,也就是經過< use >引用從而被渲染出來。symbol裏面能夠添加任意的SVG繪圖元素,包括動畫,但不包括< defs >,除了不顯示外基本和SVG跟標籤< svg >標籤差很少,一樣能夠設置viewbox這些屬性。
咱們在定義圖標時,每個symbol表明一個圖標。除了不顯示外,整個< symbol >就是一個完成的SVG圖標。
<svg>
<symbol id="svg-test" viewBox="0 0 26 26">
<desc>居中對齊</desc>
<path d="M7,9h12c0.5,0,1-0.5,1-1s-0.5-1-1-1H7C6.5,7,6,7.5,6,8S6.5,9,7,9z"/>
<path d="M19,17H7c-0.5,0-1,0.5-1,1s0.5,1,1,1h12c0.5,0,1-0.5,1-1S19.5,17,19,17z"/>
<path d="M10,12c-0.5,0-1,0.5-1,1s0.5,1,1,1h6c0.5,0,1-0.5,1-1s-0.5-1-1-1H10z"/>
</symbol>
<symbol id="svg-tool-stroke-5" viewBox="0 0 30 16" >
<desc>描邊5</desc>
<rect x="-10" y="6" width="7" height="2"/>
<rect x="-1" y="6" width="2" height="2"/>
<rect x="3" y="6" width="7" height="2"/>
<rect x="12" y="6" width="2" height="2"/>
<rect x="16" y="6" width="7" height="2"/>
<rect x="25" y="6" width="2" height="2"/>
<rect x="29" y="6" width="7" height="2"/>
<rect x="38" y="6" width="2" height="2"/>
</symbol>
</svg>
複製代碼
須要留意的是,
<svg id="defs-svg">
<linearGradient id="linear-gradient" x1="0.122" y1="0.147" x2="0.902" y2="0.872" gradientUnits="objectBoundingBox"> <stop offset="0" stop-color="#f4d039"/> <stop offset="1" stop-color="#f73"/> </linearGradient> </svg> 複製代碼
<svg id="sym-svg">
<symbol id="svg-tool-rect" viewBox="0 0 30 16" > <desc>矩形</desc> <rect x="0" y="0" width="24" height="14" fill="url(#linear-gradient)"/> </symbol> </svg>
複製代碼
SVG圖標的定義必定要在使用前面,也就是< symbol >
標籤必定要在< use >標籤前面,通常咱們在文檔流的頭部引入圖標的定義,確保整個文檔流任意地方均可以用到咱們定義的圖標。同時將圖標處理成不可見。#defs-svg 這個SVG在文檔流中是不能被隱藏的,隱藏後那些漸變濾鏡等效果就沒法使用,因此通常設置寬高爲0,層級最低。而#sym-svg能夠被隱藏,隱藏後不會印象圖標的使用。
use標籤 < use >標籤是一個引用的標籤,能夠經過節點id引用定義在< defs >中的元素,也能夠引用< symbol >標籤。
use標籤有兩個做用:
一、可重複調用
二、跨SVG調用
<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>
<svg width="500" height="110"><use xlink:href="#shape" x="50" y="50" /></svg>
<!-- 直接調用上一節定義好的symbol -->
<svg width="500" height="110"><use xlink:href="#svg-tool-rect" x="50" y="100" /></svg>
複製代碼
< use >是SVG圖標使用原理中的一個關鍵點,咱們能夠把SVG圖標所有定義在一個SVG中,統一處理。在須要使用的地方再從新建立一個SVG,經過use標籤來調用圖標。
這樣作的好處是能夠下降圖標代碼的重複使用、減小圖標代碼對業務代碼的影響。
更改SVG圖標的樣式 咱們經過< use >標籤添加到svg中圖標,能夠更改SVG的一些樣式,如fill,stroke等,而後經過樣式繼承,將屬性值繼承到子元素中,從而起到更改圖標樣式的做用。
要更改填充色,首先在symbol下定義的圖標自身標籤上不能帶有顏色,而後在使用時咱們直接改SVG的fill,這個fill的顏色值會繼承到裏面去。若是咱們在symbol裏面已經定義好了顏色的是沒法在使用時更改的。
<svg>
<symbol id="svg-test" viewBox="0 0 26 26">
<desc>居中對齊</desc>
<path d="M7,9h12c0.5,0,1-0.5,1-1s-0.5-1-1-1H7C6.5,7,6,7.5,6,8S6.5,9,7,9z"/>
<path d="M19,17H7c-0.5,0-1,0.5-1,1s0.5,1,1,1h12c0.5,0,1-0.5,1-1S19.5,17,19,17z"/>
<path d="M10,12c-0.5,0-1,0.5-1,1s0.5,1,1,1h6c0.5,0,1-0.5,1-1s-0.5-1-1-1H10z"/>
</symbol>
</svg>
<svg fill="red">
<use xlink:href="#svg-test"/>
</svg>
<svg fill="blue">
<use xlink:href="#svg-test"/>
</svg>
複製代碼
如何更改圖標中的多個顏色
根據上面描述知道,若是按照上面的方式,那可以更改的只有圖標中的一種顏色。固然是能夠設置多個顏色。這裏使用到css的自定義屬性 CSS Custom Properties
須要對< symbol >裏面的圖標代碼進行更改,將圖形的顏色設置爲fill: var(–*[, default])的形式。
<symbol id="icon-flag" width="150" height="100" viewBox="0 0 3 2">
<rect width="1" height="2" x="0" style="fill: var(--color0, #008d46)" />
<rect width="1" height="2" x="1" style="fill: var(--color1, #fff)"/>
<rect width="1" height="2" x="2" style="fill: var(--color2, #d2232c)"/>
</symbol>
複製代碼
定義css樣式
.flag-belgium {
--color0: #201b18;
--color1: #f1ee3d;
--color2: #dc352f;
}
複製代碼
<svg class="icon">
<use xlink:href="#icon-flag"/> </svg>
<svg class="icon flag-belgium">
<use xlink:href="#icon-flag"/> </svg>
複製代碼
< symbol >中的標籤在獲取填充色時,會先獲取–color的顏色,若是顏色值不存在則獲取默認色值。
這就是如何在SVG雪碧圖的製做原理,主要包含兩步,一步是使用