Files
wechat_wc/设计变更文档.md

17 KiB
Raw Permalink Blame History

智绘微刻小程序设计规范

版本:v1(草案)
适用范围:Taro + React + TypeScript 微信小程序的全部页面与组件
交付物:本规范 DESIGN.md + 交互式样例页 design-system.html
原则:一套 token、两套主题、统一组件行为,让设计语言先于页面实现。


1. 文档定位

这份规范把「智绘微刻」的小程序从现有的手账感装饰风,收敛为一套更现代、更克制、但保留品牌浪漫感的设计语言。

它同时承担三种角色:

  1. 设计 Token 定义:颜色、字体、间距、圆角、阴影、毛玻璃等全部由变量驱动。
  2. 组件行为定义:按钮、卡片、表单、弹窗、导航等组件的尺寸、状态和交互。
  3. 微信适配约束:rpx、安全区、自定义导航、深浅色、触控目标等微信小程序硬约束。

后续修改页面时,只允许从本规范取值,不允许继续引入新的硬编码颜色、字号或组件形态。


2. 设计原则

2.1 去装饰化

  • 不再使用 3px dashed 虚线卡片作为默认容器。
  • 移除 star-badge 星星贴纸装饰。
  • 装饰只承担功能:状态、层级、动效提示,不承担“氛围”。

2.2 留白优先

  • 用间距和字重建立信息层级,而不是用边框和卡片嵌套。
  • 页面横向统一 32rpx 留白,内容区不贴边。
  • 卡片之间用间距分隔,卡片内部用 padding 分隔。

2.3 克制色彩

  • 珊瑚粉只用于主操作、选中态和价格等关键信息。
  • 大面积背景使用暖白/深墨等中性色。
  • 蓝紫只做次级信息色(链接、地址、聚焦状态)。

2.4 现代质感

  • 毛玻璃只出现在需要浮层的场景:TabBar、吸顶栏、弹窗、底部操作区。
  • 阴影保持低饱和、低扩散,强调层级而不是“发光”。
  • 支持 160-240ms 的轻量过渡,不做夸张动画。

2.5 微信原生一致性

  • 全局使用 navigationStyle: custom 自定义导航,自行留出状态栏和胶囊区域。
  • 全部使用系统字体栈,不打包自定义字体。
  • 全部尺寸基于 750rpx 设计稿,最终在微信中由 rpx 转换。

3. 设计 Token 总览

/* 浅色主题 */
.theme-light {
  --bg-page: #faf7f2;
  --bg-card: #ffffff;
  --bg-muted: #f3eee7;
  --bg-input: #f5f1eb;
  --text-primary: #2e2622;
  --text-secondary: #8a7e76;
  --text-muted: #b3a89e;
  --accent-primary: #d96c6a;
  --accent-primary-strong: #c75b59;
  --accent-primary-soft: #f6e0dc;
  --accent-secondary: #6c7bdb;
  --accent-secondary-soft: rgba(108, 123, 219, 0.12);
  --success: #4fa477;
  --warning: #d99a4e;
  --danger: #d85d5d;
  --border: #ede5dc;
  --border-strong: #e0d5c8;
  --glass: rgba(255, 255, 255, 0.72);
  --shadow-card: 0 8rpx 24rpx rgba(46, 38, 34, 0.08);
  --shadow-elevated: 0 12rpx 40rpx rgba(46, 38, 34, 0.12);
}

/* 深色主题 */
.theme-dark {
  --bg-page: #191919;
  --bg-card: #23201d;
  --bg-muted: #2b2622;
  --bg-input: #2b2622;
  --text-primary: #f5efe8;
  --text-secondary: #b3a79c;
  --text-muted: #82766c;
  --accent-primary: #f09198;
  --accent-primary-strong: #ffa7ad;
  --accent-primary-soft: rgba(240, 145, 152, 0.14);
  --accent-secondary: #8e97e8;
  --accent-secondary-soft: rgba(142, 151, 232, 0.14);
  --success: #67c58e;
  --warning: #e0ad68;
  --danger: #ef7a7a;
  --border: #37312c;
  --border-strong: #463e37;
  --glass: rgba(25, 25, 25, 0.72);
  --shadow-card: 0 8rpx 24rpx rgba(0, 0, 0, 0.35);
  --shadow-elevated: 0 12rpx 40rpx rgba(0, 0, 0, 0.5);
}

design-system.html 中使用的 Web 版本会把这些值转为 px,但命名、层级和语义完全一致。


4. 色彩系统

4.1 中性色(占视觉面积最大)

Token 浅色 深色 用途
--bg-page #FAF7F2 暖白 #191919 页面背景
--bg-card #FFFFFF #23201D 卡片、弹窗、浮层表面
--bg-muted #F3EEE7 #2B2622 分组背景、表格表头
--bg-input #F5F1EB #2B2622 输入框、搜索框
--text-primary #2E2622 深墨 #F5EFE8 主标题、正文
--text-secondary #8A7E76 #B3A79C 说明、标签、辅助信息
--text-muted #B3A89E #82766C 弱提示、占位符

4.2 品牌色(珊瑚粉)

Token 浅色 深色 用途
--accent-primary #D96C6A #F09198 主按钮、价格、选中态
--accent-primary-strong #C75B59 #FFA7AD 按压态、强调文本
--accent-primary-soft #F6E0DC rgba(240,145,152,.14) 标签底、浅色选中背景

4.3 辅助色

Token 浅色 深色 用途
--accent-secondary #6C7BDB #8E97E8 二级链接、地址、聚焦
--success #4FA477 #67C58E 完成、成功、已下单
--warning #D99A4E #E0AD68 待处理、提醒
--danger #D85D5D #EF7A7A 删除、错误、取消

4.4 边框与阴影

  • 常规边框:1rpx solid var(--border)
  • 强调边框:1rpx solid var(--border-strong)
  • 聚焦边框:1rpx solid var(--accent-primary)
  • 卡片阴影:var(--shadow-card)
  • 弹窗/吸顶:var(--shadow-elevated)

4.5 禁止事项

  • 禁止整页彩色渐变背景。
  • 禁止大面积使用超过 2 种高饱和色。
  • 禁止在浅色页使用 #000 纯黑作为正文。
  • 禁止深色页使用 #fff 纯白作为正文。

5. 字体与排版

5.1 字体栈

-apple-system, BlinkMacSystemFont, 'PingFang SC', 'Hiragino Sans GB',
'Noto Sans SC', 'Microsoft YaHei', 'Segoe UI', sans-serif

不引入包内字体,控制小程序包体积并保证 iOS/Android 渲染一致。

5.2 字号阶梯(750rpx 设计稿)

名称 字号 字重 行高 用途
Display 56rpx 800 1.15 品牌大字、营销页面主标题
Title-LG 44rpx 700 1.2 页面主标题
Title 36rpx 700 1.25 区块标题、卡片标题
Heading 32rpx 600 1.3 小节标题、列表项名称
Body 28rpx 400 1.6 正文、表单内容
Caption 24rpx 400 1.4 说明文字、辅助信息
Micro 20rpx 500 1.2 标签、角标、时间

5.3 字重用例

  • 400:正文
  • 500:次级强调、输入内容
  • 600:按钮、小标题
  • 700:页面标题、卡片标题
  • 800:仅 Display 使用

5.4 排版规则

  • 标题不换行时使用 ellipsis 省略。
  • 正文行高默认 1.6,长条款可用 1.8。
  • 数字与货币使用 tabular-nums 风格,避免跳动。
  • 段落间距 16-24rpx,不靠空行制造层级。
  • 页面顶部大标题与内容之间至少保留 24rpx。

6. 间距与布局

6.1 间距梯度

所有间距从以下数值取:

4rpx · 8rpx · 12rpx · 16rpx · 24rpx · 32rpx · 48rpx · 64rpx · 96rpx

6.2 页面布局

  • 页面左右留白:32rpx
  • 页面底部安全区:calc(24rpx + env(safe-area-inset-bottom))
  • 卡片之间间隙:24rpx
  • 卡片内边距:24-32rpx
  • 分组标题与内容间距:24rpx

6.3 安全区

  • 顶部:用 Taro.getMenuButtonBoundingClientRect() 计算状态栏和胶囊位置,Header 下方再留 16-24rpx。
  • 底部:env(safe-area-inset-bottom)TabBar/操作栏必须避让。

7. 圆角、边框、阴影与毛玻璃

7.1 圆角

场景 圆角
输入框、小标签 16rpx
普通卡片 24rpx
弹窗、底部弹层 32rpx
按钮、胶囊 999rpx

7.2 边框

  • 只有一种默认边框:1rpx solid var(--border)
  • 弹窗和吸顶层可以换成 1rpx solid rgba(255,255,255,.16)(深色同理)。
  • 不再使用 3px 虚线卡片。

7.3 毛玻璃

.glass-surface {
  background: var(--glass);
  backdrop-filter: blur(24rpx);
  -webkit-backdrop-filter: blur(24rpx);
  border: 1rpx solid rgba(255, 255, 255, 0.42);
}

深色主题自动由 --glass 和 border 变量接管。

毛玻璃使用场景:

  • 自定义 TabBar
  • 页面吸顶信息条
  • 底部操作栏
  • 底部弹窗背景
  • 需要盖在图片上的卡片

8. 图标与图片

  • 图标统一放 src/icon/,构建时随包输出。
  • 图标尺寸只允许 24 / 32 / 40 / 48 / 56 / 80rpx。
  • 功能图标优先使用线性风格,选中态使用填充变体。
  • 禁止在 UI 中使用 emoji 代替图标。
  • 商品大图走 OSS/icon/* 小图标继续本地打包。
  • 图片统一 aspectFill,商品缩略图使用 aspect-ratio 固定比例,避免加载后跳动。

9. 组件规范

9.1 按钮

变体 背景 文字 边框
Primary --accent-primary
Secondary --bg-card --text-primary 1rpx --border-strong
Ghost 透明 --accent-primary
Destructive --danger

尺寸:

  • 大按钮:高度 96rpx,圆角 999rpx,字号 32rpx/600
  • 中按钮:高度 80rpx
  • 小按钮:高度 64rpx,字号 26rpx/600

状态:

  • 按压:scale(0.98) + 主色加深 4%
  • 禁用:opacity: 0.45,无点击反馈
  • Loading:按钮内显示 24rpx 环形 loading 后再显示文案
  • 危险操作必须二次确认(showModal

9.2 卡片

  • Surface Card:默认内容容器,--bg-card + 1rpx border + --shadow-card
  • Glass Card:信息浮层/图片上覆盖,使用毛玻璃。
  • Media Card:图片在上或居左,使用 aspect-ratio,文字区域带留白。
  • 卡片禁止再次嵌套 dashed-card,同一个视觉层最多出现一张卡片。

9.3 表单

  • 输入框高度 88rpx,圆角 16rpx,内边距 0 24rpx。
  • 占位符用 --text-muted,输入文字用 --text-primary
  • 聚焦时边框 --accent-primary,并保留 1px 位移/轻阴影反馈。
  • 错误信息:--danger,24rpx,显示在控件下方 8rpx。
  • textarea 最小高度 240rpx,内边距 24rpx,行高 1.6。

9.4 列表行

  • 最小高度 112rpx。
  • 左侧图标 48rpx,标题 32rpx/600,辅助信息 24rpx。
  • 右侧箭头 28rpx,使用 --text-muted
  • 分隔线:1rpx solid var(--border),默认左右留 32rpx。

9.5 标签与徽标

  • 高度 40rpx,圆角 999rpx,字号 22rpx/600。
  • 底色使用功能色的 12-15% 透明底,文字用对应功能色。
  • 徽标数字使用深色底或主色底,白字,最小宽高 28rpx。

9.6 Tabs 与分段控件

  • Tab 高度 88rpx,字号 28rpx/500。
  • 选中态:--accent-primary + 600 字重 + 48rpx 宽圆角指示条。
  • 分段控件置于 --bg-muted 容器,选中项为 --bg-card 浮起。

9.7 弹窗与底部弹层

  • 遮罩:rgba(0,0,0,0.5)
  • 居中弹窗:圆角 32rpx,内边距 40rpx,最大宽度 640rpx。
  • 底部弹层:顶部圆角 32rpx,底部延伸到安全区,顶部带 64rpx 宽拖动条。
  • 内容超过一屏时允许滚动,操作按钮固定在弹层底部。

9.8 空状态

  • 图标 96rpx,主题色 12% 透明圆形底。
  • 标题 32rpx/700,说明 26rpx/--text-secondary
  • 主 CTA 默认 80rpx 高度。
  • 空状态必须给出下一步动作,不让用户停在死胡同。

9.9 步进器与滑块

  • 步进器按钮 60rpx,圆角 16rpx,中缝数字宽度不小于 48rpx。
  • 滑块轨道高度 8rpx,圆角 999rpx。
  • 滑块圆点 32rpx,主色描边,拖动时 40rpx。
  • 滑块值实时显示在右侧,格式如 80%+12

9.10 Toast 与骨架屏

  • Toast 使用 rgba(40,35,32,0.92) 深色底、白字,圆角 24rpx。
  • 短文案优先 icon: 'none',成功才使用 icon: 'success'
  • 骨架屏用 --bg-muted,以 1.4s 透明度呼吸动画,不闪烁。

10. 页面结构规范

10.1 自定义导航

所有页面使用自定义导航,不再依赖系统导航栏背景:

// app.config.ts
window: {
  navigationStyle: 'custom',
  navigationBarTextStyle: 'black'
}

页面 Header 结构:

[状态栏空白]
[返回/标题/右侧操作](与胶囊按钮同一水平线,左右留 24rpx)
[16-24rpx 内容间距]

规则:

  • 返回按钮 48rpx 触控区,旧页面 字符统一替换为线性返回图标。
  • 标题 34rpx/600,居中,最多 8 个字。
  • 右侧操作与左侧占位保持同宽,保证标题真正居中。

10.2 页面层级

自定义导航 Header
页面内容区(左右 32rpx
固定操作栏 / TabBar(毛玻璃 + 安全区)

10.3 固定操作栏

  • 高度 112rpx + 安全区,圆角仅保留顶部 24rpx。
  • 背景使用毛玻璃,不透明底 --bg-card 作为降级。
  • 主 CTA 永远在屏幕右下角或通栏。

10.4 自定义 TabBar

  • 高度 96rpx + env(safe-area-inset-bottom)
  • 毛玻璃半透明底。
  • 图标 44rpx,选中态填充 + 轻放大;文字 20rpx/600。
  • 5 个 tab 均分,最大宽度 160rpx。

11. 微交互动效

  • 时长:160-240ms
  • 缓动:cubic-bezier(0.22, 1, 0.36, 1)
  • 只动画 opacitytransform,避免重排。
  • 按压反馈:按钮 scale(0.98),卡片 scale(0.975)
  • 页面进入:内容区上移 24rpx + 淡入,不要做成满屏位移动画。
  • Tab 切换、列表筛选不添加横向滑动动画,除非用户手势触发。

12. 深浅色模式

  • 沿用现有 theme.json + darkmode: true 作为系统探测通道。
  • 页面根节点统一 theme-light / theme-dark
  • 顶部状态栏文字只有黑/白两种,以 useStatusBar 控制。
  • 页面背景由 applyPageBackground 实时同步,避免顶部闪白。
  • 所有颜色必须走 token,不允许页面内再出现 #b08d8d#fce4ec 等硬编码。

13. 微信官方约束与应用

本项目相关约束都来自微信官方文档,引用如下:

约束 官方说明 链接
小程序设计指南 官方对导航、触控、反馈等设计建议 https://developers.weixin.qq.com/miniprogram/design/
rpx 尺寸单位 750rpx 屏幕宽度设计稿 https://developers.weixin.qq.com/miniprogram/dev/framework/view/wxss.html
app.json 全局配置 navigationStyledarkmodethemeLocation https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/app.html
深色模式适配 theme.jsononThemeChange https://developers.weixin.qq.com/miniprogram/dev/framework/ability/darkmode.html
自定义 tabBar custom: true 与组件实现 https://developers.weixin.qq.com/miniprogram/dev/framework/ability/custom-tabbar.html

本规范落地时必须满足:

  1. 尺寸:一律使用 rpx,基于 750 设计稿。
  2. 触控:主要点击目标不小于 88rpx(约 44pt)。
  3. 导航navigationStyle: custom,自行避让胶囊按钮和状态栏。
  4. 背景:系统顶栏文字只有黑/白,因此所有页面背景必须通过自定义导航的留白与 backgroundColorTop/Bottom 协同控制。
  5. 包体积:小于 2MB,图标本地打包,大图走 OSS。
  6. 字体:使用系统字体,降低排版与体积风险。
  7. 深色模式:所有颜色走 theme-light/theme-dark token。

14. 当前代码映射

将现有 src/app.scss 变量迁到新规范:

现有变量 新规范
--bg-page: #ffffff --bg-page: #faf7f2
--bg-card: #ffffff --bg-card: #ffffff
--line-card: 3px dashed #ffb7c5 删除,卡片改 1rpx solid var(--border)
--line-star: #ffb7c5 删除,统一用 --border
--text-primary: #5c3a3a --text-primary: #2e2622
--text-secondary: #b08d8d --text-secondary: #8a7e76
--text-muted: #d28a8a --text-muted: #b3a89e
--accent-pink: #ff9a9e --accent-primary: #d96c6a
--accent-blue: #5b8cff --accent-secondary: #6c7bdb
--btn-gradient Primary 按钮改实色 --accent-primary,可保留极淡渐变
--shadow-card --shadow-card: 0 8rpx 24rpx rgba(46,38,34,.08)
--bg-input: #f8f9fa --bg-input: #f5f1eb

页面迁移检查项:

  • 删除 .dashed-card.star-badge 的视觉依赖。
  • src/pages/orders/index.scss 等硬编码颜色改为 token。
  • 全项目统一在 SCSS 中直接书写 rpx,减少 px/rpx 混用。
  • 弹窗、TabBar、底部操作栏统一使用毛玻璃。
  • 空状态、Toast、骨架屏按第 9.8/9.10 节统一。

15. 验收清单

  • 所有页面使用同一套 CSS 变量,无新增硬编码颜色。
  • 页面没有 3px dashed 卡片和星星装饰。
  • 自定义导航在所有机型避让状态栏与胶囊按钮。
  • 深浅色切换后所有页面文字与背景可读。
  • 主要点击目标 ≥ 88rpx。
  • 表单有聚焦、错误、禁用状态。
  • 空状态都有下一步动作。
  • TabBar、吸顶栏、底部弹层为毛玻璃。
  • 页面横向留白统一 32rpx。
  • 图片有固定比例,加载前后不跳动。

16. 下一步

  1. 打开 design-system.html 检查样例细节。
  2. 按反馈修订本规范。
  3. 将 token 落地到 src/app.scss
  4. 按页面迁移清单逐页替换,最后真机回归深浅色与安全区。