如何評價CSS框架TailwindCSS?

圖片

端午三天,你們在放假,而我,一個人躲在家里,苦練 tailwindcss。

我在準備這樣一個學習項目,它與傳統的文章/視頻類學習不同,我會在教程中內置大量的可交互案例,提供沉浸式的學習體驗,并且還可以支持實時修改代碼觀察案例更改結果。大家可以期待一下。

圖片

經過這個項目的歷練,現在,我已熟練度拉滿,徹底拿捏了 tailwindcss。

魔功大成!

這篇文章,就跟大家分享一下我在 tailwindcss 中已經使用到的高級用法。

  • 一、徹底讀懂配置文件 tailwind.config.js

  • 二、定義自己喜歡的語法

  • 二、定義自己喜歡的功能塊

  • 三、定義自己想要的插件

  • 三、高級用法:簡單實現皮膚切換

0

高端,從讀懂配置文件開始

在使用 tailwindcss 時,我們可以在項目根目錄創建一個配置文件?tailwind.confing.js,用于控制 tailwindcss 的語法,理論上來說,你可以把 tw 調整成任何你需要的形狀。

使用如下指令,可以在根目錄創建一個最簡單的配置文件模板

npx?tailwindcss?init
/**?@type?{import('tailwindcss').Config}?*/
module.exports?=?{content:?[],theme:?{extend:?{},},plugins:?[],
}

content

content 選項是一個數組,用于指定 tailwindcss 語法生效的文件集合。

content:?['./pages/**/*.{js,jsx}','./components/**/*.{js,jsx}','./app/**/*.{js,jsx}','./src/**/*.{js,jsx}',
]

tailwind 使用?fast-glob?庫來匹配文件。其中,*?匹配任意字符,**?匹配 0 個或者多個目錄,{js, jsx}?匹配多個值。

圖片

配置完之后的文件數量越多,編譯時的壓力就越大,因此我們應該盡可能縮小 tailwindcss 的配置范圍,只在需要它的地方使用。例如?utils?目錄可能會包含大量的文件,但是不會使用 tailwindcss,那么我們就應該把他剔除掉。

當然我們還可以做其他的一些配置增強,但是大多都沒什么用,對我來說,這里一個比較有用的配置項是?transform。我寫的文章內容,源文件是?.md?格式,此時如果我想要在?.md?中使用 tailwindcss,那么就需要將其轉換為?html?之后再適配 tailwindcss,我們就可以這樣配置

const?remark?=?require('remark')module.exports?=?{content:?{files:?['./src/**/*.{html,md}'],transform:?{md:?(content)?=>?{return?remark().process(content)}}},//?...
}

theme

theme 字段的配置是我們拿捏 tailwindcss 的核心關鍵。我們可以通過這個字段自定義任意語法。但是這個語法新人玩家容易看不懂,一長串不知道如何使用。我給大家講解一下很快就很搞懂了

首先,theme?中包含了大量的字段,這些字段有?colorstextColor,這個是啥意思呢?就很迷惑。

?

我們可以在這個地址中,查看默認的完整配置項 https://github.com/tailwindlabs/tailwindcss/blob/master/stubs/config.full.js#L5

其實,我們只需要利用好官方文檔,就能很輕松的搞懂這些配置。theme 中的字段主要分為兩類,一類表示 css 屬性。一類表示配置。

例如在配置文件中,有一個?borderWidth的配置如下

borderWidth:?{DEFAULT:?'1px',0:?'0px',2:?'2px',4:?'4px',8:?'8px',
},

這看上去像是一個 css 屬性,又像是一個配置項,那么我們可以去官方文檔的如下地址中,直接查這個單詞. 點開之后發現,這里確實是一個屬性值。并且具體的縮寫與寫法,配置參數都一目了然,比只看官方文檔更加具體。

圖片

又例如,我們在配置項中發現了一個屬性?spacing

spacing:?{px:?'1px',0:?'0px',0.5:?'0.125rem',1:?'0.25rem',1.5:?'0.375rem',2:?'0.5rem',2.5:?'0.625rem',3:?'0.75rem',3.5:?'0.875rem',4:?'1rem',5:?'1.25rem',6:?'1.5rem',7:?'1.75rem',8:?'2rem',9:?'2.25rem',10:?'2.5rem',11:?'2.75rem',12:?'3rem',14:?'3.5rem',16:?'4rem',20:?'5rem',24:?'6rem',28:?'7rem',32:?'8rem',36:?'9rem',40:?'10rem',44:?'11rem',48:?'12rem',52:?'13rem',56:?'14rem',60:?'15rem',64:?'16rem',72:?'18rem',80:?'20rem',96:?'24rem',
},

然后對應去官方文檔查一下,發現這是一個配置項。那么我們就可以知道,這可能會作為入參運用到其他屬性的設置中去。

圖片

?

我們也可以自己定義非 rem 的屬性單位,使用數組遍歷的方式生成 1px -> 500px 中比較常用的一些數值,具體要結合實際情況和設計規范來約定它的配置

有了這個配置項之后,我們就可以使用它作為入參去配置其他 css 屬性,例如 margin 值。這里的?theme?表示一個 get 方法,可以獲取到?theme?配置項中對應屬性的具體值。例如這里的?theme('spacing')?就是獲取到我們剛才的配置項

margin:?({?theme?})?=>?({auto:?'auto',...theme('spacing'),
}),

這樣,margin 寫法后面跟的數字,就是我們約定的?spacing?中具體的值了。

圖片

m-0.5?,對應的值,就是?spacing?中的?0.5:0.125rem

圖片

theme 中的大多數屬性值,都是 css 屬性值,只有少數幾個值是表示配置項,具體內容不用刻意去記憶,只需要在用到的時候查閱文檔即可。如果你只是需要做簡單粗暴的自定義修改,直接在默認配置的基礎之上修改樣式就可以

1

定義自己喜歡的語法

自定義語法更好的方式是使用?extend?配置去覆蓋原有配置項。例如,我想要重新針對?background-color?定義一個語法寫法如下,使用黑色的拼音縮寫來表達顏色,使用數字來表示不同程度的黑色

bg-heise-0
bg-heise-1
bg-heise-2
bg-heise-3
bg-heise-4

首先我們要做的第一件事情,是在官方文檔中,找到?background color?對應的縮寫是什么

圖片

然后在 extend 字段中,對應的字段里,配置自定義的語法,heise.

theme:?{extend:?{backgroundColor:?{heise:?{0:?'rgba(0,?0,?0,?0)',1:?'rgba(0,?0,?0,?0.1)',2:?'rgba(0,?0,?0,?0.2)',3:?'rgba(0,?0,?0,?0.3)',4:?'rgba(0,?0,?0,?0.4)',},

此時,我們的語法就是屬性縮寫開頭的方式,?bg-heise-0,我們可以看到,在文件中使用改語法時,智能提示已經有了我們自己定義的語法,完美!

2

定義自己想要的功能塊

tailwindcss 有三個模塊。

@tailwind?base;
@tailwind?components;
@tailwind?utilities;

base 表示樣式重置模塊。components 表示組件模塊,utilities 表示功能模塊,我們可以通過插件的形式,往這幾個功能模塊中新增我們想要的功能塊。

例如,我希望自定義默認的 button 元素的樣式,那么我們就可以往 base 模塊中注入樣式,首先引入插件方法

const?plugin?=?require('tailwindcss/plugin')

然后在?plugins?字段中新增配置樣式

module.exports?=?{plugins:?[plugin(function({?addBase,?theme?})?{addBase({'button':?{?color:?theme('colors.orange.700')?}})})]
}

然后,我在項目中寫上如下代碼,對應的結果如圖所示,文字顏色變成了?orange.700

<button>自定義button默認樣式</button>

圖片

我們可以通過這中方式約定所有的基礎樣式,button, input?等都非常需要這樣的約定。

當然,我們也可以通過類似的方式往?components?中新增樣式。例如我希望新增一個?card?組件,用于表示一個區域的容器,那么我就可以這樣寫

plugin(({addComponents,?theme})?=>?{addComponents({'.card':?{display:?'inline-block',padding:?'1rem',border:?'1px?solid',borderRadius:?'4px',borderColor:?theme('colors.red.400'),margin:?'1rem'}})
}),

然后我在項目中編寫如下代碼

<div?className='card'><button>自定義button默認樣式</button>
</div>

圖片

給力!

3

定義自己想要的插件

如下圖所示,此時我們想要實現的一個功能是自定義字體大小的遞增序列。具體的編號和對應的值都由我們自己來定?fsize-12,而不是通過默認的?text-xxx?來約定。

圖片

首先,我們先在 theme 中約定配置項,數量太多的時候,你也可以通過數組遍歷來快速創建

theme:?{fsizes:?{12:?'12px',14:?'14px',16:?'16px',18:?'18px',24:?'24px',32:?'32px',},...

然后,plugins 字段中,使用?matchUtilities?方法動態匹配后綴自增的 class

plugin(({matchUtilities,?theme})?=>?{matchUtilities({fsize:?(value)?=>?({fontSize:?value})},?{values:?theme('fsizes')})
})

搞定,最后的演示結果如圖所示

圖片

4

高級用法:簡單實現皮膚切換

最后,我們再來一個具體的,實用功能的實現:皮膚切換。具體的實現方式仍然是利用 css 自定義變量來做到。

實現效果如圖所示

圖片

?

主題來源于 tailwindcss 官方教學視頻

我們來看一下實現步驟。

首先,我們要在入口 css 中文件中,約定不同主題的 css 變量。

@layer?base?{:root?{--color-text-base:?#FFF;--color-text-muted:?#c7d2f7;--color-text-inverted:?#4f46e5;--color-fill:?#4338ca;--color-button-accent:?#FFF;--color-button-accent-hover:?#eef2ff;--color-button-muted:?99,?102,?241;}.theme-swiss?{--color-text-base:?#FFF;--color-text-muted:?#fecaca;--color-text-inverted:?#dc2626;--color-fill:?#b91c1c;--color-button-accent:?#FFF;--color-button-accent-hover:?#fef2f2;--color-button-muted:?239,?68,?68;}.theme-neon?{--color-text-base:?#111802;--color-text-muted:?#2fc306;--color-text-inverted:?#ebfacc;--color-fill:?#b3ff17;--color-button-accent:?#243403;--color-button-accent-hover:?#374f05;--color-button-muted:?212,?255,?122;}
}

@layer base?表示這些定義會運用到 base 模塊中。

定義好了主題之后,我們就需要去?extend?字段中自定義語法。首先是針對于文字顏色字段,該字段在 css 中為 ?color,不過在 tailwind 中,被重新定義了語義,稱之為 text color

圖片

因此,我們要使用?textColor?來定義該語法,

extend:?{textColor:?{skin:?{base:?'var(--color-text-base)',muted:?'var(--color-text-muted)',inverted:?'var(--color-text-inverted)',}},

textColor?的對應縮寫為 text,因此最終我們自定義的語法名如下所示

圖片

用同樣的方式定義背景顏色

backgroundColor:?{skin:?{fill:?'var(--color-fill)','button-accent':?'var(--color-button-accent)','button-accent-hover':?'var(--color-button-accent-hover)','button-muted':?({opacityValue})?=>?{console.log(opacityValue)if?(opacityValue?!==?undefined)?{return?`rgba(var(--color-button-muted),?${opacityValue})`}return?`rgb(var(--color-button-muted))`},}
},

圖片

在需要顏色的地方,我們使用自己定義好的語法來設置顏色。

他們的值,都由?var?來聲明,對應到我們剛才定義的 css 變量。因此,這樣做好之后,當我們改變 css 變量的生效結果,那么皮膚切換就能自定生成。

我們可以更改頂層父組件的 className 來做到變量名的整體切換。

圖片

實現完成之后,再來看一眼演示效果,沒有問題,搞定!

圖片

5

總結

實踐中的需求非常復雜,每個團隊對于 UI 的設計規范不同,那么默認樣式就很難滿足所有團隊的需求,因此,掌握如何將 tailwindcss 配置為你的形狀,是在團隊中推廣和運用它的必要條件。

但是官方文檔對于配置文件的講解有一些缺漏,導致我也花了很長時間,查了不少資料才最終讀懂,因此這篇文章我把缺漏的部分補上,有助于道友們更加方便理解它,并結合官方文檔徹底拿捏 tailwindcss 的自定義配置。

僅供參考!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/37992.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/37992.shtml
英文地址,請注明出處:http://en.pswp.cn/web/37992.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringMVC中執行流程

文章目錄 14、SpringMVC執行流程14.1、SpringMVC常用組件14.2、DispatcherServlet初始化過程①初始化WebApplicationContext②創建WebApplicationContext③DispatcherServlet初始化策略 14.3、DispatcherServlet調用組件處理請求①processRequest()②doService()③doDispatch()…

Zynq7000系列FPGA中DMA引擎編程指南

DMA引擎的編程指南通常涉及一系列步驟和API調用&#xff0c;以確保數據在內存之間的高效傳輸&#xff0c;而無需CPU的直接干預。 DMA引擎的編程指南包括以下部分&#xff1a; 一、編寫微代碼為AXI事務編寫CCRx程序 通道微碼用于設置dmac.CCRx寄存器以定義AXI事務的屬性。這是…

TikTok直播限流與網絡的關系及解決方法

TikTok作為一款熱門的社交平臺&#xff0c;其直播功能吸引了大量用戶。然而&#xff0c;一些用戶可能會遇到TikTok直播限流的問題&#xff0c;例如直播過程中出現播放量低、直播畫面質量差等情況。那么&#xff0c;TikTok直播限流與所使用的網絡線路是否有關系&#xff1f;是否…

學習springIOC

第二章 Spring IOC 章節內容 Spring IOC技術實現Spring IOC設值注入Spring IOC構造注入 章節目標 掌握Spring IOC技術實現掌握Spring IOC設置注入掌握Spring IOC構造注入 第一節 Spring簡介 1. Spring 簡介 Spring 是目前主流的 Java 開發框架&#xff0c;是 Java 世界最…

Android實現手寫輸入

android應用開發中有時會有手寫輸入需求&#xff0c;非通過系統鍵盤手寫功能&#xff0c;比如自定義鍵盤&#xff0c;這時就需要自己來實現&#xff0c;一般有兩種場景&#xff1a;一種是類似手寫簽名保存&#xff1b;另一種是真正的手寫輸入&#xff0c;需要將筆跡識別成正確的…

JTracker IDEA 中最好的 MyBatis 日志格式化插件

前言 如果你使用 MyBatis ORM 框架&#xff0c;那么你應該用過 MyBatis Log 格式化插件&#xff0c;它可以讓我們的程序輸出的日志更人性化。 但是有一個問題&#xff0c;通常我們只能看到格式化后的效果&#xff0c;沒辦法知道這個 SQL 是誰執行的以及調用的鏈路。 如下圖所…

文章解讀與仿真程序復現思路——電網技術EI\CSCD\北大核心《考慮復合指標優化模態分解和 Stacking 集成的綜合能源系統多元負荷預測》

本專欄欄目提供文章與程序復現思路&#xff0c;具體已有的論文與論文源程序可翻閱本博主免費的專欄欄目《論文與完整程序》 論文與完整源程序_電網論文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 電網論文源程序-CSDN博客電網論文源…

【stm32】大一上學期筆記復制

砌墻單片機 外設是什么&#xff1f; ipage 8 nx軸 128 X0-127 y0-63 PWM脈沖寬度調制 PWM脈沖寬度調制 2023年10月13日 基本特性&#xff1a;脈沖寬度調制PWM是一種對模擬信號進行數字編碼的方法。廣泛引用于電機控制&#xff0c;燈光的亮度調節&#xff0c;功率控制等領域…

趕緊收藏!全網最佳WebSocket封裝:完美支持斷網重連,自動心跳!

文章目錄 一、WebSocket封裝庫簡介二、庫的安裝與配置2.1 安裝2.2 初始化 三、功能詳解3.1 斷網重連3.2 自動心跳3.3 消息隊列3.4 事件管理 四、示例代碼五、總結 &#x1f389;歡迎來到Java學習路線專欄~探索Java中的靜態變量與實例變量 ☆* o(≧▽≦)o *☆嗨~我是IT陳寒&…

Windows Server 2019部署網絡負載均衡NLB服務的詳細操作步驟

部署前準備 首先需要準備兩臺Windows Server 2019服務器&#xff0c;虛擬機創建請參考 VMware Workstation安裝Windows Server2019系統詳細操作步驟_安裝windows server 2019操作系統(寫出操作過程)-CSDN博客 克隆虛擬機請參考 VMware Workstation克隆虛擬機詳細步驟-CSDN博…

超詳細的 C++中的封裝繼承和多態的知識總結<2.多態>

引言 小伙伴們我們都知道了&#xff0c;什么是封裝和繼承&#xff0c;在有了這個的基礎上我們接著來看什么是多態。多態從字面上意思我們就可以知道&#xff0c;大概就是一個函數的不同形態&#xff0c;而且&#xff0c;前邊我們在學習函數重載的時候我們已經簡單的了解了如何用…

[Swiper]在React中使用Swiper時注意銷毀實例

swiper版本號&#xff1a; {"swiper": "^4.4.2", }在useEffect中初始化swiper實例&#xff0c;由于依賴項的變更&#xff0c;可能會重復初始化: useEffect(() > {swiper.current new Swiper(#mainSwiper, {autoplay: {delay: 3000,//3秒切換一次},on…

Android 休眠流程(三)

Android 休眠流程(三) 上一篇《Android 休眠流程(二)》簡單講解內核階段進入休眠流程,本篇繼續深挖,簡單講解休眠進入ATF。ATF(ARM Trusted Firmware) 的體系架構里將整個系統分成四種安全等級,分別為:EL0、EL1、EL2、EL3。將整個安全啟動的流程階段定義為:BL1、BL2…

相等運算符==與 === 的區別

相等運算符用來比較兩個值是否相等 1、運算符 如果相等會返回true&#xff0c;否則返回false使用 來做相等運算當使用來比較兩個值時,如果值的類型不同&#xff0c;則會自動進行類型轉換&#xff0c;將其轉換為相同的類型比較 console.log("1" 1); //true console.…

機器學習算法 —— 基于penguins_raw數據集的決策樹

??歡迎來到 我的博客 —— 探索技術的無限可能! ??博客的簡介(文章目錄) 目錄 實戰演示基于penguins_raw數據集的決策樹實戰導入模塊數據信息簡單查看可視化描述利用 決策樹模型 在二分類上 進行訓練和預測利用 決策樹模型 在三分類(多分類)上 進行訓練和預測實戰 演示…

OCI對象存儲數據轉移到另一個桶

// 舊桶 String bucketName_old “Bucket-old”; // 新桶 String bucketName_new “Bucket-new”; // 圖片前綴 String filePrefix “obj-filePrefix/”; AmazonS3 instance AmazonS3ClientFactory.getS3Instance(); String continuationToken null; int num 0; try { do…

推薦算法學習筆記2.1:基于深度學習的推薦算法-基于共線矩陣的深度推薦算法-AutoRec模型

AutoRec模型 前置知識&#xff1a;推薦算法學習筆記1.1:傳統推薦算法-協同過濾算法 AutoRec模型通過引入自編碼器結構&#xff0c;將共線矩陣中的用戶向量&#xff08;基于用戶的U-AutoRec&#xff09;或物品向量&#xff08;基于物品的I-AutoRec&#xff09;嵌入到低維空間后還…

訊方技術鴻蒙應用定制開發服務上架華為云商店

在當前智能化與互聯互通發展的時代背景下&#xff0c;鴻蒙操作系統已成為推動創新應用發展的新引擎。隨著企業對個性化智能解決方案需求的不斷增長&#xff0c;鴻蒙應用定制開發已成為企業技術轉型升級的重要途徑。 訊方技術作為一家致力于為客戶提供全面專業服務的企業&#…

LVM核心概念

1. LVM簡介 LVM是邏輯盤卷管理&#xff08;Logical Volume Manager&#xff09;的簡稱&#xff0c;它是Linux環境下對磁盤分區進行管理的一種機制&#xff0c;LVM是建立在硬盤和分區之上的一個邏輯層&#xff0c;來提高磁盤分區管理的靈活性。 優點&#xff1a; 可以靈活分配…

Java中如何實現一個線程安全的HashMap?

在Java中&#xff0c;實現一個線程安全的HashMap可以通過使用java.util.concurrent.ConcurrentHashMap類來實現。ConcurrentHashMap類是Java并發包java.util.concurrent的一部分&#xff0c;它提供了一種線程安全的哈希表實現。 以下是如何使用ConcurrentHashMap實現線程安全的…