還在跟複雜的CSS 的設定奮鬥嗎?用Tailwind 來幫你實現真正 ...

文章推薦指數: 80 %
投票人數:10人

簡單來說Tailwind CSS 是一套Utility-First CSS,相當具有彈性,也非常適合快速 ... Tailwind CSS 把大致上CSS 會用到的屬性都用單個class 來表示。

首頁技術文章還在跟複雜的CSS的設定奮鬥嗎?用Tailwind來幫你實現真正的高效整潔!還在跟複雜的CSS的設定奮鬥嗎?用Tailwind來幫你實現真正的高效整潔!ByMeng-YingTsai・4月252020・技術文章什麼是TailwindCSS?簡單來說TailwindCSS是一套Utility-FirstCSS,相當具有彈性,也非常適合快速刻板。

在Utility-FirstCSS之間也算是殺出了一片天。

不過這個工具的魅力到底在哪呢?且讓我慢慢說明。

Utility-FirstCSS要說到Utility-FirstCSS的好,就要先從一般的CSSframework說起:相信大家都對Material-UI、Bulma、Bootstrap(framework們表示躺著也中槍XD)這類component都定義好好,套上去馬上就有個像樣網站的framework不太陌生。

要navbar有navbar,要button有button,的確是非常方便。

但是使用這些前端framework很快就會遇到一個很頭痛的問題:不想要自己的網站看起來一眼就是套框架,但是想要客製化的話,又會遭遇維護上的麻煩跟困難。

1.最糟糕的情況:overrideCSS可能原本的框架沒有提供什麼比較好的customize的方式,或是自己選擇使用這些工具的方式導致很難customize,只好各種override人家寫好的CSS,網站看起來還好好的就閉著眼睛commit+push。

但這種方式實在很容易把東西改壞。

2.把customizedcode載下來框架本身提供customization,可以把各個地方修修改改再把code載下來。

乍看之下好像很棒,但如果今天你手上的專案交給另一個人接手,他要如何知道哪些地方是原始的設定,哪些地方又被動過手腳了呢?3.import後再overrideSassvariables比較好的情況,可以import框架的Sass,但又override部分Sassvariables,不但可以調整設定,也不容易造成管理、維護的問題。

但只要他已經把UI都定好了,可以調整的範圍往往就受到不少限制。

如果使用Utility-FirstCSS的時候,的因為每個元件都要自己刻,哪裡不滿意、不符合需求,都可以在utilityclass加加減減中完成。

簡單來說就是非常具有彈性吧。

快速架構TailwindCSS把大致上CSS會用到的屬性都用單個class來表示。

例如.mt-1對應的是margin-top:0.25rem;,.my-2對應的是margin-top:0.5rem;margin-bottom:0.5rem;。

.mt-1{ margin-top:0.25rem; } mt-1實在是比margin-top:0.25rem;短太多,也不容易打錯字(欸)。

因為可以直接把對應的class直接加在你想要作用的element上,大部分的情況下可以不需要自己動stylesheet的部分,相當方便。

於是你就可以非常迅速地把網站的各種部分建構出來,也可以很輕鬆地調整。

「輕鬆」這件事情聽我嘴上說說似乎也不準,不如自己動手試試XD如果還來不及在local新增專案、安裝Tailwind,可以先在Tailwind.run嘗試看看。

官方文件齊全除了Utility-FirstCSS本身的好處以外,TailwindCSS雖然還不是十分被廣泛使用,但想要上手的話,光是官方文件就十分充足、一目瞭然。

(總覺得教學文不多,但有可能是官方文件就說得很清楚,也不多人想寫教學文XD)從installation、components範例、每個utilitycss的簡介......甚至來有教學screencasts可以看,真的非常用(ㄏㄣˇ)心(ㄏㄨㄟˋ)。

缺點開始用Tailwind以後,你開始發現你的htmlcode充滿了一大串像這樣的東西:...剛開始接觸時可能會覺得用起來會讓code相當醜,看起來非常不習慣,想跟我說「不是跟我說高效『整潔』嗎,在騙肖?」先別急著摔筆,如果前端有使用React、Vue等框架並且把畫面上的組成準確的分成不同component,其實不用太擔心會有一堆重複的utilityclass集合在你的字裡行間亂竄。

要是有一些出現頻率高的元件(eg.按鈕、input),也可以考慮用@apply適當地切出一些CSScomponents。

如果我好好地切component,其實還是會很好維護的。

如果你還是要跟我argue一大串class看得很煩躁,可能必須說這本來就是工具之間的取捨,以醜醜的code為代價,可以換來快速開發,讓你早點下班休息也未嘗不好☕和inlineCSS的差異至於有些人會問:「蛤?這樣不是跟寫inlineCSS一樣嗎?」我一開始也是這樣想的!但其實Tailwind有一些隱藏的優點,是inlineCSS很難辦到的:1.遵循規範相信新手剛開始學寫網頁的時候,都會有這樣的經驗,常常會隨心所欲地亂加padding、margin,40px還是50px都隨我心情XD 後來開始工作、接案以後,才會深刻體悟到原來這些數字不能像去菜市場買菜一樣亂喊價。

如果沒有對這些數值有一定的規範,各個component搭配起來,最後呈現給使用者的畫面也會出現視覺上的平衡問題。

如果全部寫inlineCSS,是很難去注意有沒有哪裡違背了定義好的規範。

要一一去對數值跟色碼有沒有寫對,太過辛苦也不實際: 改用TailwindCSS以後,顏色、spacing等等都是用config來做管理,可以比較嚴格地規範可以使用的數值和色碼,避免沒有規範地隨意下padding、加background-color等等。

2.Responsive用inlinecss基本上做不到ResponsiveWebDesign,因為包含@media的rules是無法放在inlinecss裡的。

在使用TailwindCSS的時候,只要這個utiltyclass的responsivevariant有被打開,就會產生像是底下的CSSclasses:/*原本的utiltyclass*/ .w-1\/4{ width:25%; } @media(min-width:992px){ .lg\:w-1\/4{ width:25%; } } @media(min-width:1280px){ .xl\:w-1\/4{ width:25%; } } 於是就可以簡單地使用.xl:w-1/4.lg:w-1/4等classes來做responsivedesign。

比方說,我想根據視窗大小改變元素的寬度跟顏色: SeethePen Tailwindcssexample:responsiveby文月(@requiemformemories) onCodePen. 以width來說,預設responsive就是打開的,不需要調整customizedconfig(tailwind.config.js)就有得使用。

//defaultConfig.stub.js:L680 width:['responsive'],預設的variant可以直接參考TailwindGithub上的defaultconfiguration,或者每個utilityclasses的簡介都會有Responsiveandpseudo-classvariants的章節可以參考3.Pseudo-classes要透過inlinecss加上:hover,:active也是辦不到的。

但是Tailwind提供hover、focus、active、disabled、visited、first-child......等variants。

讓你可以很容易地加上對應的utilityclass,就能得到hover、active等效果。

比方說把backgroundColor的variant預設就已經把hover、focus打開了,所以就可以直接使用hover:bg-teal-600、focus:bg-teal-600這樣的classes來製造hover或focus時的效果。

SeethePen yLYLeMgby文月(@requiemformemories) onCodePen. 順帶一提,Tailwind還有個group-hover的variant,當某個utility的variant加上group-hover以後,就會產生像下面這種CSSclasses:.group:hover.group-hover\:text-blue-400{ color:#63B3ED; } 於是你可以很輕鬆地做到grouphover的效果: SeethePen Tailwindcssexample:grouphoverby文月(@requiemformemories) onCodePen. 誰不適合Tailwind?任何工具都不會是絕對完美或是絕對適合所有族群,自己覺得如果有一些特殊的狀況或需求,可能用Tailwind也會很痛苦:1.不擅長從零開始自己刻板的新手我想如果是不擅長刻板的新手,又要在時限內地交出專案,utility-firstcss應該都會用得蠻痛苦的。

但還是鼓勵不擅長刻板的朋友,絕對不要被UIcomponents所迷惑,對於太過方便的東西產生依賴>({ plugins:[ require('tailwindcss'), require('autoprefixer'), require('@fullhuman/postcss-purgecss')({ content:[ './**/*.html', './**/*.pug', './**/*.jsx', //etc ], defaultExtractor:content=>content.match(/[\w-/:]+(?



請為這篇文章評分?