時(shí)間:2023-07-05 21:00:01 | 來源:網(wǎng)站運(yùn)營
時(shí)間:2023-07-05 21:00:01 來源:網(wǎng)站運(yùn)營
手把手教你用 SVG 符號和 CSS 變量做出彩色圖標(biāo):簡評:使用圖片和 CSS 樣式來制作網(wǎng)頁圖標(biāo)的日子已經(jīng)過去了,隨著網(wǎng)頁字體的爆發(fā),圖標(biāo)字體成為展示圖標(biāo)的第一解決方案。字體都是向量,所以你不必?fù)?dān)心分辨率的問題。它們能作為文本來用 CSS 屬性修飾,所以你能夠完全掌控它們的大小,顏色以及樣式。還可以添加變換,效果以及裝飾比如旋轉(zhuǎn),下劃線或陰影。
太長,不讀:這篇文章將深入探討怎么做以及為什么。如果你想理解整個(gè)過程,就繼續(xù)閱讀。如果想直接查看代碼,可以點(diǎn)擊 CodePen.
<svg xmlns="http://www.w3.org/2000/svg" style="display: none"> <symbol id="my-first-icon" viewBox="0 0 20 20"> <title>my-first-icon</title> <path d="..." /> </symbol></svg>
一次包含完整的 SVG 標(biāo)記并隱藏在 HTML 里。<svg> <use xlink:href="#my-first-icon" /></svg>
這樣就可以展示你之前的 SVG 圖標(biāo)了:xlink:href
屬性:這是你的實(shí)例和原始的 SVG 之間的鏈接。xlink:href
是一個(gè)被棄用的 SVG 屬性。即使大多數(shù)瀏覽器仍然支持,你都應(yīng)該使用 href
來代替它。問題是,有些瀏覽器比如 Safari 還不支持通過 href
屬性引用 SVG 資源,所以你還要提供 xlink:href
屬性。color
屬性對于 SVG 圖標(biāo)沒有任何作用:你必須使用 fill
屬性來定義一個(gè)顏色。這意味著它們不像圖標(biāo)字體那樣繼承父類的文本顏色,但你仍然可以用 CSS 來為它們添加樣式。// HTML<svg class="icon"> <use xlink:href="#my-first-icon" /></svg>// CSS.icon { width: 100px; height: 100px; fill: red;}
這里,你可以用不同的填充顏色創(chuàng)建另一個(gè)同樣的圖標(biāo)實(shí)例。// HTML<svg class="icon icon-red"> <use xlink:href="#my-first-icon" /></svg><svg class="icon icon-blue"> <use xlink:href="#my-first-icon" /></svg>// CSS.icon { width: 100px; height: 100px;}.icon-red { fill: red;}.icon-blue { fill: blue;}
這會起作用,但不是我們確切想要的。到這里,我們剛才完成的步驟可以得到一個(gè)常規(guī)的圖標(biāo)字體。我們想要的是對于圖標(biāo)的每個(gè)部分可以有不同的顏色。我們想要用不同的顏色填充每個(gè) path 而不用更改其他實(shí)例,必要的時(shí)候可以重寫。// HTML<svg xmlns="http://www.w3.org/2000/svg" style="display: none"> <symbol id="my-first-icon" viewBox="0 0 20 20"> <title>my-first-icon</title> <path class="path1" d="..." /> <path class="path2" d="..." /> <path class="path3" d="..." /> </symbol></svg><svg class="icon icon-colors"> <use xlink:href="#my-first-icon" /></svg>// CSS.icon-colors .path1 { fill: red;}.icon-colors .path2 { fill: green;}.icon-colors .path3 { fill: blue;}
然而這并沒什么用。.path1
, .path2
和 .path3
添加樣式,就好像它們被 .icon-colors
嵌套一樣,但技術(shù)上來說并非如此。<use>
不是一個(gè)被你定義的 SVG 的占位符。 它是一個(gè)引用,復(fù)制了指向暗處的 DOM 的內(nèi)容。?body
分配一個(gè)文本顏色,所有頁面中的文本都會繼承這個(gè)顏色,除非顏色被重寫。祖先不知道孩子,但可繼承的樣式被傳遞下來。fill
屬性。再看一次,你會看到我們聲明的 fill
顏色被添加到實(shí)例中,而不是定義的 SVG。這就是我們能夠?yàn)槊總€(gè)實(shí)例添加不同顏色的原因。fill
屬性。.parent { --custom-property: red; color: var(--custom-property);}
所有 .parent
的孩子都會有紅色的文本。.parent { --custom-property: red;}.child { color: var(--custom-property);}
所有嵌套在 .parent
的 .child
元素也會有紅色的文本。fill
屬性,然后把它們的值設(shè)置為不同的 CSS 變量。這樣一來,我們就能分配不同的顏色了。// HTML<svg xmlns="http://www.w3.org/2000/svg" style="display: none"> <symbol id="my-first-icon" viewBox="0 0 20 20"> <title>my-first-icon</title> <path fill="var(--color-1)" d="..." /> <path fill="var(--color-2)" d="..." /> <path fill="var(--color-3)" d="..." /> </symbol></svg><svg class="icon icon-colors"> <use xlink:href="#my-first-icon" /></svg>// CSS.icon-colors { --color-1: #c13127; --color-2: #ef5b49; --color-3: #cacaea;}
然后……大功告成!?// HTML<svg class="icon icon-colors-alt"> <use xlink:href="#my-first-icon" /></svg>// CSS.icon-colors-alt { --color-1: brown; --color-2: yellow; --color-3: pink;}
如果你只想使用單色的圖標(biāo),你不用在每個(gè) CSS 變量里重復(fù)相同的顏色。你可以使用單個(gè) fill
來代替:因?yàn)?CSS 變量沒有被定義,所以將會回滾到你的 fill
聲明。.icon-monochrome { fill: grey;}
你的 fill
聲明會起作用因?yàn)?fill
屬性的值在原始的 SVG 上是沒有定義的 CSS 變量。#ff0000
,那就叫它 --red
。語義性意味著這種顏色是怎么用的就叫什么。比如你用 #ff0000
填充咖啡杯把手,你就叫它 --cup-handle-color
。#ff0000
不僅可以用來填充咖啡杯把手,還可以為其他東西上色。當(dāng)別的圖標(biāo)需要上紅色時(shí),一個(gè) --red
的 CSS 變量是可以重用的。畢竟,這就是 CSS 實(shí)用至上原則的體現(xiàn),它也的確是個(gè)好體制。--cup-handle-color
在這種情況下這樣才比較有意義。當(dāng)你想要改變某個(gè)圖標(biāo)的部分顏色時(shí),你瞬間就能知道它是什么,應(yīng)該重寫成什么。類名和你分配的無論什么顏色都能保持關(guān)聯(lián)。:root
里定義你所有的 CSS 變量。這樣一來可以把所有的變量放在同一個(gè)地方,并允許你“共享“類似的顏色。 :root
有最低的優(yōu)先權(quán),所以很容易可以重寫它。:root { --color-1: red; --color-2: green; --color-3: blue; --color-4: var(--color-1);}.icon-colors-alt { --color-1: brown; --color-2: yellow; --color-3: pink; --color-4: orange;}
然而,這種方法有一些主要的缺點(diǎn)。首先,讓顏色的定義和它們各自的圖標(biāo)分離會變得混亂。當(dāng)你想要重寫它們時(shí),你必須在 :root
和當(dāng)前的類之間往返。更重要的是,它不會限制你的 CSS 變量,從而避免你使用相同的名字。--fill-color
。它簡單易懂,當(dāng)你只想用一種顏色填充所有的圖標(biāo)時(shí),這種方式也比較行得通。如果我必須在 :root
中聲明所有的變量,我不能有多個(gè) --fill-color
。我必須定義 --fill-color-1
, --fill-color-2
等等,或者使用命名空間比如 --star-fill-color
, --cup-fill-color
。var()
函數(shù)可以將第二個(gè)參數(shù)作為默認(rèn)值。<svg xmlns="http://www.w3.org/2000/svg" style="display: none"> <symbol id="my-first-icon" viewBox="0 0 20 20"> <title>my-first-icon</title> <path fill="var(--color-1, red)" d="..." /> <path fill="var(--color-2, blue)" d="..." /> <path fill="var(--color-3, green)" d="..." /> </symbol></svg>
除非你定義 --color-1
,--color-2
和 --color-3
, 否則圖標(biāo)會使用默認(rèn)的值為每個(gè) <path>
填充顏色。這解決了之前使用 :root
時(shí)全局范圍的問題,但是要注意:你現(xiàn)在使用了默認(rèn)值,并且它正在生效。結(jié)果是,你不能夠使用單個(gè) fill
聲明來定義單色的圖標(biāo)了。你必須為每個(gè) CSS 變量分配顏色,一個(gè)一個(gè)地。fill
屬性設(shè)置回滾顏色來實(shí)現(xiàn):當(dāng)支持 CSS 變量時(shí),它不會生效,如果不支持,你的 fill
聲明才會生效。如果你使用 Sass,可以抽象到@mixin
里:@mixin icon-colors($fallback: black) { fill: $fallback; @content;}
現(xiàn)在我們可以定義我們的顏色方案而不用擔(dān)心瀏覽器兼容問題了。.cup { @include icon-colors() { --cup-color: red; --smoke-color: grey; };}.cup-alt { @include icon-colors(green) { --cup-color: green; --smoke-color: grey; };}
如果你想要了解更多 SVG 的內(nèi)容,我推薦閱讀 Sara Soueidan 的博客。原文鏈接:Let’s make multi-colored icons with SVG symbols and CSS variables
關(guān)鍵詞:變量,把手,符號,彩色
客戶&案例
營銷資訊
關(guān)于我們
微信公眾號
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。