整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          使用 SVG 符號和 CSS 變量實現(xiàn)多彩圖標(biāo)

          使用 SVG 符號和 CSS 變量實現(xiàn)多彩圖標(biāo)

          用 SVG 符號和 CSS 變量實現(xiàn)多彩圖標(biāo)

          使用圖片和 CSS 精靈制作 web 圖標(biāo)的日子一去不復(fù)返了。隨著 web 字體的爆發(fā),圖標(biāo)字體已經(jīng)成為在你的 web 項目中顯示圖標(biāo)的第一解決方案。

          字體是矢量,所以你無須擔(dān)心分辨率的問題。他們和文本一樣因為擁有 CSS 屬性,那就意味著,你完全可以應(yīng)用 size 、 colorstyle 。你可以添加轉(zhuǎn)換、特效和裝飾,比如旋轉(zhuǎn)、下劃線或者陰影。

          怪不得類似 Font Awesome 這類項目僅僅在 npm 至今已經(jīng)被下載了超過 1500 萬次。

          可是圖標(biāo)字體并不完美, 這就是為什么越來越多的人使用行內(nèi) SVG 。CSS Tricks 寫了圖標(biāo)字體劣于原生 SVG 元素的地方:銳利度、定位或者是因為跨域加載、特定瀏覽器錯誤和廣告屏蔽器等原因?qū)е碌氖 ,F(xiàn)在你可以規(guī)避絕大多數(shù)這些問題了,總體上使用圖標(biāo)字體是一個安全的選擇。

          然而,還是有一件事情對于圖標(biāo)字體來說是絕對不可能的:多色支持。只有 SVG 可以做到。

          摘要 :這篇博文深入闡述怎么做和為什么。如果你想理解整個思維過程,推薦閱讀。否則你可以直接在 CodePen 看最終代碼。

          設(shè)置 SVG 標(biāo)志圖標(biāo)

          行內(nèi) SVG 的問題是,它會非常冗長。你肯定不想每次使用同一個圖標(biāo)的時候,還需要復(fù)制/粘貼所有坐標(biāo)。這將會非常重復(fù),很難閱讀,更難維護(hù)。

          通過 SVG 符號圖標(biāo),你只需擁有一個 SVG 元素,然后在每個需要的地方引用就好了。

          先添加行內(nèi) SVG ,隱藏它之后,再用 <symbol> 包裹它,用 id 對其進(jì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 d="..." /> </symbol> </svg>

          整個 SVG 標(biāo)記被一次性包裹并且在 HTML 中被隱藏。

          然后,所有你要做的是用一個 <use> 標(biāo)簽將圖標(biāo)實例化。

          <svg> <use xlink:href="#my-first-icon" /> </svg>

          這將會顯示一個初始 SVG 圖標(biāo)的副本。

          **就是這樣了!**看起來很棒,是吧?

          你可能注意到了這個有趣的 xlink:href 屬性:這是你的實例與初始 SVG 之間的鏈接。

          需要提到的是 xlink:href 是一個棄用的 SVG 屬性。盡管大多數(shù)瀏覽器仍然支持,你應(yīng)該用 **href** 替代。現(xiàn)在的問題是,一些瀏覽器比如 Safari 不支持使用 href 進(jìn)行 SVG 資源引用,因此你仍然需要提供 xlink:href 選項。

          安全起見,兩個都用吧。

          添加一些顏色

          不像是字體, color 對于 SVG 圖標(biāo)沒有任何作用:你必須使用 fill 屬性來定義一個顏色。這意味著他們將不會像圖標(biāo)字體一樣繼承父文本顏色,但是你仍然可以在 CSS 中定義它們的樣式。

          // HTML <svg class="icon"> <use xlink:href="#my-first-icon" /> </svg> // CSS .icon { width: 100px; height: 100px; fill: red; }

          在這里,你可以使用不同的填充顏色創(chuàng)建同一個圖標(biāo)的不同實例。

          // 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; }

          這樣就可以生效了,但是不完全符合我們的預(yù)期。目前為止,我們所有做的事情可以使用一個普通的圖標(biāo)字體來實現(xiàn)。我們想要的是在圖標(biāo)的位置可以有不同的顏色。我們想要向每個路徑上填充不同顏色,而不需要改變其他實例,我們想要能夠在必要的時候重寫它。

          首先,你可能會受到依賴于特性的誘惑。

          // 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; }

          不起作用。

          我們嘗試設(shè)置 .path1 、 .path2.path3 的樣式,仿佛他們被嵌套在 .icon-colors 里,但是嚴(yán)格來說,并非如此。 <use> 標(biāo)簽不是一個會被你的 SVG 定義替代的占位符。這是一個引用將它所指向內(nèi)容復(fù)制為 shadow DOM 。

          **那接下來我們該怎么辦?**當(dāng)子項不在 DOM 中時,我們?nèi)绾尾拍苡靡粋€區(qū)域性的方式影響子項?

          CSS 變量拯救世界

          在 CSS 中,一些屬性從父元素繼承給子元素。如果你將一個文本顏色分配給 body ,這一頁中所有文本將會繼承那個顏色直到被重寫。父元素沒有意識到子元素,但是可繼承的樣式仍然繼續(xù)傳播。

          在我們之前的例子里,我們繼承了填充屬性?;仡^看,你會看到我們聲明填充顏色的類被附加在了實例上,而不是定義上。這就是我們能夠為同一定義的每個不同實體賦予不同顏色的原因。

          現(xiàn)在有個問題:我們想傳遞不同顏色給原始 SVG 的不同路徑,但是只能從一個 fill 屬性里繼承。

          這就需要 CSS 變量了。

          就像任何其它屬性一樣, CSS 變量在規(guī)則集里被聲明。你可以用任意命名,分配任何有效的 CSS 值。然后,你為它自己或者其它子屬性,像一個值一樣聲明它,并且這將被繼承。

          .parent { --custom-property: red; color: var(--custom-property); }

          所有 .parent 的子項都有紅色文本。

          .parent { --custom-property: red; } .child { color: var(--custom-property); }

          所有嵌套在 .parent 標(biāo)簽里的 .child 都有紅色文本。

          現(xiàn)在,讓我們把這個概念應(yīng)用到 SVG 符號里去。我們將在 SVG 定義的每個部分使用 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; }

          然后… 生效了 !

          現(xiàn)在開始,為了用不同的顏色方案創(chuàng)建實例,我們所需要做的是創(chuàng)建一個新類。

          // 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),你不必在每個 CSS 變量中重復(fù)同樣的顏色。相反,你可以聲明一個單一 fill 規(guī)則:因為如果 CSS 變量沒有被定義,它將會回到你的 fill 聲明。

          .icon-monochrome { fill: grey; }

          你的 fill 聲明將會生效,因為初始 SVG 的 fill 屬性被未設(shè)置的 CSS 變量值定義。

          怎樣命名我的 CSS 變量?

          當(dāng)提到在 CSS 中命名,通常有兩條途徑:描述的或者語義的。描述的意思是告訴一個顏色是什么:如果你存儲了 #ff0000 你可以叫它 --red 。語義的意思是告訴顏色它將會被如何應(yīng)用:如果你使用 #ff0000 來給一個咖啡杯把手賦予顏色,你可以叫它 --cup-handle-color

          描述的命名也許是你的本能??雌饋砀纱?,因為#ff0000 除了咖啡杯把手還有更多地方可以被使用。一個 --red CSS 變量可被復(fù)用于其他需要變成紅色的圖標(biāo)路徑。畢竟,這是實用主義在 CSS 中的工作方式。并且是一個良好的系統(tǒng)。

          問題是,在我們的案例里,我們不能把零散的類應(yīng)用于我們想設(shè)置樣式的標(biāo)簽。實用主義原則不能應(yīng)用,因為我們對于每個圖標(biāo)有單獨的引用,我們不得不通過類的變化來設(shè)置樣式。

          使用語義類命名,例如 --cup-handle-color ,對于這個情況更有用。當(dāng)你想改變圖標(biāo)一部分的顏色時,你立即知道這是什么以及需要重寫什么。無論你分配什么顏色,類命名將會一直關(guān)聯(lián)。

          默認(rèn)還是不要默認(rèn),這是個問題

          將你的圖標(biāo)的多色版本設(shè)置成默認(rèn)狀態(tài)是很有誘惑力的選擇。這樣,你無需設(shè)置額外樣式,只需要在必要的時候可以添加你自己的類。

          有兩個方法可以實現(xiàn)::rootvar() default 。

          :root

          :root 選擇器中你可以定義所有你的 CSS 變量。這將會把它們統(tǒng)一放在一個位置,允許你『分享』相似的顏色。 :root 擁有最低的優(yōu)先度,因此可以很容易地被重寫。

          :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; }

          然而,這個方法有一個主要缺點。首先,將顏色定義與各自的圖標(biāo)分離可能會有些讓人疑惑。當(dāng)你決定重寫他們,你必須在類與 :root 選擇器之間來回操作。但是更重要的是,它不允許你去關(guān)聯(lián)你的 CSS 變量,因此讓你不能復(fù)用同一個名字。

          大多數(shù)時候,當(dāng)一個圖標(biāo)只用一種顏色,我用 --fill-color 名稱。簡單,易懂,對于所有僅需要一種顏色的圖標(biāo)非常有意義。如果我必須在 :root 聲明中聲明所有變量,我就不會有幾個 --fill-color。我將會被迫定義 --fill-color-1--fill-color-2 或者使用類似 --star-fill-color , --cup-fill-color 的命名空間。

          var() 默認(rèn)

          你可以用 var() 功能來把一個 CSS 變量分配給一個屬性,并且它的第二個參數(shù)可以設(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)將會使用你為每個 <path> 設(shè)置的默認(rèn)值。這解決了當(dāng)我們使用 :root 時的全局關(guān)聯(lián)問題,但是請小心:你現(xiàn)在有一個默認(rèn)值,并且它將會生效。結(jié)果是,你再也不能使用單一的 fill 聲明來定義單色圖標(biāo)了。你將不得不一個接一個地給每個使用于這個圖標(biāo)的 CSS 變量分配顏色。

          設(shè)置默認(rèn)值會很有用,但是這是一個折中方案。我建議你不要形成習(xí)慣,只在對給定項目有幫助的時候做這件事情。

          How browser-friendly is all that?

          CSS 變量與大多數(shù)現(xiàn)代瀏覽器兼容,但是就像你想的那樣, Internet Explorer 完全不兼容。因為微軟要支持 Edge 終止了 IE11 開發(fā), IE 以后也沒有機(jī)會趕上時代了。

          現(xiàn)在,僅僅是因為一個功能不被某個瀏覽器(而你必須適配)兼容,這不意味著你必須全盤放棄它。在這種情況下,考慮下優(yōu)雅降級:給現(xiàn)代瀏覽器提供多彩圖標(biāo),給落后瀏覽器提供備份的填充顏色。

          你想要做的是設(shè)置一個僅在 CSS 變量不被支持時觸發(fā)的聲明。這可以通過設(shè)置備份顏色的 fill 屬性實現(xiàn):如果 CSS 變量不被支持,它甚至不會被納入考慮。如果它們不能被支持,你的 fill 聲明將會生效。

          如果你使用 Sass 的話,這個可以被抽象為一個 @mixin 。

          @mixin icon-colors($fallback: black) { fill: $fallback; @content; }

          現(xiàn)在,你可以任意定義顏色方案而無需考慮瀏覽器兼容問題了。

          .cup { @include icon-colors() { --cup-color: red; --smoke-color: grey; }; } .cup-alt { @include icon-colors(green) { --cup-color: green; --smoke-color: grey; }; }

          在 mixin 中通過 @content 傳遞 CSS 變量也是一個可選項。如果你在外面做這件事,被編譯的 CSS 將會變得一樣。但是它有助于被打包在一起:你可以在你編輯器中折疊片段然后用眼睛分辨在一起的聲明。

          在不同的瀏覽器中查看這個 pen 。在最新版本的 Firefox , Chrome 和 Safari 中,最后兩只杯子各自擁有紅色杯身灰色煙氣和藍(lán)色杯身灰色煙氣。在 IE 和 版本號小于 15 的 Edge 中,第三個杯子的杯身與煙氣全部都是紅色,第四個則全部是藍(lán)色! ?

          們都見過它們,它們保護(hù)我們的眼睛免受所有光線的傷害。 這些是暗模式按鈕,這里是如何在 HTML、CSS 和 JS 中創(chuàng)建自己的按鈕!

          我們要做的第一件事是創(chuàng)建 HTML 文件。 我正在使用引導(dǎo)程序使按鈕看起來不錯。 我要做的第一件事是將引導(dǎo)程序鏈接到我的 HTML 文件,這樣我就可以訪問所有按鈕。

          <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-0evHe/X+R7YkIZDRvuzKMRqM+OrBnVFBL6DOitfPri4tjfHxaWutUpFmBp4vmVor" crossorigin="anonymous"><title>Dark mode</title></head><body></body></html>

          這是樣板 HTML 代碼。 現(xiàn)在我將添加按鈕并鏈接 css 樣式表。 如果您正在跟進(jìn),請在與您的 HTML 文件相同的目錄中創(chuàng)建一個 style.css 文件。

          <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="stylesheet" href="style.css"><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-0evHe/X+R7YkIZDRvuzKMRqM+OrBnVFBL6DOitfPri4tjfHxaWutUpFmBp4vmVor" crossorigin="anonymous"><title>Dark mode</title></head><body><button type="button" class="btn btn-dark">Dark Mode</button></body></html>

          我使用了引導(dǎo) btn-dark 類,它只是一個簡單的深色按鈕。

          現(xiàn)在為 css。 我將創(chuàng)建一個 .dark 類,但我知道我們還沒有分配它。 那將適用于黑暗模式。

          .dark {background-color: black;}

          現(xiàn)在,我們將添加一些 javascript。 我們不會制作新文件,因為它不會那么多。 我將首先給按鈕一個“按鈕”類,然后從那里開始工作。我將添加一個事件偵聽器,然后在單擊時,我將切換 HTML 主體類 dark 。然后我將向主體添加一個 ID,以便我們可以 使用 JavaScript 選擇它。然后我將更改文本和按鈕顏色,以便我們可以來回切換。

          <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="stylesheet" href="style.css"><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-0evHe/X+R7YkIZDRvuzKMRqM+OrBnVFBL6DOitfPri4tjfHxaWutUpFmBp4vmVor" crossorigin="anonymous"><title>Dark mode</title></head><body id="body" class=""><button type="button" class="btn btn-dark" class="button">Dark Mode</button><script>let button=document.querySelector('button');let body=document.getElementById('body');button.addEventListener('click', ()=> {body.classList.toggle('dark');if(body.classList.contains('dark')) {button.style.backgroundColor="white";button.innerHTML="Light Mode"button.style.color="black";} else {button.style.backgroundColor="black";button.innerHTML="Dark Mode"button.style.color="white";}});</script></body></html>

          僅此而已! 謝謝閱讀。 如果你喜歡,請關(guān)注!

          evExpress WinForms擁有180+組件和UI庫,能為Windows Forms平臺創(chuàng)建具有影響力的業(yè)務(wù)解決方案。DevExpress WinForms能完美構(gòu)建流暢、美觀且易于使用的應(yīng)用程序,無論是Office風(fēng)格的界面,還是分析處理大批量的業(yè)務(wù)數(shù)據(jù),它都能輕松勝任!

          DevExpress WinForm 已正式發(fā)布了重大版本——v21.2,此版本的數(shù)據(jù)網(wǎng)格控件擁有全新的HTML & CSS模板!歡迎下載最新版體驗!

          DevExpress WinForms Subscription官方最新版免費(fèi)下載試用,歷史版本下載,在線文檔和幫助文件下載-慧都網(wǎng)

          Data Grid

          WinExplorer視圖 - HTML 模板

          新版本的WinForms Data Grid的WinExplorer 視圖現(xiàn)在支持 HTML/CSS 模板,選項包括:

          • 'WinExplorerViewStyleOptions.HtmlTemplate' 屬性現(xiàn)在可用于每個單獨的 WinExplorer 視圖樣式(大圖標(biāo)、圖塊、詳細(xì)信息等),使用此屬性為樣式應(yīng)用默認(rèn) HTML 模板。
          • 'WinExplorerView.HtmlTemplates' 屬性存儲您的模板,要動態(tài)應(yīng)用 HTML 模板,請?zhí)幚怼癚ueryItemTemplate”事件。

          平鋪視圖 - HTML 模板

          您現(xiàn)在可以創(chuàng)建受 Web 啟發(fā)的圖塊并根據(jù)需要將它們綁定到數(shù)據(jù)字段。 要創(chuàng)建受 Web 啟發(fā)的磁貼,請將您的 HTML 模板分配給 'TileView.TileHtmlTemplate' 屬性。

          您可以創(chuàng)建多個 HTML 模板并將它們添加到 TileView.TileHtmlTemplates 集合中,處理 CustomItemTemplate 事件來將模板應(yīng)用到圖塊。

          命名占位符

          您現(xiàn)在可以使用字段名稱作為 CardCaptionFormat 和 RecordHeaderFormat 屬性的占位符。

          C#

          cardView1.CardCaptionFormat="Record # {0}, {Name}";

          在以前的版本中,您必須通過相應(yīng)網(wǎng)格列的索引來引用必填字段:

          C#

          cardView1.CardCaptionFormat="Record # {0}, {2}";

          列標(biāo)題中搜索框的新 'Text Search'模式

          列標(biāo)題中的搜索框現(xiàn)在提供全文搜索支持,在之前的版本(v21.1x) 中,搜索框改為使用過濾模式 - 與搜索字符串不匹配的值被隱藏。要激活文本搜索模式,請將“OptionsFilter.InHeaderSearchMode”屬性設(shè)置為“TextSearch”。

          注意:此選項在可見數(shù)據(jù)行中搜索(折疊和組行被忽略),并且在服務(wù)器模式下不起作用。

          .NET 5 設(shè)計器的數(shù)據(jù)源配置向?qū)?/span>

          需要(尚未實現(xiàn))Microsoft DataSet 組件的傳統(tǒng)數(shù)據(jù)源類型的向?qū)нx項不起作用,但您現(xiàn)在可以使用此向?qū)нB接現(xiàn)有的數(shù)據(jù)感知控件 到以下數(shù)據(jù)源類型:

          • ADO.NET 數(shù)據(jù)集
          • XPO
          • 實體框架
          • MongoDB
          • JSON
          • Excel 工作表
          • 未綁定或 xml 數(shù)據(jù)

          主站蜘蛛池模板: 在线观看视频一区二区| 国产激情无码一区二区| 无码少妇一区二区性色AV | 亚洲av成人一区二区三区在线播放| 亚洲一区二区三区免费在线观看| 国产精品亚洲专一区二区三区| 免费日本一区二区| 日韩精品无码免费一区二区三区| 一区二区免费国产在线观看| 中文字幕亚洲综合精品一区| 亚洲一区二区视频在线观看| 国产av一区二区精品久久凹凸| 免费av一区二区三区| 真实国产乱子伦精品一区二区三区| 国精产品999一区二区三区有限| 久久精品国产亚洲一区二区| 国产成人无码精品一区在线观看| 人妻精品无码一区二区三区 | 亚洲AV无码一区二区三区电影| 中文字幕一区二区三区在线播放| 国产精品无码一区二区三区在| 亚洲一区二区三区首页| 无码一区二区三区老色鬼| 中文字幕色AV一区二区三区 | 亚洲伦理一区二区| 日本不卡在线一区二区三区视频| 国产一区二区三区免费观看在线 | 成人精品一区二区激情| 丝袜美腿一区二区三区| 亚洲AV日韩综合一区| 国产品无码一区二区三区在线| 久久久久人妻精品一区三寸| 精品欧美一区二区在线观看| 在线不卡一区二区三区日韩| 国产精品视频免费一区二区| 日韩免费一区二区三区| 色视频综合无码一区二区三区| 日本精品一区二区三区四区| 中文无码精品一区二区三区| 日韩精品一区二区三区大桥未久| 搡老熟女老女人一区二区|