Replies: 8 comments 3 replies
-
这个思路希望能和官方团队确认下,如果行不通的话,是否有其它更好的办法能实现运行时切换主题。 否则我只能考虑采用 js 的方式去实现,通过解析 HEX ,把它转成 RGB 后再通过一系列的计算生成色彩阶梯需要的色值,再通过 js 去覆盖 css var |
Beta Was this translation helpful? Give feedback.
-
/cc @YunYouJun |
Beta Was this translation helpful? Give feedback.
-
很有趣的想法。事实上,我们的下一个目标正是构建一个主题市场,允许用户可以通过设置单一的主题色而获取不同色阶。 uncolor 是我此前编写的一个辅助小工具,您可以简单预览 HCT/HSB 的原理。 |
Beta Was this translation helpful? Give feedback.
-
默认提供了 |
Beta Was this translation helpful? Give feedback.
-
好像过了挺久还是没下文…… |
Beta Was this translation helpful? Give feedback.
-
Any update ? |
Beta Was this translation helpful? Give feedback.
-
https://github.com/ant-design/antd-color-editor It may help to realize this problem, but it needs to involve some design and calculation logic. It needs to make a calculation logic similar to the theme, and after debugging, it can generate 10 gradient colors by passing in the main color. The 10 gradients of the existing default theme color may be more closely aligned with the existing 10 colors; I might open a repo to do that https://github.com/ant-design/antd-color-editor 可能可以帮助去实现这个问题,不过需要涉及到一些设计与计算的逻辑,需要做一个类似theme的计算逻辑,并做调试后能够通过传入 主色生成10个梯度色;现有默认的主题色的10个梯度可能要更多的接近与已有的10个颜色;我可能会开个仓库去做这个事情 |
Beta Was this translation helpful? Give feedback.
-
前言首先讓我對@hooray前輩提出的idea致敬一下,要不是這麼細節的解說做法,我壓根沒想過色碼的原理,也不知道能轉成十進制去計算,給了我很大的啟發! 但我實作之後發現有點問題,首先遇到的是, 而且其他類型(如success, danger...等)不能直接套用,需要重新算一下RGB的間距,實在太為難我了,所以我試著找了別的方式。 我的方法在
我是SCSS菜雞,所以其實我也看不太懂,但很幸運地,我發現這個mix其實是SCSS的function,請見以下網址 它的功用就是將兩種顏色依照比例混合,產生新的顏色。 接下來的問題是,這個function是SCSS的,但我們要動態覆蓋生成的CSS var屬性就必須用javascript做,
那我想到這邊已經有解答了,就把light-3,5,7,8,9和dark-2都用這個mixColors算出來即可。 colorCode就是原本light-3,5,7,8,9和dark-2的HEX色碼,在我的專案中是讓user去點選顏色之後幫他換算這個顏色的色階所以才會用同一個變數,而white和black則分別帶入#ffffff和#000000
後記其實我很想試著用@xxholly32前輩的方式,看了一下好像是用typescript寫的,可惜在下初學Vue,還沒學到ts怎麼寫,實在是看不懂QQ... |
Beta Was this translation helpful? Give feedback.
-
我有这样一个需求,就是运行时的多主题切换。
由于 element-plus 并不支持在编译时就生成多套主题的样式(或许有方案),所以我只能在运行时去动态覆盖生成的 css var 属性。
但目前遇到一个比较麻烦的问题就是,比如我动态覆盖
--el-color-primary
后,--el-color-primary-light-3
--el-color-primary-light-5
... 这一系列和--el-color-primary
有关联的属性并没有变化。因为它们是在编译时通过 scss 的函数计算出来的,而编译生成 css var 后之间就没有直接关系了,所以通过覆盖 css var 时,需要将每一个属性都单独进行覆盖。而我希望能做到只修改覆盖一处,该颜色相关的色彩阶梯都能一并自动处理,就像很多组件背景色的 css var 是依赖--el-bg-color
和--el-bg-color-page
,我只需要覆盖--el-bg-color
和--el-bg-color-page
,这些组件的 css var 都一并生效了,不需要我修改覆盖太多 css var于是我想到的第一个方案是,用
rgb
的半透明来实现色彩阶梯,例如生成的 css var 可以是这样:但这又带来一个问题,半透明的效果应用在背景色上显然有点不合适,例如 el-button 这类组件,如果底色不是纯色,半透明的效果会影响视觉观感。
于是我思考其实可以将
--el-color-primary-value
进一步拆分成--el-color-primary-value-r
--el-color-primary-value-g
--el-color-primary-value-b
保存,因为我将默认生成的--el-color-primary
转成 rgb 后发现,色彩阶梯实际上是有一定规律的:因为生成的 css var 并没有
--el-color-primary-light-1
--el-color-primary-light-2
--el-color-primary-light-4
--el-color-primary-light-6
,如果我把这4个阶梯色值补上,并按照观察出的规律(即每个相邻的色值阶梯:red+19或20,green+9或10
),大致应该是这样:--el-color-primary-dark-2
比较特殊,因为就只有一个,也分析不出递减规律,就直接拿它和--el-color-primary
相减取一个固定值吧这样一顿分析后,似乎得到了我想要的结果,是否可以将 css var 生成成这样:
这样一来,实现运行时主题切换,就只需要覆盖
--el-color-primary-value-r
--el-color-primary-value-g
--el-color-primary-value-b
这 3 个色值即可,而无需关注色彩阶梯里的每个阶梯色的变化,会让主题切换变得轻松很多。其它如 success / warning / danger 也同理。
Beta Was this translation helpful? Give feedback.
All reactions