vue-vben-admin 主题定制实战:3 步完成暗色模式与品牌主色定制
【免费下载链接】vue-vben-adminA modern vue admin panel built with Vue3, Shadcn UI, Vite, TypeScript, and Monorepo. It's fast!项目地址: https://gitcode.com/GitHub_Trending/vu/vue-vben-admin
本文以当前 monorepo 版本源码为准,讲清 vue-vben-admin 主题定制的完整流程:换品牌主色、启用暗色模式、扩展一对明暗业务变量,照着做完就能得到一个可用的主题切换交互。文中所有路径均为仓库内真实路径。
最终效果:主题定制做完能得到什么
配置完成后,你的项目会具备三种能力:一是全局品牌主色(按钮、链接、聚焦环等)按你的色值渲染;二是顶栏的主题按钮可在亮色、暗色(及跟随系统的 auto)之间切换,整个界面变量级联变暗而不闪烁;三是你在业务组件里写的自定义颜色会自动跟随明暗两套取值,不用写一行条件判断。
第一步:看懂 CSS 变量与工具类各管什么
当前版本的主题体系收敛为「运行时 CSS 变量 + 编译期 Tailwind 工具类」两层,先分清它们的分工,后面所有改动都有落点:
- CSS 变量(运行时):定义在 设计令牌文件 里,值是 HSL 三元组(不带
hsl()包裹)。主题切换时浏览器直接重算取值,无需重新编译。 - Tailwind 工具类(编译期):如
class="bg-background",构建时编译为background-color: hsl(var(--background))。类名是死的,变量是活的——所以改主题永远改变量,不改类。
默认主题的变量长这样(节选自 默认令牌):
:root { --primary: 212 100% 45%; /* 品牌主色:HSL 三个数,供 hsl(var(--primary)) 拼接使用 */ --card: 0 0% 100%; /* 卡片背景 */ --radius: 0.5rem; /* 全局圆角 */ }暗色版本放在同目录的 dark.css 中,挂在.dark选择器下——这是后两步联动的关键锚点。
第二步:如何修改预设主色与品牌主色
改主色有两个入口,按需取用:
1. 应用级覆盖(最常用)。在应用根目录的 preferences.ts 中用defineOverridesPreferences覆盖theme字段:
// 改动前:未覆盖 theme,使用框架默认主色 // 改动后:覆盖品牌主色与默认明暗模式 import { defineOverridesPreferences } from '@vben/preferences'; export const overridesPreferences = defineOverridesPreferences({ theme: { builtinType: 'default', // 内置主题名,决定>// 在 BUILT_IN_THEME_PRESETS 末尾追加一项(数组中每项含 type 与 color) { type: 'my-brand', color: 'hsl(160 84% 39%)', // 亮色模式主色 darkPrimaryColor: 'hsl(160 84% 52%)', // 暗色模式可单独给一套更深的主色 },面板里前 7 项预设由COLOR_PRESETS截取展示,新条目排在后面即可,无需改别的文件。
第三步:明暗变量如何联动暗色模式
先看懂框架切换主题的完整链路(更新逻辑 核心两行):
// 每次偏好变化时执行 root.classList.toggle('dark', dark); // 明暗由 html 上的 dark 类决定 root.dataset.theme = builtinType; //>:root { --brand-accent: 212 100% 45%; /* 亮色下的品牌强调色 */ } html.dark { --brand-accent: 245 82% 67%; /* 暗色下自动换值,选择器必须跟着 .dark 类走 */ }代码里判断当前明暗,用usePreferences提供的isDark计算属性(内部已处理auto模式的prefers-color-scheme逻辑),不要自己读 class:
import { usePreferences } from '@vben/preferences'; const { isDark } = usePreferences(); // 响应式:明暗切换时自动更新第四步:做出真正的切换交互并使用自定义变量
把前三步串成一个最小可用的组件:按钮切换明暗,卡片背景用你自定义的变量。
<script setup lang="ts"> import { preferencesManager, usePreferences } from '@vben/preferences'; const { isDark } = usePreferences(); // 切换:写回偏好即可,框架负责翻转 dark 类并重算所有变量 function toggleMode() { preferencesManager.setPreferences({ theme: { mode: isDark.value ? 'light' : 'dark' }, }); } </script> <template> <button class="banner" @click="toggleMode"> {{ isDark ? '切换到亮色' : '切换到暗色' }} </button> </template> <style scoped> .banner { background: hsl(var(--brand-accent)); /* 引用第三步定义的变量,明暗自动联动 */ color: #fff; } </style>点一下按钮,.dark类翻转,--brand-accent取到新值,按钮颜色即时变化——整条链路没有任何 DOM 重绘或重新编译。
注意事项
- 变量格式:写入 CSS 变量表的值必须是 HSL 三元组(如
212 100% 45%),因为框架与 Tailwind 都用hsl(var(--xxx))拼接;在preferences.ts的colorPrimary等字段里反而要写完整的hsl(...)。 - 改完要清缓存:偏好会持久化到浏览器,修改
preferences.ts或令牌文件后清掉站点存储再刷新,否则旧值覆盖新值,看起来像"没生效"。 - 联动选择器写
.dark:网上不少旧教程用html[data-theme='dark']控制暗色,那是早期版本的写法,当前版本明暗由dark类决定,照旧教程写不会生效。 - 性能:主题切换本质是纯 CSS 变量重算,尽量让组件直接引用变量而不是给元素增删 class;确需条件样式时用
isDark判断,避免在切换时手动遍历 DOM 改样式。 - 暗色主色可以不同:预设条目支持
darkPrimaryColor,品牌色在暗底上通常要提亮一档,别偷懒复用亮色值,否则深色模式下对比度会明显偏暗。
【免费下载链接】vue-vben-adminA modern vue admin panel built with Vue3, Shadcn UI, Vite, TypeScript, and Monorepo. It's fast!项目地址: https://gitcode.com/GitHub_Trending/vu/vue-vben-admin
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考