# Uni-App-X 样式规范 - CRMEB 风格指南 ## 📚 概述 本文档定义了 mall 项目中所有页面的样式规范,参考 CRMEB 设计系统,使用 uni-app-x 的 `.uvue` 组件和 UTS 语言实现。 --- ## 1. 颜色规范 ### 1.1 基础色板 ```typescript // 在 uni.scss 中定义,所有 .uvue 文件都可使用 // 主要色系 $primary-color: #1890ff // 蓝色 - 主交互色 $success-color: #52c41a // 绿色 - 成功状态 $warning-color: #faad14 // 黄色 - 警告状态 $error-color: #ff4d4f // 红色 - 错误状态 $info-color: #1890ff // 信息色 $disabled-color: #bfbfbf // 禁用色 // 文字色系 $text-primary: #000000 // 主文本(标题、重点内容) $text-secondary: #666666 // 次文本(辅助信息) $text-tertiary: #999999 // 三级文本(弱化信息) $text-disabled: #bfbfbf // 禁用文本 // 背景色系 $background-primary: #ffffff // 主背景(卡片、模态框) $background-secondary: #fafafa // 次背景 $background-tertiary: #f5f5f5 // 页面背景 // 边框色系 $border-color: #d9d9d9 // 默认边框色 $border-light: #f0f0f0 // 浅边框(弱化分割) $border-dark: #bfbfbf // 深边框(强调分割) ``` ### 1.2 使用示例 ```uvue ``` --- ## 2. 间距规范 ### 2.1 间距系统 所有间距(margin、padding)**必须使用** `$space-*` 变量,基准为 **4px**: ```typescript $space-0: 0 // 无间距 $space-xs: 4px // 极小 - 图标之间 $space-sm: 8px // 小 - 小组件间距 $space: 12px // 基础 - 标准间距 $space-md: 16px // 中 - 块级元素间距 $space-lg: 24px // 大 - 大块间距 $space-xl: 32px // 极大 - 页面级间距 $space-2xl: 48px // 双倍极大 ``` ### 2.2 间距使用规则 ```scss // ✅ 正确用法 // 单个方向 .button { margin-bottom: $space; // 12px padding: $space-md; // 16px margin-right: $space-sm; // 8px } // 组合方向 .header { padding: $space-lg $space-md; // 24px 16px margin: $space 0; // 12px 0 } // ❌ 错误用法 - 不要这样做! .button { margin-bottom: 12px; // 不要使用硬编码值 padding: 5px; // 不要使用任意值 margin-right: 15px; // 必须使用变量 } ``` ### 2.3 常见间距场景 ```scss // 页面顶层间距 .page { padding: $space-lg; // 24px - 页面内边距 } // 卡片间距 .card { padding: $space-md; // 16px margin-bottom: $space-lg; // 24px } // 表单项目间距 .form-item { margin-bottom: $form-item-margin-bottom; // 16px } // 列表项目间距 .list-item { padding: $space-md; border-bottom: 1px solid $border-light; &:not(:last-child) { margin-bottom: 0; // 用 border 替代 } } // 按钮组间距 .button-group { display: flex; gap: $space-sm; // 8px } // 文字间距 .paragraph { line-height: $line-height-lg; // 1.8 margin-bottom: $space; // 12px } ``` --- ## 3. 圆角规范 ### 3.1 圆角系统 ```typescript $radius-0: 0 // 无圆角 - 锐角边缘 $radius-xs: 2px // 极小 - 微调 $radius-sm: 4px // 小 - 细微圆角 $radius: 6px // 默认 - 标准圆角(最常用) $radius-lg: 8px // 大 - 明显圆角 $radius-xl: 12px // 极大 - 大圆角 $radius-2xl: 16px // 双倍极大 $radius-full: 9999px // 完全圆形(胶囊形) ``` ### 3.2 圆角使用规则 ```scss // ✅ 正确用法 .card { border-radius: $radius; // 6px - 卡片默认值 } .badge { border-radius: $radius-full; // 9999px - 圆形徽章 } .button { border-radius: $radius-sm; // 4px - 按钮圆角 } .tag { border-radius: $radius-sm; // 4px } .input { border-radius: $radius-xs; // 2px - 输入框微调 } // ❌ 不要这样做 .card { border-radius: 8px; // 不要硬编码 border-radius: 50%; // 不要使用百分比 } ``` ### 3.3 场景应用 ```scss // 页面卡片 .page-card { background: $background-primary; border-radius: $radius; box-shadow: $shadow; } // 按钮 .btn { border-radius: $radius-sm; padding: $space-sm $space-md; } // 输入框 .input { border-radius: $radius-xs; border: 1px solid $border-color; padding: $space-sm $space-sm; } // 头像(圆形) .avatar { border-radius: $radius-full; width: 40px; height: 40px; } // 标签 .tag { display: inline-block; padding: $space-xs $space-sm; border-radius: $radius-sm; background: $background-secondary; } ``` --- ## 4. 阴影规范 ### 4.1 阴影系统 ```typescript $shadow-none: none // 无阴影 $shadow-xs: 0 1px 2px 0 rgba(0,0,0, 0.05) $shadow-sm: 0 1px 2px 0 rgba(0,0,0, 0.06) $shadow: 0 4px 6px -1px rgba(0,0,0, 0.1), 0 2px 4px -1px rgba(0,0,0, 0.06) // 默认 $shadow-md: 0 10px 15px -3px rgba(0,0,0, 0.1), 0 4px 6px -2px rgba(0,0,0, 0.05) $shadow-lg: 0 20px 25px -5px rgba(0,0,0, 0.1), 0 10px 10px -5px rgba(0,0,0, 0.04) $shadow-xl: 0 25px 50px -12px rgba(0,0,0, 0.25) // 强调 ``` ### 4.2 阴影使用规则 ```scss // ✅ 正确用法 // 卡片 - 使用标准阴影 .card { background: $background-primary; border-radius: $radius; box-shadow: $shadow; // 标准阴影 padding: $space-md; } // 浮动元素 - 使用较强阴影 .floating-btn { box-shadow: $shadow-lg; // 强调阴影 } // 模态框 - 使用最强阴影 .modal { box-shadow: $shadow-xl; } // 弱化分割线 .divider { box-shadow: $shadow-xs; // 极弱阴影 height: 1px; } // ❌ 不要这样做 .card { box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); // 不要硬编码 box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.3); // 不要使用任意值 } ``` ### 4.3 场景应用 | 场景 | 阴影 | 说明 | | ---------- | ---------- | -------- | | 页面背景 | none | 无需阴影 | | 卡片 | $shadow | 标准卡片 | | 列表项 | $shadow-xs | 弱化分割 | | 下拉菜单 | $shadow-lg | 浮动显示 | | 模态框背景 | $shadow-xl | 强调焦点 | | 悬停状态 | $shadow-md | 交互反馈 | | 输入框 | $shadow-xs | 焦点提示 | --- ## 5. 字体规范 ### 5.1 字体大小系统 ```typescript $font-size-xs: 12px // 极小 - 说明文字 $font-size-sm: 13px // 小 - 辅助信息 $font-size: 14px // 默认 - 正文(最常用) $font-size-md: 16px // 中 - 卡片标题 $font-size-lg: 18px // 大 - 页面二级标题 $font-size-xl: 20px // 极大 - 页面一级标题 $font-size-2xl: 24px // 双倍极大 $font-size-3xl: 30px // 三倍极大 - 页面主标题 ``` ### 5.2 行高和字重 ```typescript // 行高 $line-height-xs: 1.2 // 紧凑 - 标题 $line-height-sm: 1.4 // 小 $line-height: 1.6 // 默认 - 正文 $line-height-lg: 1.8 // 大 $line-height-xl: 2 // 特大 - 宽松 // 字重 $font-weight-normal: 400 // 常规 $font-weight-medium: 500 // 中等(用于强调) $font-weight-semibold: 600 // 半粗体(用于标题) $font-weight-bold: 700 // 粗体(强调标题) ``` ### 5.3 排版规范 ```scss // ✅ 正确用法 // 页面主标题 .page-title { font-size: $font-size-lg; font-weight: $font-weight-bold; color: $text-primary; margin-bottom: $space-md; } // 卡片标题 .card-title { font-size: $font-size-md; font-weight: $font-weight-semibold; color: $text-primary; } // 正文 .content { font-size: $font-size; line-height: $line-height; color: $text-secondary; } // 说明文字 .description { font-size: $font-size-sm; color: $text-tertiary; line-height: $line-height-sm; } // ❌ 不要这样做 .title { font-size: 18px; // 不要硬编码 font-weight: bold; // 不要使用 bold line-height: 1.5; // 不要硬编码 } ``` ### 5.4 排版场景 ```scss // 标题层级 h1 { font-size: $font-size-3xl; font-weight: $font-weight-bold; } h2 { font-size: $font-size-xl; font-weight: $font-weight-bold; } h3 { font-size: $font-size-lg; font-weight: $font-weight-semibold; } h4 { font-size: $font-size-md; font-weight: $font-weight-medium; } // 段落 p { font-size: $font-size; line-height: $line-height; margin-bottom: $space-md; } // 列表项 li { font-size: $font-size; line-height: $line-height; margin-bottom: $space-sm; } // 表格 td { font-size: $font-size; line-height: $line-height; padding: $space-sm; } ``` --- ## 6. 动画和过渡 ### 6.1 过渡系统 ```typescript $transition-duration-fast: 0.1s $transition-duration: 0.3s // 默认 $transition-duration-slow: 0.5s $transition-timing-linear: linear // 匀速 $transition-timing: cubic-bezier(0.645, 0.045, 0.355, 1) // 标准缓动(推荐) $transition-timing-ease-in: cubic-bezier(0.4, 0, 1, 1) $transition-timing-ease-out: cubic-bezier(0, 0, 0.2, 1) $transition-timing-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1) ``` ### 6.2 过渡使用 ```scss // ✅ 正确用法 // 悬停效果 .button { background: $primary-color; transition: all $transition-duration $transition-timing; &:active { opacity: 0.8; } } // 展开/折叠 .collapse { transition: height $transition-duration $transition-timing; } // 淡入淡出 .fade-enter-active, .fade-leave-active { transition: opacity $transition-duration $transition-timing; } .fade-enter-from, .fade-leave-to { opacity: 0; } ``` --- ## 7. 响应式设计 ### 7.1 断点系统 ```typescript $breakpoint-xs: 320px // 极小屏幕 $breakpoint-sm: 576px // 小屏(平板) $breakpoint-md: 768px // 中屏(平板) $breakpoint-lg: 992px // 大屏(笔记本) $breakpoint-xl: 1200px // 特大屏(桌面) $breakpoint-2xl: 1600px // 超大屏 ``` ### 7.2 媒体查询使用 ```scss // 手机优先设计 .page { padding: $space; // 手机:12px @media (min-width: $breakpoint-sm) { padding: $space-md; // 平板:16px } @media (min-width: $breakpoint-lg) { padding: $space-lg; // 桌面:24px } } // 栅格布局 .grid { display: grid; grid-template-columns: 1fr; // 手机:1列 @media (min-width: $breakpoint-sm) { grid-template-columns: repeat(2, 1fr); // 平板:2列 } @media (min-width: $breakpoint-lg) { grid-template-columns: repeat(3, 1fr); // 桌面:3列 } } ``` --- ## 8. Z-index 管理 ### 8.1 Z-index 系统 ```typescript $z-index-hide: -1 $z-index-base: 0 // 导航 $z-index-navbar: 100 $z-index-sidebar: 99 $z-index-sticky: 50 // 浮层 $z-index-dropdown: 1000 $z-index-popover: 1010 $z-index-tooltip: 1020 $z-index-modal-backdrop: 1040 $z-index-modal: 1050 $z-index-popconfirm: 1060 $z-index-notification: 1070 ``` ### 8.2 使用规则 ```scss .navbar { z-index: $z-index-navbar; // 导航栏始终在最上 } .modal-backdrop { z-index: $z-index-modal-backdrop; } .modal { z-index: $z-index-modal; // 模态框在背景上方 } .tooltip { z-index: $z-index-tooltip; // 提示框最高层 } ``` --- ## 9. 常见组件样式 ### 9.1 卡片(Card) ```uvue ``` ### 9.2 按钮(Button) ```scss .btn { height: $btn-height; padding: 0 $space-md; border: none; border-radius: $radius-sm; font-size: $font-size; font-weight: $font-weight-medium; cursor: pointer; transition: all $transition-duration $transition-timing; display: inline-flex; align-items: center; justify-content: center; gap: $space-xs; // 主按钮 &.btn-primary { background: $primary-color; color: #fff; &:active { opacity: 0.8; } } // 次按钮 &.btn-default { background: $background-secondary; color: $text-primary; border: 1px solid $border-color; &:active { background: $border-light; } } // 危险按钮 &.btn-danger { background: $error-color; color: #fff; &:active { opacity: 0.8; } } // 尺寸 &.btn-sm { height: $btn-height-sm; font-size: $font-size-sm; padding: 0 $space-sm; } &.btn-lg { height: $btn-height-lg; font-size: $font-size-md; padding: 0 $space-lg; } // 禁用状态 &:disabled, &.disabled { opacity: 0.6; cursor: not-allowed; } } ``` ### 9.3 输入框(Input) ```scss .input { height: $input-height; padding: 0 $space-sm; border: 1px solid $border-color; border-radius: $radius-xs; font-size: $font-size; color: $text-primary; background: $background-primary; transition: border-color $transition-duration $transition-timing; &::placeholder { color: $text-tertiary; } &:focus { outline: none; border-color: $primary-color; box-shadow: 0 0 0 3px rgba($primary-color, 0.1); } &:disabled { background: $background-secondary; color: $text-disabled; cursor: not-allowed; } // 尺寸变体 &.input-sm { height: $input-height-sm; } &.input-lg { height: $input-height-lg; } } ``` --- ## 10. 完整示例:列表页面 ```uvue ``` --- ## 总结 ✅ **必须遵循的规范**: 1. 所有色值必须使用 `$color-*` 变量 2. 所有间距必须使用 `$space-*` 变量 3. 所有圆角必须使用 `$radius-*` 变量 4. 所有阴影必须使用 `$shadow-*` 变量 5. 所有字体大小必须使用 `$font-size-*` 变量 6. 所有过渡必须使用 `$transition-*` 变量 ❌ **禁止**: - 硬编码任何数值(色值、尺寸、间距等) - 使用不规范的命名 - 创建局部样式变量与系统冲突 📝 **维护建议**: - 定期审查样式规范的使用情况 - 在新增样式变量前,检查是否已有相近的 - 保持设计系统的一致性和可维护性 --- **文档版本**: 1.0 **最后更新**: 2026-01-31 **维护者**: AI Assistant