Files
2026-09-14 10:33:29 +08:00

3.6 KiB

样式与主题

:::tip 说明 前端样式方案采用 Tailwind CSS + Less + NaiveUI 主题覆盖,支持深色模式切换。全局 Less 变量通过 Vite 的 additionalData 注入。 :::

样式架构

src/styles/
├── var.less             # Less 全局变量(通过 Vite additionalData 注入)
├── index.less           # 入口文件,引入所有样式
├── tailwindbase.css     # Tailwind CSS 基础样式
└── naive-override.css   # NaiveUI 主题覆盖(可选)

Less 全局变量

Vite 配置中通过 additionalData 注入全局 Less 变量:

// vite.config.ts
css: {
    preprocessorOptions: {
        less: {
            additionalData: `@import "src/styles/var.less";`,
        },
    },
},

这意味着 var.less 中定义的变量在所有 .vue 和 .less 文件中自动可用,无需手动 @import。

Tailwind CSS

项目使用 Tailwind CSS 提供原子化样式能力,基础样式通过 tailwindbase.css 引入:

// main.ts
import './styles/tailwindbase.css';

常用类名

<!-- 间距 -->
<div class="p-4 m-2">padding 1rem, margin 0.5rem</div>

<!-- 布局 -->
<div class="flex items-center justify-between">Flex 布局</div>

<!-- 文字 -->
<p class="text-sm text-gray-500 font-bold">文字样式</p>

<!-- 响应式 -->
<div class="w-full md:w-1/2 lg:w-1/3">响应式宽度</div>

NaiveUI 主题

NaiveUI 通过 CSS 变量支持主题定制:

// main.ts
import 'naive-ui/dist/index.css';

NaiveUI 全局配置

// src/plugins/setupNaiveUI.ts
import { createDiscreteApi, darkTheme } from 'naive-ui';

export function setupNaiveUI(app) {
    // NaiveUI 通过 ConfigProvider 进行全局配置
    // 在 AppProvider 组件中通过 n-config-provider 设置 locale 和主题
}

深色模式

通过 NaiveUI 的主题变量和 Tailwind 的 dark 模式实现深色主题:

<template>
    <n-switch v-model:value="isDark" @change="toggleDark" />
</template>

<script setup>
const isDark = ref(false);
const toggleDark = (val) => {
    document.documentElement.classList.toggle('dark', val);
};
</script>

深色模式样式:

.dark {
 --n-base-color: #1d1e1f;
 --n-text-color-base: #e5eaf3;
 --n-border-color: #4c4d4f;
}

设计配置 Store

深色模式和主题色通过 designSetting store 管理:

// src/hooks/setting/useDesignSetting.ts

export function useDesignSetting() {
    return {
        getAppTheme: computed(() => designStore.appTheme),
        getDarkTheme: computed(() => designStore.darkTheme),
    };
}

页面样式约定

PageWrapper

页面使用 PageWrapper 组件包裹,提供统一的页面容器样式:

<template>
    <PageWrapper>
        <n-card :bordered="false" class="pt-3 mb-3 proCard">
            <!-- 搜索区域 -->
        </n-card>
        <n-card :bordered="false" class="proCard">
            <!-- 表格区域 -->
        </n-card>
    </PageWrapper>
</template>

proCard 样式

proCard 是项目定义的卡片样式类,用于统一卡片组件的间距和边框。

:::tip 温馨提示 优先使用 Tailwind 原子类实现样式,避免编写自定义 CSS。需要全局覆盖时使用 CSS 变量。Less 变量通过 Vite additionalData 自动注入,无需每个文件手动引入。 :::

总结

样式方案采用 Tailwind CSS 提供原子化样式 + Less 全局变量(Vite additionalData 注入)+ NaiveUI 主题覆盖,支持深色模式切换。designSetting store 管理主题配置,PageWrapper 组件提供统一页面容器。