image-20230518201640739 image-20230518201640739

要实现如上暗黑模式和主题颜色的设置使用Popover 气泡卡片、el-color-picker取色器、el-switch基础组件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<!-- el-popover 
placement:展现的位置
title:标题
tigger:触发方式

el-color-picker
change:当绑定值变化时触发
show-alpha 是否支持透明度选择
predefine 预定义颜色

el-switch
change switch 状态发生变化时的回调函数
inactive-icon 和 active-icon 属性来添加图标
inline-prompt 属性来控制图标显示在点内
-->

<el-popover placement="bottom" title="主题设置" :width="300" trigger="hover">
<!-- 表单元素 -->
<el-form>
<el-form-item label="主题颜色">
<el-color-picker
@change="setColor"
v-model="color"
size="small"
show-alpha
:predefine="predefineColors"
/>
</el-form-item>
<el-form-item label="暗黑模式">
<el-switch
@change="changeDark"
v-model="dark"
class="mt-2"
style="margin-left: 24px"
inline-prompt
active-icon="MoonNight"
inactive-icon="Sunny"
/>
</el-form-item>
</el-form>
<template #reference>
<el-button size="small" icon="Setting" circle></el-button>
</template>
</el-popover>

其中change函数执行如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//颜色组件组件的数据
const color = ref('rgba(255, 69, 0, 0.68)')
const predefineColors = ref([
'#ff4500',
'#ff8c00',
'#ffd700',
'#90ee90',
'#00ced1',
'#1e90ff',
'#c71585',
'rgba(255, 69, 0, 0.68)',
'rgb(255, 120, 0)',
'hsv(51, 100, 98)',
'hsva(120, 40, 94, 0.5)',
'hsl(181, 100%, 37%)',
'hsla(209, 100%, 56%, 0.73)',
'#c7158577',
])

//switch开关的chang事件进行暗黑模式的切换
const changeDark = () => {
//获取HTML根节点
let html = document.documentElement
//判断HTML标签是否有类名dark
dark.value ? (html.className = 'dark') : (html.className = '')
}

//主题颜色的设置
const setColor = () => {
//通知js修改根节点的样式对象的属性与属性值
const html = document.documentElement
html.style.setProperty('--el-color-primary', color.value)
}