搜尋
首頁web前端css教學用CSS自定義屬性和尾風為主題染色

Color Theming with CSS Custom Properties and Tailwind

CSS自定義屬性不僅提高了代碼效率,還在CSS中創造了更多可能性,尤其在主題設計方面潛力巨大。 Atomic Smash團隊使用Tailwind CSS(一個實用程序類框架)編寫樣式。本文將探討如何使用自定義屬性進行主題設計,以及如何將其與Tailwind集成以最大限度地提高代碼的可重用性。本文不會講解Tailwind的入門使用——請查看官方文檔——但即使您是Tailwind新手,也可能會發現一些技巧很有用。

主題概述

假設我們有一個“號召性用語”(CTA)組件,包含標題、正文和按鈕。

為這種配色方案編寫常規(非Tailwind)CSS如下所示:

 <code>.cta { background-color: #742a2a; // 深红色 color: #ffffff; // 白色}  .cta__heading { background-color: #e53e3e; // 中等红色 color: #742a2a; } .cta__button { background-color: #e53e3e; }</code>

使用Tailwind,我們將在HTML中應用這些顏色作為實用程序類:

<code><div>
<h3 id="加入我們的郵件列表">加入我們的郵件列表</h3>
<div>
<p>搶先了解我們的新產品</p>
  註冊</div>
</div></code>

我故意省略了與基本配色方案無關的類,但您可以在此演示中查看完整的示例:

現在,如果我們想將不同的配色方案應用於我們的組件,我們需要覆蓋原始組件的顏色值。在沒有Tailwind的情況下,一種常見的方法是將主題類附加到組件本身,並在級聯中重新定義顏色值。因此,對於具有“.cta--blue”(使用BEM約定)修飾符類的組件,我們將應用藍色配色方案的CSS值:

 <code>.cta--blue { background-color: #2a4365; // 深蓝色} .cta--blue .cta__heading { background-color: #3182ce; // 中等蓝色 color: #2a4365; } .cta--blue .cta__button { background-color: #3182ce; }</code>

如果我們使用Sass或其他預處理器,則可以使用變量來簡化我們的工作,我們可能會嵌套.cta__heading和.cta__body選擇器。它並沒有使我們的代碼更簡潔,但通過在一個地方更新這些值,它確實使代碼更易於管理。

現在,假設我們有10種不同的配色方案,就像我最近在一個項目中的經歷一樣。我們的代碼開始變長,因為我們基本上重複了上述示例10次才能更改這些顏色值。現在想像一下,我們設計系統中的每個組件都需要10種配色方案,而且許多組件比我們簡單的CTA複雜得多。也許我們的主題也需要不同的字體。突然之間,我們需要編寫大量的CSS。

使用Tailwind進行主題設計

另一方面,如果我們使用Tailwind,則需要更改HTML本身中的多個類。即使我們使用JavaScript框架(如React或Vue),這也不是一項簡單的任務。為了確保在生產版本中刪除未使用的樣式,Tailwind不鼓勵使用字符串連接來創建類名(在撰寫本文時)。因此,構建我們的主題可能意味著將大量邏輯添加到我們的組件中。

使用自定義屬性進行主題設計

通過為我們的顏色主題使用自定義屬性,我們可以大幅減少需要編寫的代碼量,並減輕維護負擔。讓我們首先看看如何在常規CSS中做到這一點。

我們將自定義屬性定義為:root選擇器上的變量,使其成為全局變量。 (body選擇器同樣適用。)然後,我們可以使用這些變量在選擇器中替換顏色屬性值:

 <code>:root { --primary: #742a2a; // 深红色 --secondary: #e53e3e; // 中等红色} .cta { background-color: var(--primary); color: white; } .cta__heading { background-color: var(--secondary); color: var(--primary); } .cta__button { background-color: var(--secondary); }</code>

這就是真正神奇的地方:現在創建每個主題的代碼只需要更新這些自定義屬性值。無論我們在哪裡應用主題類,新值都會被繼承:

 <code>.th-blue { --primary: #2a4365; // 深蓝色 --secondary: #3182ce; // 中等蓝色}</code>

如果我們想要藍色配色方案,我們可以將.th-blue類應用於組件,甚至可以在標籤上使用它來應用頁面範圍的主題,然後根據需要在各個組件上覆蓋它。與組件特定類(例如原始代碼中的.cta--blue)相比,使用實用程序類可能會節省我們更多的代碼編寫工作,因為它可以應用於我們代碼庫中的任何位置。

處理舊版瀏覽器

與許多代理機構一樣,Atomic Smash的許多客戶仍然需要我們支持Internet Explorer 11。雖然在大多數情況下我都可以接受漸進增強方法(例如,為不支持CSS Grid的瀏覽器提供更簡單的回退佈局),但我發現主題設計是一個通常不允許輕鬆妥協的領域。客戶希望看到他們的品牌顏色和字體,即使是在舊版瀏覽器上也是如此。使用特性查詢提供回退將需要大量額外的工作,這將抵消使用自定義屬性的好處。為了克服這個問題,我們需要一個polyfill。

有幾個選項可以在IE 11中為自定義屬性提供polyfill。

postcss-custom-properties

第一個是使用名為postcss-custom-properties的PostCSS插件。如果您已經在工作流程中使用PostCSS,則添加此插件相當簡單。它的工作原理是處理您的CSS並輸出變量的結果作為屬性值。因此,如果您有以下CSS:

 <code>:root { --color: red; } h1 { color: var(--color); }</code>

處理後的結果將是:

 <code>h1 { color: red; color: var(--color); }</code>

不支持自定義屬性的瀏覽器將忽略第二個規則,並回退到常規屬性值。還有一個選項是從輸出中刪除具有自定義屬性的規則,因此文件大小會更小。這意味著沒有瀏覽器會獲得自定義屬性——如果您動態更新變量,這是一個問題——但是您可以將它們用於代碼中的靜態值而不會產生不良影響。

不幸的是,這個polyfill有一些限制:

  1. 您需要在配置中指定定義自定義屬性的文件(或文件)。
  2. 自定義屬性只能在:root選擇器上定義。

第一個限制相對微不足道,但第二個限制不幸地使這個polyfill完全無法用於我們的主題設計用例。這意味著我們無法在選擇器上重新定義變量來創建我們的主題。

ie11CustomProperties

此polyfill選項涉及提供客戶端腳本,而不是預處理CSS。我們可以將以下腳本添加到我們的head中,以確保polyfill只在IE 11中加載:

 <code>window.MSInputMethodContext && document.documentMode && document.write('');</code>

這允許我們像此處示例中一樣充分利用自定義屬性的優勢,因此這是我決定使用的解決方案。它有一個限制,即在style屬性中設置的自定義屬性不會被polyfill。但我已經針對上面的主題設計示例對其進行了測試,並且它運行良好。

但這與Tailwind有什麼關係?

正如我們已經看到的,實用程序類——可以在HTML中的任何位置應用的單用途類——可以使我們的代碼更易於重用。這是Tailwind和其他實用程序類框架的主要賣點——您交付的CSS文件大小最終會因此變小。 Tailwind提供了多個顏色類:.bg-red-medium將為我們提供紅色background-color屬性值,.text-red-medium用於color,依此類推,對於border、box-shadow或您可以想到的任何可能需要顏色值的地方。

顏色可以在配置文件中定義:

 <code>module.exports = { theme: {  colors: {   red: {    medium: '#e53e3e',    dark: '#742a2a'   },   blue: {    medium: '#3182ce',    dark: '#2a4365'   }  } } }</code>

如果我們想為我們的Tailwind類使用自定義屬性值,我們可以在配置中指定它們:

 <code>module.exports = { theme: {  colors: {   'th-primary': 'var(--primary)',   'th-secondary': 'var(--secondary)'  } } }</code>

我在主題相關的類名前加上了th-前綴,以便很明顯它們與主題設計特別相關,但您可以隨意使用任何適合您的約定。

現在,我們可以通過Tailwind使用這些類。使用.bg-th-primary相當於編寫:

 <code>.some-element { background-color: var(--primary); }</code>

在我們的CSS中,我們可以像以前一樣定義主題的自定義屬性:

 <code>:root { --primary: #742a2a; --secondary: #742a2a; } .th-blue { --primary: #2a4365; --secondary: #3182ce; }</code>

讓我們將這些類應用於我們的HTML。第一個示例為我們提供了一個具有默認主題(在:root上定義的變量)的組件。第二個具有我們的藍色主題。唯一的區別是在組件上添加了.th-blue類。 (為了簡潔和清晰,我又省略了與主題無關的類。)

<code><div class="bg-th-primary text-white">
<h3 id="加入我們的郵件列表"> 加入我們的郵件列表</h3>
<div>
<p>搶先了解我們的新產品</p>
<button class="bg-th-secondary">註冊</button>
</div>
</div>


<div class="th-blue bg-th-primary text-white">
<h3 id="加入我們的郵件列表">加入我們的郵件列表</h3>
<div>
<p>搶先了解我們的新產品</p>
<button class="bg-th-secondary">註冊</button>
</div>
</div></code>

使用配置作為樣式指南

Tailwind鼓勵您在配置中定義所有變量,就我個人而言,我同意這是一種更好的方法。這意味著配置文件可以成為單一事實來源,而不是(可能)最終有多個地方來定義顏色和其他主題值。幸運的是,我們也可以將Tailwind配置文件中的值用於我們的自定義屬性。我們需要首先在配置中定義所有顏色(假設我們不使用Tailwind包含的默認調色板):

 <code>module.exports = { theme: {  colors: {   red: {    medium: '#e53e3e',    dark: '#742a2a'   },   blue: {    medium: '#3182ce',    dark: '#2a4365'   },   'th-primary': 'var(--primary)',   'th-secondary': 'var(--secondary)'  } } }</code>

然後,我們可以訪問CSS中的theme對象:

 <code>:root { --primary: theme('colors.red.dark'); --secondary: theme('colors.red.medium'); } .th-blue { --primary: theme('colors.blue.dark'); --secondary: theme('colors.blue.medium'); }</code>

總結

我非常高興能夠使用自定義屬性而無需擔心瀏覽器支持,更高興能夠將其與我們現有的工作流程無縫集成。很難誇大它們在主題設計方面將為我們節省的時間。我希望即使您不是Tailwind用戶,本文也可能會鼓勵您為此用例嘗試自定義屬性。

以上是用CSS自定義屬性和尾風為主題染色的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
@KeyFrames CSS:最常用的技巧@KeyFrames CSS:最常用的技巧May 08, 2025 am 12:13 AM

@keyframesispopularduetoitsversatoryand and powerincreatingsmoothcsssanimations.keytricksinclude:1)definingsmoothtransitionsbetnestates,2)使用AnimatingMultatingMultationMultationProperPertiessimultane,3)使用使用4)使用BombingeNtibalibility,4)使用CombanningWiThjavoFofofofoftofofo

CSS計數器:自動編號的綜合指南CSS計數器:自動編號的綜合指南May 07, 2025 pm 03:45 PM

CSSCOUNTERSAREDOMANAGEAUTOMANAMBERINGINWEBDESIGNS.1)他們可以使用forterablesofcontents,ListItems,and customnumbering.2)AdvancedsincludenestednumberingSystems.3)挑戰挑戰InclassINCludeBrowsEccerCerceribaliblesibility andperformiballibility andperformissises.4)創造性

使用捲軸驅動動畫的現代滾動陰影使用捲軸驅動動畫的現代滾動陰影May 07, 2025 am 10:34 AM

使用滾動陰影,尤其是對於移動設備,是克里斯以前涵蓋的一個微妙的UX。傑夫(Geoff)涵蓋了一種使用動畫限制屬性的新方法。這是另一種方式。

重新訪問圖像圖重新訪問圖像圖May 07, 2025 am 09:40 AM

讓我們快速進修。圖像地圖一直返回到HTML 3.2,首先是服務器端地圖,然後使用映射和區域元素通過圖像上的單擊區域定義了可單擊區域。

DEV狀態:每個開發人員的調查DEV狀態:每個開發人員的調查May 07, 2025 am 09:30 AM

開發委員會調查現已開始參與,並且與以前的調查不同,它涵蓋了除法:職業,工作場所,以及健康,愛好等。 

什麼是CSS網格?什麼是CSS網格?Apr 30, 2025 pm 03:21 PM

CSS網格是創建複雜,響應式Web佈局的強大工具。它簡化了設計,提高可訪問性並提供了比舊方法更多的控制權。

什麼是CSS Flexbox?什麼是CSS Flexbox?Apr 30, 2025 pm 03:20 PM

文章討論了CSS FlexBox,這是一種佈局方法,用於有效地對齊和分佈響應設計中的空間。它說明了FlexBox用法,將其與CSS網格進行了比較,並詳細瀏覽了瀏覽器支持。

我們如何使用CSS使網站迅速響應?我們如何使用CSS使網站迅速響應?Apr 30, 2025 pm 03:19 PM

本文討論了使用CSS創建響應網站的技術,包括視口元標籤,靈活的網格,流體媒體,媒體查詢和相對單元。它還涵蓋了使用CSS網格和Flexbox一起使用,並推薦CSS框架

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器