最近遇到一個老的h5項目須要動態換主題顏色的需求,所謂動態換主題色,就是頁面須要在運行的時候,根據一些條件來更換顏色,而不是在編譯的過程當中就把顏色打包進去的靜態更換顏色。咱們這個項目是react+less的,以前用Less的變量作過靜態的更換顏色。今天也是忽然遇到這個問題,而且時間比較急,最後也是花了幾個小時來解決這個問題。css
我最開始搜索一些方案,發現less.js(是的,我也是今天才知道less還有js的工具),中實際上是有個方法(less.modifyvars)來動態更改less的變量的。固然首先遇到的問題就是不生效。一開始懷疑是頁面的生命週期的問題,因此就把modifyvars方法更改了幾個生命週期,發現都不生效。後面發現less.js報出一個錯誤,是說沒有讀取到樣式文件。通過查詢,是說要把less文件用link標籤在html頁面中引用,才能被讀取到。因此我就把放變量的less文件整個上傳到了七牛上,而後經過link標籤引用這個theme.less。引用後發現,在less的文件中,是讀取的不到這些顏色的變量的,會報錯。這時候這條路就感受走不通了。html
以後又找過一些webpack的插件,好比有一個叫'switch theme'的webpack插件。這個插件須要把樣式文件按照它的方式放到指定的目錄下,而且須要另外的loader纔可以生效。它提供了一個js的方法去動態的更改顏色。可是以爲這個改動仍是比較大,須要更改webpack的配置,並且自己咱們在less-loader和css-loader也有一些根據不一樣頁面的定製化配置,也不是很好的集成,因此這個方案也暫時放棄了。react
花了兩三個小時的查資料與折騰後,讀到了一篇大佬的文章:《史上最簡單的ant-design的換膚方案》,他的思路是使用css變量,在更改顏色的時候,經過js建立一個style標籤,把這些顏色的變量更新。webpack
下面是一些關鍵代碼,可讓你快速瞭解css變量 less 文件:web
:root { // css變量放在:root中
--theme-color:red;// 這裏定義一個css變量
}
div.selected {
color: var(--theme-color); // 經過var()來使用這個變量
}
複製代碼
js文件瀏覽器
const cssVar = `
:root {
--primary-color: green;// 這裏是要更改的顏色
}
`;
styleNode = document.createElement('style'); // 建立一個style 標籤
styleNode.innerHTML = `${cssVar}`; // style標籤中包含更改的css變量的內容
document.getElementsByTagName('head')[0].appendChild(styleNode); // 把這個style標籤放在header中,這樣更換的顏色就生效了
複製代碼
mdn上有介紹css變量的,想要深刻了解的能夠自行查閱。markdown
可能各位會擔憂css變量的兼容性,這裏附上caniuse的截圖 其實大部分瀏覽器是已經支持了,覆蓋率在94.5%。app
其實ant.design是實現了動態更改主題顏色的。ant.design也有一些webpack插件能夠更改ant.design中的主題色。我但願以後有時間的話能夠學習一下ant.design是怎麼實現的。less
能夠探索一下css變量的一些靈活的使用,不單單侷限於改變顏色工具
這是我2021年更30篇文的第2篇,進度2/30