上篇 介紹了 React 如今流行的 CSS 解決方案。本篇就直接進入主題詳細講講我最喜歡的解決方式之一:tachyonscss
我的認爲,tachyons 適合小的、樣式不是重點的項目以及寫 Demo, 但這不表明不能用 tachyons 完成大項目和漂亮的主頁: 使用tachyons寫的項目詳見 tachyons.io/gallery/html
當你興奮地讀完文檔,在打算使用一個新 css 框架前,須要好好想清楚它是否在你的全部使用場景裏圓滿完成任務,我總結的幾點:git
在個人經驗,只是瞥一眼文檔不多人會對 tachyons 上來就感冒的,真正感覺到它的魅力是在使用中。我是看了一段現實使用 tachyons 的視頻後 on board 的,和同事提起時,他們並不太熱衷,但在看我現場使用後立馬決定使用。github
tachyons 不像以前全部的css框架,試圖提供不少組件規模的css類,它甚至沒有 btn
這樣的類。bootstrap等做爲css框架共享了框架的弊端:當你徹底在框架提供的方案內使用時一切輕鬆愉快,但一旦你但願定製化,等待你的是無盡的痛。彷彿與之走上徹底相反的道路,tachyons提供了極其細碎化的類,去看看 tachyons.io/components/,好比一個按鈕:bootstrap
<div class="ph3">
<a class="f6 link dim br1 ba bw2 ph3 pv2 mb2 dib purple" href="#0">Button Text</a>
<a class="f6 link dim br1 ba bw2 ph3 pv2 mb2 dib light-purple" href="#0">Button Text</a>
<a class="f6 link dim br1 ba bw2 ph3 pv2 mb2 dib hot-pink" href="#0">Button Text</a>
<a class="f6 link dim br1 ba bw2 ph3 pv2 mb2 dib dark-pink" href="#0">Button Text</a>
</div>
複製代碼
拿第二行的class從左到右:分別爲 font-size:.875rem
,去掉link的醜陋默認樣式,加上:hover淡化效果,border-radius
1 單位, 全border(border all),border寬度2單位,橫向padding 3單位,縱向padding 2單位,margin bottom 2單位,display:block
,紫色。sass
這就是 tachyons 的基本概念,極細化的「原子類」,帶來的好處是:框架
bw3
便可。簡單的說,使用 tachyons 就比如用一種定義良好的極簡的語言來寫 inline css 的感受。組件化
也許你想問若是 tachyons 這麼好爲啥以前從沒有出現這樣的 css 庫呢?由於這種概念和inline css同樣,只有在組件化開發浪潮中才真正變得可行。若是使用傳統開發,每一個按鈕都如此書寫想必不如使用一個btn類來的輕鬆。但在React等框架下,代碼的重用這事兒已經被組件包乾了。徹底能夠寫一個Button組件:post
const Button = ({ children, color }) => (
<a className=`f6 link dim br1 ba bw2 ph3 pv2 mb2 dib ${color}` href="#0">{children}</a>
)
複製代碼
使用以下性能
<Button color='hot-pink'> 註冊 </Button>
複製代碼
若是你認爲 tachyons 只是 inline style 的話就錯了,使用時你會在各個細節上愛上 tachyons:
<div className="mw6 mw5-m mw4-l">
// 手機上max-width: 32rem, 中屏 16rem,大屏 8rem
<div className="w3 w5-ns">
// 手機上width: 4rem, 非手機 16rem
複製代碼
使用 tachyons 開發能夠先寫手機的樣式,而後加一通 -m
,-l
,-ns
幾分鐘就搞定適配。
/* 好比shadow */
.shadow-1 { box-shadow: 0 0 4px 2px rgba( 0, 0, 0, .2 ); }
.shadow-2 { box-shadow: 0 0 8px 2px rgba( 0, 0, 0, .2 ); }
.shadow-3 { box-shadow: 2px 2px 4px 2px rgba( 0, 0, 0, .2 ); }
.shadow-4 { box-shadow: 2px 2px 8px 0 rgba( 0, 0, 0, .2 ); }
.shadow-5 { box-shadow: 4px 4px 8px 0 rgba( 0, 0, 0, .2 ); }
複製代碼
.debug * { outline: 1px solid gold; }
.debug-grid { background: transparent url( data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAFElEQVR4AWPAC97/9x0eCsAEPgwAVLshdpENIxcAAAAASUVORK5CYII= ) repeat top left; }
複製代碼
debug-grid
會用網格描繪出現有元素盒子,debug
會給全部子元素盒子上金邊。當樣式沒有按你想象排版時,給相應元素加一個debug、debug-grid類多半能找到緣由。
/* 縱向 vertical */
.pv2 {
padding-top: .5rem;
padding-bottom: .5rem;
}
/* 橫行 horizontal */
.ph3 {
padding-left: 1rem;
padding-right: 1rem;
}
複製代碼
三方庫只要提供 className
的 props 就兼容,和其餘 css 解決天然是完美兼容,由於它就是原生態的css。 因此tachyons不能很好處理的部分只須要使用其餘解決方法或者原生css便可。值得一提的是,若是你不喜歡tachyons現有的類,本身寫個新類就行。在我看來tachyons只是提供了一種思路,徹底能夠寫一份適用大家團隊的tachyons.css
。
先上一個 Demo 看看幾行 tachyons 能作到的適配。
友情點名 tailwind.css 。它是一個受到 tachyons 啓發,試圖用 tachyons 的方式整合出一套能完成任何複雜度項目的 css 解決,比 tachyons 功能強大不少,須要必定學習。有興趣的能夠看看他們詳細的文檔。
下篇 styled-jsx,會談談我的最愛的大React項目css解決。