# Tailwind CSS 样式规范
## 版本信息
| 版本 | 日期 | 描述 | 作者 |
|------|------|------|------|
| 1.0 | 2025-10-15 | 初始Tailwind CSS样式规范 | Winston |
## 概述
本文档定义了出行服务项目中Tailwind CSS的使用规范和最佳实践,特别针对Taro小程序环境的适配和优化。
## 技术栈配置
### 核心依赖
```json
{
"tailwindcss": "^4.1.11",
"weapp-tailwindcss": "^4.2.5",
"@tailwindcss/postcss": "^4.1.11",
"autoprefixer": "^10.4.21",
"postcss": "^8.4.38"
}
```
## 配置规范
### Tailwind配置
```javascript
// tailwind.config.js
const { iconsPlugin, getIconCollections } = require("@egoist/tailwindcss-icons")
module.exports = {
content: [
'./src/**/*.{html,js,ts,jsx,tsx}',
],
theme: {
extend: {
colors: {
// 项目品牌色
primary: {
50: '#f0f9ff',
500: '#3b82f6',
600: '#2563eb',
700: '#1d4ed8',
},
// 语义化颜色
destructive: {
50: '#fef2f2',
500: '#ef4444',
600: '#dc2626',
},
},
spacing: {
'18': '4.5rem',
'88': '22rem',
},
borderRadius: {
'4xl': '2rem',
}
},
},
plugins: [
iconsPlugin({
collections: getIconCollections(["mdi", "lucide", "heroicons"]),
}),
],
corePlugins: {
preflight: false, // 小程序环境禁用preflight
},
}
```
### Webpack配置(小程序适配)
```javascript
// config/index.ts
mini: {
webpackChain(chain) {
chain.merge({
plugin: {
install: {
plugin: UnifiedWebpackPluginV5,
args: [{
cssSelectorReplacement: {
universal: ['view','text','button', 'input']
},
cssChildCombinatorReplaceValue: ['view', 'text', 'button', 'input']
}]
}
}
})
}
}
```
## 样式类名使用规范
### 原子化类名原则
**推荐做法:**
```tsx
// ✅ 使用原子化类名
标题
```
**不推荐做法:**
```tsx
// ❌ 避免自定义CSS类
标题
// 对应的CSS
.card-container { /* ... */ }
.card-title { /* ... */ }
.card-button { /* ... */ }
```
### 响应式设计
**移动端优先:**
```tsx
响应式文本
```
**小程序专用响应式:**
```tsx
适配不同屏幕
```
## 组件样式规范
### shadcn/ui组件适配
**按钮组件样式:**
```tsx
// src/components/ui/button.tsx
const buttonVariants = cva(
'inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none ring-offset-background',
{
variants: {
variant: {
default: 'bg-primary text-primary-foreground hover:bg-primary/90',
destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',
outline: 'border border-input hover:bg-accent hover:text-accent-foreground',
secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',
ghost: 'hover:bg-accent hover:text-accent-foreground',
link: 'underline-offset-4 hover:underline text-primary',
},
size: {
default: 'h-10 py-2 px-4',
sm: 'h-9 px-3 rounded-md text-xs',
lg: 'h-11 px-8 rounded-md',
icon: 'h-10 w-10',
},
},
defaultVariants: {
variant: 'default',
size: 'default',
},
}
)
```
### 表单组件样式
**输入框组件:**
```tsx
// src/components/ui/input.tsx
const inputVariants = cva(
'flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',
{
variants: {
variant: {
default: '',
search: 'pl-8',
},
},
defaultVariants: {
variant: 'default',
},
}
)
```
## 布局系统规范
### 容器布局
**页面容器:**
```tsx
{/* 安全区域适配 */}
{/* 内容容器 */}
{/* 页面内容 */}
```
**Flex布局:**
```tsx
左侧
右侧
自适应内容
```
### Grid布局
**网格系统:**
```tsx
卡片1
卡片2
卡片3
```
## 颜色系统规范
### 语义化颜色
**文本颜色:**
```tsx
主要文本
次要文本
弱化文本
错误文本
```
**背景颜色:**
```tsx
页面背景
卡片背景
弹出层背景
弱化背景
```
### 品牌颜色使用
**主要品牌色:**
```tsx
品牌文字
品牌边框
```
**状态颜色:**
```tsx
成功状态
警告状态
错误状态
信息状态
```
## 间距和尺寸规范
### 间距系统
**垂直间距:**
```tsx
{/* 小间距 */}
{/* 中等间距 */}
{/* 大间距 */}
{/* 超大间距 */}
```
**水平间距:**
```tsx
{/* 小间距 */}
{/* 中等间距 */}
{/* 大间距 */}
```
### 尺寸系统
**固定尺寸:**
```tsx
{/* 64px */}
{/* 96px */}
{/* 128px */}
```
**相对尺寸:**
```tsx
{/* 50%宽度 */}
{/* 100%宽度 */}
{/* 自动宽度 */}
{/* 最小宽度0 */}
```
## 字体和排版规范
### 字体大小
**文本层级:**
```tsx
辅助文本 (12px)
小文本 (14px)
基础文本 (16px)
大文本 (18px)
标题文本 (20px)
大标题 (24px)
```
### 字体粗细
**字重层级:**
```tsx
正常
中等
半粗
粗体
```
### 行高和字距
**行高控制:**
```tsx
紧密行高
正常行高
宽松行高
超松行高
```
## 交互状态规范
### 悬停状态
**按钮悬停:**
```tsx
```
**卡片悬停:**
```tsx
悬停变亮
```
### 焦点状态
**输入框焦点:**
```tsx
```
**按钮焦点:**
```tsx
```
### 激活状态
**按钮激活:**
```tsx
```
## 动画和过渡规范
### 过渡动画
**基础过渡:**
```tsx
所有属性过渡
颜色过渡
变换过渡
```
### 变换动画
**缩放变换:**
```tsx
悬停放大,点击缩小
```
**位移变换:**
```tsx
悬停上移
```
## 小程序特殊适配
### rpx单位使用
**响应式单位:**
```tsx
使用rpx单位
```
### 安全区域适配
**iPhone安全区域:**
```tsx
{/* 底部安全区域 */}
{/* 顶部安全区域 */}
```
## 性能优化规范
### 类名合并
**使用cn工具:**
```tsx
import { cn } from '@/utils/cn'
export function Component({ className, variant }) {
return (
内容
)
}
```
### 避免样式冲突
**作用域样式:**
```tsx
// 使用特定的前缀或命名空间
标题
```
## 最佳实践总结
1. **原子化优先**: 优先使用Tailwind原子类,避免自定义CSS
2. **语义化命名**: 使用有意义的颜色和尺寸命名
3. **响应式设计**: 移动端优先,逐步增强
4. **一致性**: 保持整个项目的样式一致性
5. **性能**: 合理使用类名合并,避免样式冗余
6. **可维护性**: 建立统一的样式规范和组件库
---
**文档状态**: 正式版
**下次评审**: 2025-11-15