從 Nuxt 文檔裏發現色彩的配搭訣竅

由於近期 Gitbook 非常的不穩定,導致木及簡歷 [1] 的幫助中心一直掛,一直在尋找一個比較好用,且簡單上手的文檔搭建系統,最好還是可以私有部署(使用免費服務多半會不穩定,還是自己付費部署香)。

最後在偶然之間看到了 https://tailwindcss.nuxtjs.org/, 感覺這個文檔的的搭配非常的好看,還提供了暗黑模式。

從網頁源碼就可以看出這個站點是由 Nuxt 來搭建的。

Nuxt.js 是一個基於 Vue.js 的輕量級應用框架,可用來創建服務端渲染 (SSR) 應用,也可充當靜態站點引擎生成靜態站點應用,具有優雅的代碼結構分層和熱加載等特性。

然後順勢摸索到了這個站點的 Github ,然後就發現了原來還有一款叫做 nuxt/content 的文檔站點工具。

拉取代碼後, nuxt/content 有一個配置叫做 primaryColor 屬性,只需要配置一個顏色就可以讓你的網站擁有一套色彩。以左側的菜單欄色彩搭配爲例,我們任意寫幾個顏色 。

primaryColor: '#1e4254'
primaryColor: '#c9f01b'
primaryColor: '#a42288'
primaryColor: '#5042d2'

這就非常有意思,然後我就想,nuxt/content[2] 是如何做到這個效果的呢?

本着我的探索(無聊)精神,我就打開了它的源碼,跟着一個個發現,順着源碼,我最終發現了一個叫做 theme-colors 的庫,來計算整體的色彩值。例如以下的樣子:

而其中運用的算法叫做 tint-shade 算法,就是往一個色彩中,添加一定比例白色和黑色,從而達到混合產生新色彩的過程。

雖然聽起來這個算法很牛逼的樣子,但是其實他和我們小時候,玩的調色原理是一毛一樣的。

圖片來源 [3]

舉個例子,我們有一個藍色小方塊,如果我們想要將它的色彩更淡一些,我們會怎麼做呢?

大家肯定能輕易想到,當然是往裏面加白色!

例如我們以 1 : 9 進行混合,將它們進行混合,爲了區分白色正好是藍色的 9 倍,我講白色畫了邊框。

混合後,我們得到了新的色彩~

也可以理解爲在小藍塊中加入了 8 分水,將小藍塊進行稀釋,我們可以看到小藍塊已經和小白塊一樣大了,但是它的透明度變成了原來的 1/9

然後我們來用動畫看一下,這個融合的過程

講完了原理以及動畫演示,我們只需要把這個過程通過代碼寫出來就可以了。

// components 代表 rgb 值,例如 [ 42, 175, 241 ]
function tint (components, intensity) {
  return components.map(c => Math.round(c *( 1 - intensity) + 255 * intensity))
}
// 藍色比白色爲 1:9
tint([ 42, 175, 241 ], 0.9);

計算公式如下

(42 * 0.1 + 255 * 0.9 , 175 * 0.1 + 255 * 0.9 , 241 * 0.1 + 255 * 0.9)

就等於 (234, 247, 254)  轉化爲 hex 就是 #eaf7fe

同理,我們想要得到更深的色彩,只需要讓它與黑色按照比例混合,黑色越多,色彩也就越深。

通過不斷對原色彩添加不同比例白色和黑色,就形成了這樣一條色帶,這個算法也是 Ant-Design 第一代的色彩系統。

{
  '50''#F4FBFE',
  '100''#EAF7FE',
  '200''#CAEBFC',
  '300''#AADFF9',
  '400''#6AC7F5',
  '500''#2AAFF1',
  '600''#269ED9',
  '700''#196991',
  '800''#134F6C',
  '900''#0D3548'
}

由於網站整體都是由 tailwind css  寫的,然後可以利用它的定製主題,在 css 中加入變量。

:root {
 --primary-50: #F4FBFE,
 --primary-100: #EAF7FE,
 ...
 --primary-900: #0D3548,
}
// tailwind.config.js
colors: {
  primary: {
    50: 'var(--primary-50)',
    100: 'var(--primary-100)',
    200: 'var(--primary-200)',
    300: 'var(--primary-300)',
    400: 'var(--primary-400)',
    500: 'var(--primary-500)',
    600: 'var(--primary-600)',
    700: 'var(--primary-700)',
    800: 'var(--primary-800)',
    900: 'var(--primary-900)'
  }
},

然後就可以在 class 中寫入以下的代碼

text-primary-500 bg-primary-100

就能得到:

不僅如此還可以定義 hover / 暗黑模式下的色彩搭配。

hover:text-primary-500 dark:bg-primary-900

所以,你看,是不是一切都很簡單,只是把我們小時候玩的東西,變成了代碼的形式。正如《千與千尋》所說,"曾經發生過的事情不可能忘記,只不過是想不起而已。" 那麼,看了我的文章之後,你們想起來了嗎?如果想起來了,可以留個言,也可以點個贊。

參考資料

[1]

木及簡歷: https://www.mujicv.com

[2]

nuxt/content: https://content.nuxtjs.org/themes/docs

[3]

圖片來源: https://zhuanlan.zhihu.com/p/164704064

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/MGiXbnodu4Dc0iT5Mc5euw