UI 框架的主題色一般怎麼實現的?
之前用過material-ui,裡面可以變化主題色,我們現在要根據傳入的不同參數,做主題色。源文件的是sass。
解決思路:
1、通過服務端編譯,node-sass或者ruby,移動端感覺性能不好
2、本地編譯好幾套css模板,不是有限級,不夠擴展
3、定義主題的class名,在用到地方加入class名,再通過js動態改變class名里的顏色,我暫時是這樣做的,但是,有一些地方會用到:before,就要特殊處理,感覺也不友好
要在客戶端動態切換主題顏色,要做的無非是兩點:
- 定義所有元素的顏色樣式和主題色的映射關係;
- 在客戶端主題色切換時觸發樣式切換。
建立映射
以下(總體上)動態程度遞增,可用程度(兼容性)遞減:
- 預處理器的色彩函數(編譯時),可以靈活定義映射關係:
@brand-color: #e10601;
@brand-color-light: tint(@brand-color, 10%);h1 {
color: @brand-color;
}h2 {
color: @brand-color-light;
}
- currentColor(運行時),只能表達直接使用 color 屬性值:
html {
color: #e10601;
}h1 {
background-color: currentColor;
color: #fff;
}
- 用 CSS 變數(運行時),可以使用多個變數,不依賴 color,但需要枚舉值:
:root {
--brand-color: #e10601;
--brand-color-light: #e41f1a;
}h1 {
color: var(--brand-color);
}h2 {
color: var(--brand-color-light);
}
- color-mod() 函數(運行時),可以像預處理器一樣靈活定義映射關係,但是這還只存在於CSS Color Module Level 4這份草案中,並沒有瀏覽器實現。結合 CSS 變數的話,可以寫成:
:root {
--brand-color: #e10601;
--brand-color-light: color-mod(var(--brand-color) tint(10%));
}h1 {
color: var(--brand-color);
}h2 {
color: var(--brand-color-light);
}
這樣才基本上在瀏覽器端實現了預處理器的相關功能。這裡有一個在線演示可以看看語法(注意這裡用的是 color() 函數而非 color-mod(),是因為 color-mod() 是草案中後來修改過的名字)。
切換樣式
很顯然,上面四中方法中只有預處理器、CSS 變數是有可能實際使用的。那麼:
- 如果用預處理器,服務端編譯服務肯定是可行的,只是速度可能不會太快。Element UI 2.0 文檔右上角加了更換主題色的功能,應該就是通過服務端編譯實現的。Less.js 支持在前端動態編譯 Less 樣式,雖然也是一個選項,但是性能也不怎麼樣,而且你需要在前端引入 Less.js 的整個運行環境。這些方法本質上都是在前端動態生成 &