feat: 优化

This commit is contained in:
2026-03-16 00:49:29 +08:00
parent c2eda4d1e8
commit cd1382533c

View File

@@ -5,13 +5,14 @@
## 目录
1. [现代设计原则](#现代设计原则)
2. [颜色系统](#颜色系统)
3. [间距系统](#间距系统)
4. [字体系统](#字体系统)
5. [阴影系统](#阴影系统)
6. [圆角系统](#圆角系统)
7. [响应式布局](#响应式布局)
8. [状态样式](#状态样式)
2. [老旧组件识别与现代化](#老旧组件识别与现代化)
3. [颜色系统](#颜色系统)
4. [间距系统](#间距系统)
5. [字体系统](#字体系统)
6. [阴影系统](#阴影系统)
7. [圆角系统](#圆角系统)
8. [响应式布局](#响应式布局)
9. [状态样式](#状态样式)
---
@@ -26,6 +27,8 @@
- 拥挤无呼吸感的布局
- 间距混乱、缺乏层级感
- 老式的表单样式(密集排列)
- **老旧 Tabs 设计**(底部粗线、方块按钮感)
- **Element UI 风格组件**el-tabs、el-form 等)
**✅ 拥抱现代设计**
- 轻量边框或无边框设计
@@ -34,6 +37,7 @@
- 充足留白,呼吸感
- 清晰的视觉层级4px 间距递进)
- 现代表单(宽松布局,清晰标签)
- **现代 Tabs**胶囊式、underline 轻量)
### 颜色活力设计
@@ -61,7 +65,8 @@
### 间距层级感
```
gap-2 (8px) - 同组元素
gap-1 (4px) - 图标与文字
标准gap-2 (8px) - 同组元素
舒适gap-3 (12px) - 表单项之间
宽松gap-4 (16px) - 卡片内容
分区gap-6 (24px) - 不同区块
@@ -70,6 +75,172 @@
---
## 老旧组件识别与现代化
### 老旧 Tabs 设计
**❌ 拒绝的老旧模式**
- 底部粗线指示器2-3px 实线)
- 方块按钮感,无圆角
- 灰色背景分割条
- 拥挤的标签间距
**✅ 现代替代方案**
```vue
<!-- 老旧: a-tabs / el-tabs -->
<a-tabs v-model:activeKey="activeKey">
<a-tab-pane key="1" tab="标签一" />
<a-tab-pane key="2" tab="标签二" />
</a-tabs>
<!-- 现代: shadcn Tabs 胶囊式 -->
<Tabs v-model="activeKey" class="w-full">
<TabsList class="bg-muted/50 p-1 rounded-lg">
<TabsTrigger value="1" class="rounded-md data-[state=active]:bg-background">
标签一
</TabsTrigger>
<TabsTrigger value="2" class="rounded-md data-[state=active]:bg-background">
标签二
</TabsTrigger>
</TabsList>
<TabsContent value="1">内容一</TabsContent>
<TabsContent value="2">内容二</TabsContent>
</Tabs>
```
### 老旧表单设计
**❌ 拒绝的老旧模式**
- Label 左对齐,密集排列
- 表单项间距过小
- 边框重叠,视觉混乱
- 灰暗的禁用状态
**✅ 现代替代方案**
```vue
<!-- 现代表单: 垂直布局宽松间距 -->
<form class="space-y-6">
<div class="space-y-2">
<Label class="text-sm font-medium">用户名</Label>
<Input class="h-10" />
<p class="text-xs text-muted-foreground">提示文字</p>
</div>
<div class="space-y-2">
<Label>密码</Label>
<Input type="password" class="h-10" />
</div>
<div class="flex gap-3 pt-4">
<Button variant="outline">取消</Button>
<Button>提交</Button>
</div>
</form>
```
### 老旧卡片设计
**❌ 拒绝的老旧模式**
- 重阴影shadow-lg 以上)
- 多重边框嵌套
- 灰暗的头部背景
**✅ 现代替代方案**
```vue
<!-- 现代卡片: 轻量呼吸感 -->
<div class="rounded-xl border bg-card p-6 shadow-sm">
<h3 class="text-lg font-semibold">标题</h3>
<p class="text-muted-foreground mt-2">描述文字</p>
</div>
<!-- 或使用无边框设计 -->
<div class="bg-muted/30 rounded-xl p-6">
<!-- 内容 -->
</div>
```
### 老旧按钮设计
**❌ 拒绝的老旧模式**
- 方角按钮
- 过重的渐变背景
- 灰暗的 hover 状态
**✅ 现代替代方案**
```vue
<!-- 现代按钮: 圆角轻盈 -->
<div class="flex gap-2">
<Button variant="default" class="rounded-lg">主要</Button>
<Button variant="secondary" class="rounded-lg">次要</Button>
<Button variant="outline" class="rounded-lg">描边</Button>
<Button variant="ghost" class="rounded-lg">幽灵</Button>
<Button variant="destructive" class="rounded-lg">危险</Button>
</div>
```
### 老旧表格设计
**❌ 拒绝的老旧模式**
- 斑马纹背景(过时)
- 粗重的边框线
- 拥挤的单元格
- 灰色的表头背景
**✅ 现代替代方案**
```vue
<!-- 现代表格: 简洁留白 -->
<Table>
<TableHeader>
<TableRow class="hover:bg-transparent border-b">
<TableHead class="h-12 font-medium">列名</TableHead>
</TableRow>
</TableHeader>
<TableBody>
<TableRow class="hover:bg-muted/50">
<TableCell class="py-4">内容</TableCell>
</TableRow>
</TableBody>
</Table>
```
### 边框重叠问题
**识别边框重叠**
- 多个卡片紧挨,边框叠加成 2px
- 表格单元格边框重叠
- 嵌套容器边框累积
**解决方案**
```vue
<!-- 边框重叠 -->
<div class="border p-4">
<div class="border p-4"> <!-- 边框叠加 -->
内容
</div>
</div>
<!-- 避免重叠 padding 分隔 -->
<div class="border-b pb-4">
<div class="pt-4">
内容
</div>
</div>
<!-- 使用负边距合并边框 -->
<div class="border rounded-lg divide-y">
<div class="p-4">项目1</div>
<div class="p-4">项目2</div>
</div>
```
---
## 颜色系统
### 语义化颜色变量
@@ -119,7 +290,6 @@
border: 1px solid var(--border);
}
</style>
</template>
```
### Ant Design 颜色迁移
@@ -179,16 +349,6 @@ Tailwind 使用 4px 基准:
</div>
```
### Ant Design 间距迁移
| Ant Design | Tailwind |
|------------|----------|
| `margin: 16px` | `m-4` |
| `padding: 24px` | `p-6` |
| `gap: 8px` | `gap-2` |
| `space-between` | `justify-between` |
| `align-center` | `items-center` |
---
## 字体系统
@@ -216,16 +376,6 @@ Tailwind 使用 4px 基准:
</template>
```
### 行高
```vue
<template>
<p class="leading-tight">紧凑行高</p>
<p class="leading-normal">正常行高</p>
<p class="leading-relaxed">宽松行高</p>
</template>
```
---
## 阴影系统
@@ -238,7 +388,6 @@ Tailwind 使用 4px 基准:
--shadow-md /* 中等阴影 */
--shadow-lg /* 大阴影 */
--shadow-xl /* 超大阴影 */
--shadow-2xl /* 巨大阴影 */
```
### 使用
@@ -251,50 +400,18 @@ Tailwind 使用 4px 基准:
</template>
```
### Ant Design 阴影迁移
| Ant Design | Tailwind |
|------------|----------|
| `box-shadow: 0 2px 8px rgba(0,0,0,0.15)` | `shadow-md` |
| Modal 阴影 | `shadow-xl` |
| Popover 阴影 | `shadow-lg` |
---
## 圆角系统
定义在 `theme.css`
```css
--radius-sm /* 小圆角 */
--radius-md /* 中圆角 */
--radius-lg /* 大圆角 */
--radius-xl /* 超大圆角 */
```
### 使用
```vue
<template>
<!-- 使用 Tailwind -->
<Button class="rounded-md">按钮</Button>
<Card class="rounded-lg">卡片</Card>
<Input class="rounded-md" />
<!-- 自定义圆角 -->
<div class="rounded-[var(--radius-lg)]">自定义</div>
</template>
```
### Ant Design 圆角迁移
| Ant Design | Tailwind |
|------------|----------|
| `border-radius: 2px` | `rounded-sm` |
| `border-radius: 4px` | `rounded` |
| `border-radius: 8px` | `rounded-lg` |
| `border-radius: 12px` | `rounded-xl` |
---
## 响应式布局
@@ -309,29 +426,6 @@ Tailwind 使用 4px 基准:
| `xl:` | 1280px |
| `2xl:` | 1536px |
### 响应式示例
```vue
<template>
<!-- 响应式网格 -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
<Card v-for="item in items">...</Card>
</div>
<!-- 响应式隐藏 -->
<div class="hidden md:block">桌面端显示</div>
<div class="md:hidden">移动端显示</div>
<!-- 响应式间距 -->
<div class="p-4 md:p-6 lg:p-8">
...
</div>
<!-- 响应式文字 -->
<h1 class="text-2xl md:text-3xl lg:text-4xl">标题</h1>
</template>
```
### 栅格迁移
```vue
@@ -346,312 +440,6 @@ Tailwind 使用 4px 基准:
<div>...</div>
<div>...</div>
</div>
<!-- 或使用 Flex -->
<div class="flex gap-4">
<div class="flex-1">...</div>
<div class="flex-1">...</div>
</div>
```
---
## 状态样式
### 悬停
```vue
<template>
<Button class="hover:bg-primary/90">按钮</Button>
<Card class="hover:shadow-md transition-shadow">卡片</Card>
</template>
```
### 焦点
```vue
<template>
<Input class="focus:ring-2 focus:ring-primary" />
<Button class="focus-visible:ring-2 focus-visible:ring-primary">
按钮
</Button>
</template>
```
### 禁用
```vue
<template>
<Button class="disabled:opacity-50 disabled:cursor-not-allowed">
按钮
</Button>
<Input class="disabled:bg-muted disabled:cursor-not-allowed" />
</template>
```
### 加载中
```vue
<template>
<Button class="relative" disabled>
<Spinner v-if="loading" class="absolute" />
<span :class="{ 'opacity-0': loading }">提交</span>
</Button>
</template>
```
---
## 过渡动画
### 基础过渡
```vue
<template>
<!-- 颜色过渡 -->
<Button class="transition-colors hover:bg-primary">按钮</Button>
<!-- 阴影过渡 -->
<Card class="transition-shadow hover:shadow-lg">卡片</Card>
<!-- 全属性过渡 -->
<div class="transition-all hover:scale-105">元素</div>
</template>
```
### 动画时长
```vue
<template>
<div class="transition-colors duration-150">快速</div>
<div class="transition-colors duration-200">正常</div>
<div class="transition-colors duration-300">慢速</div>
</template>
```
---
## 常见样式模式
### 卡片
```vue
<template>
<div class="rounded-lg border bg-card p-6 shadow-sm">
<h3 class="text-lg font-semibold">标题</h3>
<p class="text-muted-foreground mt-2">描述文字</p>
</div>
</template>
```
### 表单项
```vue
<template>
<div class="space-y-2">
<Label class="text-sm font-medium">标签</Label>
<Input class="h-10" />
<p class="text-xs text-muted-foreground">提示文字</p>
</div>
</template>
```
### 操作栏
```vue
<template>
<div class="flex items-center justify-between py-4">
<div class="text-sm text-muted-foreground"> {{ total }} </div>
<div class="flex gap-2">
<Button variant="outline" size="sm">导出</Button>
<Button size="sm">添加</Button>
</div>
</div>
</template>
```
### 空状态
```vue
<template>
<div class="flex flex-col items-center justify-center py-12 text-center">
<Icon icon="lucide:inbox" class="h-12 w-12 text-muted-foreground/50" />
<h3 class="mt-4 text-lg font-medium">暂无数据</h3>
<p class="mt-2 text-sm text-muted-foreground">点击添加按钮创建</p>
<Button class="mt-4">添加</Button>
</div>
</template>
```
---
## 老旧组件识别与现代化
### 老旧 Tabs 设计
**❌ 拒绝的老旧模式**
- 底部粗线指示器2-3px 实线)
- 方块按钮感,无圆角
- 灰色背景分割条
- 拥挤的标签间距
**✅ 现代替代方案**
```vue
<!-- 老旧: a-tabs / el-tabs -->
<a-tabs v-model:activeKey="activeKey">
<a-tab-pane key="1" tab="标签一" />
<a-tab-pane key="2" tab="标签二" />
</a-tabs>
<!-- 现代: shadcn Tabs -->
<Tabs v-model="activeKey" class="w-full">
<TabsList class="bg-muted/50 p-1 rounded-lg">
<TabsTrigger value="1" class="rounded-md data-[state=active]:bg-background">
标签一
</TabsTrigger>
<TabsTrigger value="2" class="rounded-md data-[state=active]:bg-background">
标签二
</TabsTrigger>
</TabsList>
<TabsContent value="1">内容一</TabsContent>
<TabsContent value="2">内容二</TabsContent>
</Tabs>
```
### 老旧表单设计
**❌ 拒绝的老旧模式**
- Label 左对齐,密集排列
- 表单项间距过小(<16px
- 边框重叠,视觉混乱
- 灰暗的禁用状态
**✅ 现代替代方案**
```vue
<!-- 现代表单: 垂直布局宽松间距 -->
<form class="space-y-6">
<div class="space-y-2">
<Label class="text-sm font-medium">用户名</Label>
<Input class="h-10" placeholder="请输入" />
<p class="text-xs text-muted-foreground">提示信息</p>
</div>
<div class="space-y-2">
<Label>密码</Label>
<Input type="password" class="h-10" />
</div>
<div class="flex gap-3 pt-4">
<Button variant="outline">取消</Button>
<Button>提交</Button>
</div>
</form>
```
### 老旧卡片设计
**❌ 拒绝的老旧模式**
- 重阴影shadow-lg 以上)
- 多重边框嵌套
- 灰暗的头部背景
- 拥挤的内边距
**✅ 现代替代方案**
```vue
<!-- 现代卡片: 轻量呼吸感 -->
<div class="rounded-xl border bg-card p-6">
<div class="flex items-center justify-between pb-4 border-b">
<h3 class="text-lg font-semibold">标题</h3>
<Button variant="ghost" size="sm">操作</Button>
</div>
<div class="pt-4 space-y-4">
<!-- 内容 -->
</div>
</div>
<!-- 或使用无边框设计 -->
<div class="bg-muted/30 rounded-xl p-6">
<!-- 内容 -->
</div>
```
### 老旧按钮设计
**❌ 拒绝的老旧模式**
- 方角按钮
- 过重的渐变背景
- 灰暗的 hover 状态
**✅ 现代替代方案**
```vue
<!-- 现代按钮: 圆角轻盈 -->
<div class="flex gap-2">
<Button variant="default" class="rounded-lg">主要</Button>
<Button variant="secondary" class="rounded-lg">次要</Button>
<Button variant="outline" class="rounded-lg">描边</Button>
<Button variant="ghost" class="rounded-lg">幽灵</Button>
<Button variant="destructive" class="rounded-lg">危险</Button>
</div>
```
### 老旧表格设计
**❌ 拒绝的老旧模式**
- 斑马纹背景(过时)
- 粗重的边框线
- 拥挤的单元格
- 灰色的表头背景
**✅ 现代替代方案**
```vue
<!-- 现代表格: 简洁留白 -->
<Table>
<TableHeader>
<TableRow class="hover:bg-transparent border-b">
<TableHead class="h-12 font-medium">列名</TableHead>
</TableRow>
</TableHeader>
<TableBody>
<TableRow class="hover:bg-muted/50">
<TableCell class="py-4">内容</TableCell>
</TableRow>
</TableBody>
</Table>
```
### 边框重叠问题
**识别边框重叠**
- 多个卡片紧挨边框叠加成2px
- 表格单元格边框重叠
- 嵌套容器边框累积
**解决方案**
```vue
<!-- 边框重叠 -->
<div class="border p-4">
<div class="border p-4"> <!-- 边框叠加 -->
内容
</div>
</div>
<!-- 避免重叠 -->
<div class="border-b pb-4">
<div class="pt-4"> <!-- padding 分隔 -->
内容
</div>
</div>
<!-- 或使用负边距 -->
<div class="border rounded-lg -space-y-px">
<div class="p-4 border-b last:border-b-0">项目1</div>
<div class="p-4 border-b last:border-b-0">项目2</div>
</div>
```
---