ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

一个变量换掉整块后台的皮:vue-vben-admin 主题定制,从品牌主色到暗色模式

一个变量换掉整块后台的皮:vue-vben-admin 主题定制,从品牌主色到暗色模式 一个变量换掉整块后台的皮vue-vben-admin 主题定制从品牌主色到暗色模式【免费下载链接】vue-vben-adminA modern vue admin panel built with Vue3, Shadcn UI, Vite, TypeScript, and Monorepo. Its fast!项目地址: https://gitcode.com/GitHub_Trending/vu/vue-vben-admin老板在群里甩来一句话后台主色换成品牌蓝顺便支持一下暗色模式。我一开始以为是场批量替换颜色的持久战结果一个下午干完只明白了一件事做 vue-vben-admin 主题开发最难的从来不是写代码而是搞清楚颜色住在哪里。找到位置之后改一个 CSS 变量整块后台就换肤了。先看成果登录页、按钮、菜单全部染上品牌蓝点右上角的日/月图标明暗模式之间丝滑切换。换肤的底层逻辑两套变量一个开关 动手之前值得花五分钟看懂颜色的住法不然改起来就是盲人摸象。先分清两种变量CSS 变量--开头活在浏览器运行时随时可以被 JS 换值是主题切换的主力Less/Sass 变量开头在编译期就被静态替换成死值只适合构建时就定死的样式细节。判断标准很简单运行时要变就用 CSS 变量不用动态切才考虑预处理变量。这也是暗色模式为什么不用 Less 变量的原因——不是 Less 不好是运行时它已经不存在了。那 CSS 变量定义在哪packages/core/base/design/src/design-tokens/default.css里每个语义色都以 HSL 三元组存放:root { --primary: 212 100% 45%; /* 主色只存三元组 */ --primary-foreground: 0 0% 98%; --radius: 0.5rem; }注意这里的坑vben 存的是裸三元组而不是hsl(212 100% 45%)用的时候必须自己包一层hsl(var(--primary))。暗色的值放哪同目录下的dark.css在.dark选择器下重新定义同名变量。这就引出第二个核心机制——明暗切换的本质是给html换类名// packages/core/preferences/src/update-css-variables.ts节选 const root document.documentElement; root.classList.toggle(dark, dark); // 切换 dark 类 root.dataset.theme builtinType; // 标记当前预设第三块拼图是预设主题色。packages/core/preferences/src/constants.ts里定义了BUILT_IN_THEME_PRESETS数组每个预设有一个亮色color还可以配darkPrimaryColor——进入暗色模式时主色自动换成更亮的值避免黑配黑{ color: hsl(240 5% 26%), primaryColor: hsl(240 5.9% 10%), darkPrimaryColor: hsl(0 0% 98%), // 暗色下自动换亮值 type: zinc, }最后是组件库怎么跟得上看packages/effects/hooks/src/use-design-tokens.ts它监听主题变化把--primary等 CSS 变量的当前值读出来灌进 antd / Naive / Element / TDesign 的设计 token。这就是改一个变量整个后台换皮的完整链路用户操作 →updatePreferences→ 写 class/属性 → CSS 变量换值 → 组件 token 跟随。跟做需求换成品牌蓝再支持暗色模式 ️以下操作都在你从模板复制出来的业务项目里进行开源仓库本身只作阅读参考。任务一默认主色换成品牌蓝。先把品牌蓝比如#3B5BFE用取色工具转成 HSL 三元组然后改default.css里的--primary:root { --primary: 229 99% 62%; }不想直接动文件的话也可以走页面右上角偏好面板里的自定义取色器面板里同样有主题设置入口面板里的选择走updatePreferences({ theme: { colorPrimary } })最终由updateCSSVariables用setProperty写到--primary上即时生效、无需刷新。任务二暗色模式下主色依然可读。两条路用内置预设的话确认它带darkPrimaryColor没有就在constants.ts的预设表里补一个自定义颜色的话直接在dark.css的.dark选择器下另定义一套值。任务三加一个业务色。比如营销卡片要用的品牌辅色星空紫/* default.css 的 :root 下 */ :root { --brand-secondary: 262 83% 58%; } /* dark.css 的 .dark 下再来一份 */ .dark { --brand-secondary: 262 90% 70%; }然后组件里直接引用别写死十六进制style scoped .brand-card { background: hsl(var(--brand-secondary)); } /style好处是辅色自动获得暗色版本设计以后再调色也只改一处。想加个按钮手动切明暗其实就三行const { isDark } usePreferences(); function toggle() { updatePreferences({ theme: { mode: isDark.value ? light : dark } }); }usePreferences/updatePreferences都来自vben/preferences。顶栏内置的主题切换器packages/effects/layouts/src/widgets/theme-toggle/theme-toggle.vue就是这么实现的只是额外套了一层 view transition 的圆形展开动画。我踩过的坑 忘了包hsl()。变量值是裸三元组直接background: var(--primary)是无效值页面会悄悄回退成默认色。主色亮色模式下好看、暗色下发黑。这正是darkPrimaryColor存在的意义不配就会回退用亮色值对比度常常不够。想靠改 Less 变量动态换样式。预处理变量编译完就不存在了运行时怎么改都没反应一切动态效果从 CSS 变量入手。清浏览器缓存后主题失忆。偏好设置按命名空间持久化在 localStorage缓存键叫preferences-theme清空缓存恢复默认主题这是设计如此不是 bug。再往前一步把机制吃透之后有几件事是顺手就能延伸的主题导入/导出。主题配置本来就是可序列化的偏好对象加个导出成 JSON / 粘贴 JSON 恢复的功能也就两个按钮的事换环境交接主题不再靠截图。对接 Figma。让设计同学在 Figma 里把 design tokens 导出成 JSON再一一映射到design-tokens里的变量名设计稿和开发走同一套颜色源色差归零。多项目共享主题。把packages/core/base/design的 design-tokens 抽成共享包这个 monorepo 里 web-antd、web-ele、web-naive 几个应用引用的就是同一套变量皮天然保持一致——monorepo 结构在主题上最直接的收益。从换品牌蓝到多项目换皮同步路其实只有一条变量定义清楚、值换得干净、切换交给 hooks剩下的浏览器会替你做完。【免费下载链接】vue-vben-adminA modern vue admin panel built with Vue3, Shadcn UI, Vite, TypeScript, and Monorepo. Its fast!项目地址: https://gitcode.com/GitHub_Trending/vu/vue-vben-admin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表