暗色主题
暗色主题为用户提供护眼的深色视觉体验,减少眼睛疲劳,适合夜间使用和长时间工作场景。
🎨 配置文件
暗色主题定义在 styles/themes/_dark.scss
文件中,通过 html.dark
选择器激活。
🌙 启用暗色主题
html
<html class="dark">
<!-- 整个应用切换到暗色主题 -->
</html>
📊 颜色系统
背景色层级
暗色主题同样采用 5 层背景色系统,但整体色调偏深:
scss
html.dark {
/* === 背景色层级系统 === */
--bg-base: #111113; /* 最深层:应用主背景 */
--bg-level-1: #161618; /* 一级:卡片、侧边栏基础背景 */
--bg-level-2: #1f1f23; /* 二级:轻微悬停、子区域 */
--bg-level-3: #262727; /* 三级:明显悬停、表格行悬停 */
--bg-level-4: #2d2d30; /* 四级:选中、激活状态 */
}
设计特点:
- 最深背景
#111113
接近纯黑,减少屏幕亮度 - 层级间差异适中,保持清晰的视觉层次
- 避免纯黑色,使用略带灰度的深色更柔和
应用级颜色
scss
html.dark {
/* 应用整体背景色 */
--app-bg: var(--bg-base);
/* 应用主要文字颜色 */
--app-text: #f1f5f9;
/* 应用边框颜色 */
--app-border: #363843;
}
文字颜色选择:
- 使用
#f1f5f9
而非纯白,降低刺眼感 - 边框颜色加深,保持暗色氛围
菜单配色方案
scss
html.dark {
/* 侧边栏菜单背景色 */
--menu-bg: var(--bg-level-1);
/* 菜单普通文字颜色 */
--menu-text: #cbd5e1;
/* 菜单激活状态文字颜色 */
--menu-text-active: #f4f4f5;
/* 基础悬停背景色 */
--menu-hover: var(--bg-level-2);
/* 基础悬停文字色 */
--menu-hover-text: #f4f4f5;
/* 子菜单背景色 */
--submenu-bg: var(--bg-level-2);
/* 子菜单激活文字色 */
--submenu-text-active: #f4f4f5;
}
暗色菜单特点:
- 与内容区统一使用深色背景
- 通过文字颜色和悬停效果区分状态
- 整体视觉更加沉浸
头部配色
scss
html.dark {
/* 头部背景色 */
--header-bg: var(--app-bg);
/* 头部文字色 */
--header-text: #f1f5f9;
/* 头部边框色 */
--header-border: #334155;
/* 表格头部背景色 */
--table-header-bg: var(--el-bg-color);
/* 表格头部文字色 */
--table-header-text: var(--el-text-color);
}
标签页配色
scss
html.dark {
/* 标签页激活背景色 */
--tags-view-active-bg: var(--el-color-primary-dark-6);
/* 标签页激活边框色 */
--tags-view-active-border: var(--el-color-primary-light-2);
}
🎯 Element Plus 集成
颜色映射
scss
html.dark {
/* Element UI 颜色映射 */
--el-color-primary: #3b82f6;
--el-color-primary-light-3: #60a5fa;
--el-color-primary-light-2: #3b82f6;
--el-bg-color-overlay: var(--bg-level-1);
--el-bg-color: var(--bg-level-1);
--el-text-color-primary: var(--app-text);
--el-border-color: var(--app-border);
--el-border-color-light: #475569;
}
暗色主题调整:
- 主色调整为略深的蓝色
#3b82f6
- 边框颜色使用深灰,避免过于刺眼
Element Plus 组件样式覆盖
scss
html.dark {
/* 树节点内容背景色 */
.el-tree-node__content {
--el-color-primary-light-9: var(--bg-level-3);
}
/* 主要按钮背景色 */
.el-button--primary {
--el-button-bg-color: var(--el-color-primary-dark-6);
--el-button-border-color: var(--el-color-primary-light-2);
}
/* 开关开启状态颜色 */
.el-switch {
--el-switch-on-color: var(--el-color-primary-dark-6);
--el-switch-border-color: var(--el-color-primary-light-2);
}
/* 主要标签背景色 */
.el-tag--primary {
--el-tag-bg-color: var(--el-color-primary-dark-6);
--el-tag-border-color: var(--el-color-primary-light-2);
}
}
🎨 特定样式覆盖
布局相关样式
scss
html.dark {
/* 主内容区背景色 */
.app-main {
background-color: var(--app-bg);
}
/* 侧边栏右侧边框 */
.sidebar-container {
box-shadow: none;
border-right: 0.5px solid var(--app-border);
}
/* 标签页容器背景色 */
.tags-view-container {
background-color: var(--header-bg);
border-color: var(--header-border);
}
}
卡片阴影效果
scss
html.dark {
/* 卡片类组件阴影 - 暗色主题下使用更深的阴影 */
.search, .panel, .el-card {
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.4);
}
}
表格悬停效果
scss
html.dark {
/* 表格悬停颜色 */
.el-table__body .el-table__row:hover > td {
background-color: var(--bg-level-3) !important;
}
}
SVG 图标颜色
scss
html.dark {
/* SVG图标填充色 */
.svg-icon, svg {
fill: var(--app-text);
}
}
🔧 使用示例
在组件中使用
vue
<template>
<div class="dark-card">
<h3 class="dark-title">暗色主题标题</h3>
<p class="dark-content">暗色主题内容</p>
</div>
</template>
<style scoped lang="scss">
.dark-card {
background: var(--bg-level-1);
border: 1px solid var(--app-border);
padding: 16px;
border-radius: 8px;
// 自动适配主题
color: var(--app-text);
}
</style>
主题感知组件
vue
<script setup lang="ts">
import { useDark } from '@vueuse/core'
const isDark = useDark()
</script>
<template>
<div :class="{ 'dark-mode': isDark }">
<!-- 根据主题显示不同内容 -->
<span v-if="isDark">🌙 暗色模式</span>
<span v-else>☀️ 亮色模式</span>
</div>
</template>
🎭 视觉特点
1. 护眼设计
- 深色背景减少蓝光刺激
- 降低屏幕整体亮度
- 适合长时间使用
2. 沉浸体验
- 统一的深色调
- 弱化边界,内容更聚焦
- 现代化的视觉感受
3. 柔和对比
- 避免纯黑纯白的强烈对比
- 使用中性灰度保持舒适度
🌈 配色建议
主色调整
scss
html.dark {
// 暗色主题下可使用更明亮的主色
--el-color-primary: #3b82f6; // 比亮色主题更亮的蓝色
}
辅助色
scss
html.dark {
--accent-color: #14b8a6; // 青色强调
--warning-bg: #78350f; // 暗色警告背景
}
对比度优化
scss
html.dark {
// 确保暗色主题下的对比度
--text-on-dark: #f1f5f9; // 对比度 15.8:1
--text-secondary: #cbd5e1; // 对比度 11.2:1
}
📱 响应式适配
scss
@media (max-width: 768px) {
html.dark {
// 移动端可能需要稍微提亮
--bg-base: #1a1a1c;
}
}
🔍 调试技巧
切换到暗色主题
javascript
// 激活暗色主题
document.documentElement.classList.add('dark')
// 取消暗色主题
document.documentElement.classList.remove('dark')
检查暗色变量
javascript
// 在暗色主题下检查变量
const bg = getComputedStyle(document.documentElement)
.getPropertyValue('--bg-base')
console.log('暗色主题背景:', bg) // #111113
✅ 最佳实践
- 保持一致性 - 所有组件都应支持暗色主题
- 避免纯黑 - 使用略带灰度的深色更舒适
- 测试对比度 - 确保文字在深色背景上清晰可读
- 提供切换选项 - 让用户自由选择主题模式
- 考虑系统偏好 - 可响应操作系统的暗色模式设置
javascript
// 响应系统暗色模式
const darkModeQuery = window.matchMedia('(prefers-color-scheme: dark)')
darkModeQuery.addEventListener('change', (e) => {
if (e.matches) {
document.documentElement.classList.add('dark')
} else {
document.documentElement.classList.remove('dark')
}
})
暗色主题为用户提供了舒适、护眼的视觉体验,是夜间使用和长时间工作的理想选择。