一年多沒寫過文章了,今天給你們介紹一個我斷斷續續花了半年開發的 CSS 項目: Fower.css
Fower 是一個讓你高效開發 UI 的樣式工具庫,目標是讓你寫 CSS 再也不痛苦。Fower 的核心特色是原子化(Atomic/utility-first)、類型安全(Type Safe)、CSS in JS,它很是注重開發體驗,讓你快速且開心的開發界面。html
Fower 是框架無關的,你能夠在 React、Vue、React native、小程序等任何 JavaScript 項目中使用。git
一年前,我所在的團隊同時在開發 Web、React native、小程序項目。在這三類項目中,咱們使用了各不相同的樣式方案:github
StyleSheet.create
;三種樣式的方案寫法各不相同,致使咱們編寫樣式時特別痛苦:小程序
後面,我發現了 Tailwindcss,一個 utility 優先(utility-first) 的 CSS 框架,在個人推進下,咱們團隊開始在 Web 項目中使用 Tailwindcss。一段時間後,咱們發現開發體驗很不錯,開發效率也很高,特別適合在咱們這種須要高度定製界面的項目使用。惋惜的是,Tailwindcss 沒法直接在 React native、小程序等非 Web 項目使用。安全
咱們團隊的成員都喜歡 Tailwindcss 這種樣式寫法。因此我建立了 Fower,但願能統一了全部項目的樣式編寫方式。markdown
和 Tailwindcss 相似,咱們也使用了 utility-first 的理念,但有 Fower 又有點不一樣,Fower 使用 Atomic style props 的方式編寫樣式,代碼以下:app
<div toCenterY p-10 w-260 rounded-10 shadow>
<img circle-48 src="/img/jobs.jpg" />
<div ml-10>
<div textXL fontBold>Steve Jobs</div>
<span gray800>Co-founder of Apple Inc.</span>
</div>
</div>
複製代碼
Fower 是 opinionated 的,咱們基於如下理念建立了它:框架
utility-first,這種方式讓咱們更快速地編寫樣式,和其餘 "utility-first" CSS 框架不一樣的是,Fower 使用 "Atomic style prop" 編寫樣式工具
Type safe,咱們團隊是 TypeScript 重度使用用戶,Type safe 帶來的智能提示,讓咱們幾乎不多翻閱文檔,而且在編寫代碼時不依賴任何編輯插件就有準確的自動補全
Framework-agnostic,這是咱們建立 Fower 的最主要緣由之一,Fower 可讓你用一致的寫法在 React、Vue、React Native 編寫樣式
CSS in JS,咱們討厭在獨立的 CSS 文件中編寫 CSS,純 CSS 有很是多缺點,如:沒法訪問 JS 變量;容易產生樣式衝突;容易產生死代碼... 咱們喜歡使用 JS (CSS in JS) 編寫樣式,它更適合在組件化時代中使用。實際上,Fower 不只僅是 CSS in JS,它也是 CSS in HTML。
Fower 有很是多的特性,如原子類、響應式、僞類、主題、設計系統、CSS in JS...,我覺這些是 Fower 的基礎功能,並非特點功能。
Fower 有幾個我認爲很酷的功能:
若是要我在 Fower 中選一個最喜歡的特性,那毫無疑問是 Layout Toolkitd。
Fower 提供了一個強大的基於 Flexdiv 的佈局工具,經過調整佈局的方向(Direction)和對齊(Alignment),能夠實現大部分的佈局,使佈局工做更輕鬆。
相比傳統的 flex 佈局,Fower 的佈局更加抽象精簡,Fower 的佈局抽象爲 toCenter
、toCenterX
、toCenterY
、toLeft
、toTop
、toRight
、toBottom
、toBetween
、toEvenly
、toAround
十種原子對齊方式,使用時你能夠忘記傳統 flex 佈局中的主軸(main axis)和交叉軸(cross axis)的概念,你只須要有方向感便可。
使用方式以下:
<div toCenter bgGray100 square-200>
<div square-60 bgAmber400 rounded-8></div>
<div square-80 bgBlue400 rounded-8></div>
</div>
複製代碼
更詳細的使用方法請看文檔: Layout Toolkitd。
另一個我我的很喜歡的特性的是 Predictable style。在傳統的 CSS 中,我認爲樣式是不可預測的。爲何這麼說?這裏舉個例子。
咱們有以下的 CSS:
.red {
color: red;
}
.blue {
color: blue;
}
複製代碼
有以下的的 html, css 類名分別爲 "red blue" 和 "blue red":
<div>
<span className="red blue">Fower</span>
<span className="blue red">Fower</span>
</div>
複製代碼
你能肯定文字的顏色嗎?很差肯定,若是咱們不翻看上面的 CSS 代碼,你沒法直接判斷文字的顏色,只能經過開發者工具調試得知。
在 Flower 中,你能夠輕易判斷下面文字的顏色:
<div>
<span red400 blue400> text will be color blue400 </span>
<span blue400 red400> text will be color red400 </span>
</div>
複製代碼
這有什麼用呢?除了讓咱們更容易判斷樣式結果,我覺的最有用的是:當咱們抽象出一個可複用的組件時,好比一個通用的 Button
, 那調用方能夠輕易的覆蓋組件默認樣式,好比這樣相似的代碼 <Button bgRed300></Button>
能夠安全的設置背景色。
更詳細的使用方法請看文檔:Predictable style。
Fower 的另外一個很酷的功能是顏色助手,您可使用一些後綴來處理顏色。
使用 --D{0-100}
這樣的後綴來加深一個顏色:
<div toEvenly toCenterY>
<div red300>normal</div>
<div red300--D40>darken</div>
<div color="#fff--D40">darken</div>
<div bgRed300 square-84></div>
<div bgRed300--D40 square-84></div>
<div border borderRed300 square-84></div>
<div border borderRed300--D40 square-84></div>
</div>
複製代碼
使用 --L{0-100}
後綴來變淺一個顏色:
<div toEvenly>
<div red500>normal</div>
<div red500--T40>transparentize</div>
<div color="#000--T40">transparentize</div>
<div bgRed500 square-84></div>
<div bgRed500--T40 square-84></div>
<div border borderRed300 square-84></div>
<div border borderRed300--T40 square-84></div>
</div>
複製代碼
使用 --T{0-100}
後綴來增長顏色的透明度:
<div toEvenly>
<div red500>normal</div>
<div red500--T40>transparentize</div>
<div color="#000--T40">transparentize</div>
<div bgRed500 square-84></div>
<div bgRed500--T40 square-84></div>
<div border borderRed300 square-84></div>
<div border borderRed300--T40 square-84></div>
</div>
複製代碼
使用 --O{0-100}
後綴來增長顏色的不透明度:
<div toEvenly>
<div color="rgba(0,0,0,0.4)">0.4</div>
<div color="rgba(0,0,0,0.4)--O40">Opacify to 0.6</div>
<div bg="rgba(0,0,0,0.4)" square-84></div>
<div bg="rgba(0,0,0,0.4)--O40" square-84></div>
<div border borderColor="rgba(0,0,0,0.4)" square-84></div>
<div border borderColor="rgba(0,0,0,0.4)--O40" square-84></div>
</div>
複製代碼
更詳細的使用方法請看文檔:Color helper。
Fower 提供一些後綴來快速處理樣式, 如: --hover
, --focus
, --sm
, --dark
, --T{amount}
...
Flower 的另外一個很酷的功能是可組合的後綴。 您能夠組合一些後綴,而且順序是任意的:
<div square-84 bgOrange300 bgOrange400--D10--hover--sm></div>
複製代碼
下面的代碼和上面是等價的:
<div square-84 bgOrange300 bgOrange400--hover--sm--D10></div>
複製代碼
若是你想了解更多關於 Fower 的信息,你能夠訪問項目網站和官方文檔。