# 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