25 暗黑主题开发 - udo-bit/naive_admin_pro GitHub Wiki
完成暗黑主题模式配置
naive ui 本身对暗黑模式的支持度很好,所以我们使用他们的暗黑模式并没有太多的心智负担。 接下来我们一起来实现一下暗黑模式。 我们切到app.vue中。我们在一开始的时候已经配置了全局配置文件,所以我们先来看一下他的文档。 config-provider 我们直接可以通过配置theme属性可以实现暗黑主题 在app.vue中:
<script setup lang="ts">
import { darkTheme } from 'naive-ui'
</script>
<template>
<n-config-provider :theme="darkTheme">
<app-provider>
<router-view />
</app-provider>
</n-config-provider>
</template>
我们会发现我们的内容区域并没有变成暗黑模式,那是因为我们在styles/vars中没有配置暗黑模式,那么我们来添加暗黑模式下的背景色以及阴影色。
html.dark{
--pro-admin-layout-content-bg: #2A2C2C;
--pro-admin-layout-box-shadow: 0 1px 3px 0 rgba(13,13,13,.18);
}
但是我们会发现当我们向上滚动向下滚动的时候,背景色还是白色。那么我们来调整一下。同样是在styles/vars.css中配置:
html{
--pro-admin-layout-content-bg: #f0f2f5;
--pro-admin-layout-box-shadow: 0 1px 3px 0 rgba(0,0,0,.18);
+ background: var(--pro-admin-layout-content-bg);
}
再看我们的背景色已经变成暗黑模式了。
接下来我们实现一下动态切换暗黑模式,我们在之前开发完成的布局风格配置中添加一个暗黑模式的风格。 我们打开在config/layout-theme.ts文件,然后添加一个暗黑模式的类型。
export interface LayoutTheme {
layoutStyle: 'inverted' | 'light' | 'dark'
}
我们通过切换layout中的layoutStyle主题的变化来实现我们动态切换主题。 我们打开stores/app.ts文件: 在这里我们通过计算属性返回我们的布局样式如下:
const layoutTheme = computed(() => {
if (layout.layoutStyle === 'dark')
return darkTheme
return undefined
})
然后在app.vue中添加引用
<script setup lang="ts">
const appStore = useAppStore()
const { layoutTheme } = storeToRefs(appStore)
</script>
<template>
<n-config-provider :theme="layoutTheme">
<app-provider>
<router-view />
</app-provider>
</n-config-provider>
</template>
我们现在pages/index.vue中来测试一下我们的暗黑主题模式。
<script lang="ts" setup>
import type { LayoutTheme } from '~/config/layout-theme'
const appStore = useAppStore()
const onSwitch = (theme: LayoutTheme['layoutStyle']) => {
appStore.updateLayoutStyle(theme)
if (theme === 'dark')
document.documentElement.className = 'dark'
else
document.documentElement.removeAttribute('class')
}
</script>
<template>
<div>
<n-space>
<n-button @click="onSwitch('light')">
浅色
</n-button>
<n-button @click="onSwitch('dark')">
深色
</n-button>
</n-space>
</div>
</template>
测试切换