看这篇文章前,你应该了解:
- css变量
- @media(prefers-color-scheme: dark) {}
- 传统换肤技术
- 基于反差色的换肤技术
- 跟随系统的换肤技术
- 基于css变量的换肤技术
- 基于css变量,通过多套配置进行css的颜色代码替换,实现换肤
1. 传统换肤技术
css变量不普及前,换肤功能基本看不到,即使有换肤,也是每套皮肤都需要写一套css文件,成本非常大
2. 基于反差色的换肤技术
js反差色: www.npmjs.com/package/con…
postcss反差色: github.com/stephenway/…
优点:不需要依赖于css变量,如果是最求兼容性的话,不需要考虑太多东西。如果有颜色替换的插件的话,开发成本也会非常低
缺点:效果差,可以看看浏览器夜间模式的插件,大部分网页都会有瑕疵,且瑕疵程度不可控
3. 基于css变量的换肤技术
只需要声明每套皮肤的css变量表,实际css开发时,用的都是变量
优点:相对于传统换肤技术,开发难度大大降低了,这也是现在换肤功能较为普遍的原因
缺点:前端开发者需要经常查阅颜色表
4. 基于css变量,通过多套配置进行css的颜色代码替换,实现换肤
开发时只需要考虑颜色值即可,至于颜色替换啥的配置只需要配置一遍,对于开发时是完全透明的,开发时不需要考虑
postcss插件: github.com/z-juln/post…
优点:相对于只基于css变量的换肤技术而言,前端开发者不需要经常查阅颜色表,弥补了前者的缺点
缺点(postcss-peeling尚未完善点):
- postcss-peeling是我开发的,目前功能还不算强大,比如如果需要指定某行css不被替换的功能,目前就还没实现。后面我会用css注释的方法标明指定行
- 配置难,如果是需要多个postcss插件混合使用的场景,就需要按照固定顺序配置,需要你了解postcss-peeling的原理,才能知道固定顺序
- 配置参数colorMap目前只支持css语言,暂不支持less语言
- 目前还不支持rgb和rgba的替换,因为写插件时忽略了...
5. 跟随系统的换肤技术
与手动点击换肤按钮不同,跟随系统是自动的。
也可以做到既跟随系统,又有换肤按钮,而且不需要写太多代码。思路: 监听window.matchMedia的变化,一变化就切换:root的类名或属性。
css: @media(prefers-color-scheme: dark) {}
js:
- const isDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
- window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {const isDark = e.matches})
跟随系统相关的postcss插件: github.com/postcss/pos…
6. 动态主题换肤
真正的难点,我也还没认真研究
7. 其他css辅助技术
1. 通过图片获取大致颜色
node.js: www.npmjs.com/package/nod…
postcss插件: github.com/ismamz/post…
2. 通过指定x,y空间位置,获取颜色
好像目前还没有这种库和插件
3. 通过背景自动适配color
postcss插件: github.com/ben-eb/post…
4. 将颜色值转换成单词形式
postcss插件:
5. 将rgba转换成16进制形式
postcss插件: github.com/postcss/pos…