mcpField
U
ui-design-patterns

ui-design-patterns

github.com/manutej设计与 UI62853 次安装40 周前更新
代码仓库

关于 ui-design-patterns

介绍 Web 和移动应用常见界面与交互模式的参考技能。它帮助设计师和开发者构建可复用界面、处理易用性与无障碍需求,并评审导航、表单和数据展示。

主要功能

  1. 01导航与菜单模式
  2. 02表单验证指南
  3. 03可复用组件模式
  4. 04无障碍实践
  5. 05响应式设计指南
  6. 06界面评审原则

适用场景

  1. 01规划文档站点的导航
  2. 02设计表单验证与反馈
  3. 03评审界面的无障碍性
  4. 04以响应式布局呈现数据

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/manutej/luxor-claude-marketplace --skill ui-design-patterns

安装后在 Claude Code 中输入/ui-design-patterns确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

EXAMPLES.md
README.md
SUMMARY.txt

详细介绍

UI 设计模式

全面介绍常见的用户界面设计模式、组件模式、交互模式,以及构建现代 Web 和移动应用的无障碍最佳实践。

何时使用此技能

在以下情况下使用此技能:

  • 设计用户界面:创建直观且易用的界面设计
  • 实现 UI 组件:遵循成熟模式构建可复用的界面组件
  • 解决 UX 问题:运用经过验证的解决方案应对常见的用户体验挑战
  • 确保无障碍:让所有用户(包括残障人士)都能访问界面
  • 构建设计系统:创建一致的组件库和设计系统
  • 评审界面:根据易用性和最佳实践评估现有界面
  • 制作交互原型:设计并实现交互式 UI 行为
  • 优化导航:规划信息架构和导航流程
  • 处理表单设计:创建验证和反馈机制完善的有效表单
  • 展示数据:以清晰、易于浏览的格式呈现复杂数据
  • 提供反馈:有效传达系统状态和用户操作
  • 响应式设计:让界面适配不同的屏幕尺寸和设备

核心概念

UI 模式

UI 模式是针对常见设计问题的可复用解决方案,具有以下优势:

  • 一致性:用户能在不同应用中识别熟悉的模式
  • 高效性:经过验证的解决方案可节省设计和开发时间
  • 易用性:模式经过广泛使用、测试和改进
  • 沟通:为设计师和开发者提供共同的术语
  • 无障碍:成熟的模式通常会考虑无障碍需求
设计系统

设计系统由可复用的组件、模式和指南组成:

  • 组件库:可复用的 UI 构建模块
  • 设计令牌:用于颜色、间距和排版的变量
  • 使用指南:说明每个组件的使用时机和方法
  • 无障碍标准:符合 WCAG 的要求
  • 代码示例:实现参考
  • 文档:全面的指南和原则
原子设计方法

将界面拆分为原子单元:

  • 原子:基本构建模块(按钮、输入框、标签)
  • 分子:原子的简单组合(带按钮的搜索框)
  • 有机体:复杂组件(页眉、表单、卡片)
  • 模板:页面级布局
  • 页面:包含实际内容的具体实例

导航模式

1. 标签页模式

将内容组织到多个面板中,每次显示一个面板。

适用场景:

  • 同一层级的相关内容类别
  • 区块数量有限(理想情况下为 3–7 个标签页)
  • 用户需要频繁切换视图
  • 屏幕空间有限

结构:

[Tab 1] [Tab 2] [Tab 3]
─────────────────────────
Content for active tab

最佳实践:

  • 清晰突出显示当前标签页
  • 标签文字简短且具有描述性
  • 切换标签页时保留状态
  • 使用图标和文字提升清晰度
  • 确保键盘导航正常工作
  • 考虑移动设备上的替代方案(下拉菜单、分段控件)

无障碍:

  • 使用 ARIA role="tablist"、role="tab"、role="tabpanel"
  • 实现方向键导航
  • 设置 aria-selected 和 aria-controls
  • 确保标签页面板可获得焦点

HTML 示例:

<div role="tablist" aria-label="Content sections">
  <button role="tab" aria-selected="true" aria-controls="panel-1" id="tab-1">
    Overview
  </button>
  <button role="tab" aria-selected="false" aria-controls="panel-2" id="tab-2">
    Details
  </button>
  <button role="tab" aria-selected="false" aria-controls="panel-3" id="tab-3">
    Settings
  </button>
</div>

<div role="tabpanel" id="panel-1" aria-labelledby="tab-1">
  Overview content...
</div>
2. 手风琴模式

垂直堆叠的分区,支持展开和折叠。

适用场景:

  • 包含多个不同分区的长页面
  • 渐进式展示信息
  • FAQ 分区
  • 设置面板
  • 屏幕空间有限

类型:

  • 单项展开:一次只能展开一个面板
  • 多项展开:可以同时展开多个面板
  • 嵌套式:手风琴中嵌套手风琴

最佳实践:

  • 使用清晰、描述性强的标题
  • 提供视觉提示(箭头、+/-)
  • 考虑默认状态(折叠或默认展开第一项)
  • 平滑地播放过渡动画(200-300ms)
  • 折叠时保留内容
  • 支持键盘操作

无障碍访问:

  • 使用 <button> 作为标题
  • 设置 aria-expanded 属性
  • 使用 aria-controls 关联标题和面板
  • 确保支持键盘导航(Enter、Space、方向键)
  • 提供恰当的标题层级

结构示例:

<div class="accordion">
  <h3>
    <button aria-expanded="false" aria-controls="section-1">
      Section Title
      <span class="icon" aria-hidden="true">▼</span>
    </button>
  </h3>
  <div id="section-1" hidden>
    <p>Section content...</p>
  </div>
</div>
3. 面包屑模式

显示用户在网站层级结构中的位置。

适用场景:

  • 层级较深的网站(3 层以上)
  • 电商网站的分类导航
  • 文档网站
  • 多步骤流程

最佳实践:

  • 清晰显示当前位置
  • 让上级层级可点击
  • 使用合适的分隔符(>、/、→)
  • 保持标签简洁
  • 考虑在移动端截断内容
  • 放置在页面顶部

无障碍访问:

  • 使用带有 aria-label="Breadcrumb" 的 <nav>
  • 使用 aria-current="page" 标记当前页面
  • 确保颜色对比度充足
  • 确保支持键盘导航

示例:

<nav aria-label="Breadcrumb">
  <ol>
    <li><a href="/">Home</a></li>
    <li><a href="/products">Products</a></li>
    <li><a href="/products/electronics">Electronics</a></li>
    <li aria-current="page">Laptops</li>
  </ol>
</nav>
4. 分页模式

浏览拆分为多个页面的大量内容。

类型:

  • 编号分页:显示页码(1、2、3……)
  • 加载更多:通过按钮加载更多内容
  • 无限滚动:用户滚动时自动加载内容
  • 上一页/下一页:在页面间进行简单导航

适用场景:

  • 搜索结果
  • 商品列表
  • 博客归档
  • 数据表格

最佳实践:

  • 清晰显示当前页
  • 提供“上一页”/“下一页”控件
  • 包含“首页”/“末页”链接
  • 显示总页数或结果数
  • 对省略的页码使用省略号(1 ... 5 6 7 ... 20)
  • 妥善保持滚动位置
  • 考虑加载时间和性能

无障碍访问:

  • 使用带有 aria-label="Pagination" 的 <nav>
  • 使用 aria-current="page" 标记当前页面
  • 正确禁用无效链接
  • 为仅图标控件提供文本替代
5. 菜单模式
下拉菜单

点击或悬停时显示更多选项。

最佳实践:

  • 优先使用点击而非悬停,以兼容移动设备
  • 悬停时,延迟一小段时间再关闭
  • 使用箭头图标标示子菜单
  • 保持菜单层级较浅(最多 2-3 层)
  • 智能定位,避免超出视口范围
巨型菜单

显示多个列和类别的大型下拉菜单。

适用场景:

  • 类别众多的电商网站
  • 信息架构复杂的网站
  • 标准下拉菜单显得拥挤时

最佳实践:

  • 使用网格布局进行组织
  • 添加视觉元素(图标、图片)
  • 将相关项目分组
  • 提供清晰的视觉层级
  • 点击菜单外部或按 Esc 键时关闭
汉堡菜单

用于移动端导航的可折叠菜单。

最佳实践:

  • 使用易于识别的图标(三条水平线)
  • 添加标签以提高清晰度(“菜单”)
  • 为展开和关闭添加动画
  • 菜单展开时禁用页面主体滚动
  • 在菜单中添加关闭按钮
  • 考虑采用更易发现的替代方案

无障碍访问:

  • 使用正确的 ARIA 角色和状态
  • 支持键盘导航
  • 向屏幕阅读器播报菜单状态
  • 确保妥善管理焦点

表单模式

1. 输入验证模式

提供有关用户输入是否正确的反馈。

验证类型:

  • 必填字段:必须填写
  • 格式验证:电子邮件、电话、URL 格式
  • 长度验证:最小/最大字符数
  • 范围验证:数值范围
  • 自定义规则:业务逻辑验证

验证时机:

  • 提交时:传统方式,一次性显示所有错误
  • 失焦时:离开字段时进行验证
  • 输入时:输入过程中实时验证
  • 混合方式:结合多种方式,获得最佳用户体验

最佳实践:

  • 清楚标记必填字段(星号、“必填”标签)
  • 在字段附近显示内联错误消息
  • 使用清晰、有帮助的错误消息
  • 适时显示成功状态
  • 将相关错误归类
  • 表单有效前禁用提交(可选)
  • 显示错误时保留用户输入
  • 支持浏览器自动填充

错误消息指南:

  • 明确指出问题
  • 说明如何修正
  • 使用友好、非技术性的语言
  • 避免归咎于用户(“你输入了……” → “电子邮件格式无效”)

视觉指示:

  • 错误时使用红色边框/背景
  • 成功/有效时使用绿色
  • 使用图标强化状态提示
  • 确保足够的颜色对比度

无障碍性:

  • 对无效字段使用 aria-invalid="true"
  • 使用 aria-describedby 关联错误消息
  • 向屏幕阅读器播报错误
  • 确保错误消息在程序上与对应字段相关联

示例:

<div class="form-field">
  <label for="email">
    Email Address <span aria-label="required">*</span>
  </label>
  <input
    type="email"
    id="email"
    aria-invalid="true"
    aria-describedby="email-error"
    required
  />
  <div id="email-error" class="error-message" role="alert">
    Please enter a valid email address
  </div>
</div>
2. 多步骤表单模式

将较长的表单拆分为多个步骤或页面。

适用场景:

  • 包含许多字段的复杂表单
  • 需要对相关信息进行逻辑分组
  • 引导流程
  • 结账流程
  • 用户注册

组成部分:

  • 进度指示器:显示当前步骤和总步骤数
  • 步骤导航:在步骤之间切换
  • 确认步骤:提交前查看摘要
  • 保存草稿:允许稍后继续

最佳实践:

  • 每个步骤专注于一个主题
  • 清楚显示进度
  • 允许向前和向后导航
  • 继续之前验证每个步骤
  • 自动保存进度
  • 提供跳过可选步骤的方式
  • 尽可能显示预计耗时
  • 使用描述性步骤标题

进度指示器:

  • 线性步骤(1 → 2 → 3 → 4)
  • 带编号的步骤标签
  • 完成百分比
  • 可视化时间线

无障碍性:

  • 为步骤指示器使用 aria-label
  • 播报步骤变化
  • 确保键盘导航正常工作
  • 标记已完成/当前/即将进行的步骤
3. 内联编辑模式

无需单独打开表单,直接在原位置编辑内容。

适用场景:

  • 类似电子表格的界面
  • 快速编辑现有内容
  • 数据表
  • 用户个人资料
  • 设置页面

交互模式:

  • 单击编辑:单击字段即可进行编辑
  • 始终可编辑:字段始终处于编辑模式
  • 编辑按钮:通过明确的按钮进入编辑模式
  • 行/项目编辑:一次编辑整行或整个项目

最佳实践:

  • 为可编辑区域提供清晰的视觉反馈
  • 清楚显示编辑模式(边框、背景变化)
  • 提供保存/取消操作
  • 失焦时自动保存(可选)
  • 保存前进行验证
  • 保存期间显示加载状态
  • 妥善处理错误
  • 提供键盘快捷键(按 Enter 保存,按 Esc 取消)

视觉状态:

  • 默认:显示内容,并暗示其可编辑
  • 悬停:提示可交互
  • 编辑:清晰显示输入/编辑界面
  • 保存中:显示加载指示器
  • 已保存:短暂显示成功确认

无障碍性:

  • 使用语义化 HTML 元素
  • 提供清晰的标签
  • 播报状态变化
  • 支持仅使用键盘进行交互
4. 搜索模式
自动补全/输入提示

在用户输入时显示建议。

最佳实践:

  • 对输入进行防抖处理(延迟 300ms)
  • 高亮匹配的字符
  • 同时显示最近结果和相关结果
  • 限制建议数量(5-10 条)
  • 支持键盘导航(方向键、Enter)
  • 按 Esc 清除建议
  • 显示“无结果”状态
  • 提供搜索按钮作为备用方式

无障碍:

  • 使用 role="combobox" 和 aria-autocomplete
  • 播报建议数量
  • 使用 aria-activedescendant 标记高亮选项
  • 确保支持屏幕阅读器
筛选

根据条件缩小结果范围。

类型:

  • 分面搜索:多个筛选类别
  • 标签筛选:选择/取消选择标签
  • 范围筛选:用于数值范围的滑块
  • 日期筛选:日期选择器或预设选项

最佳实践:

  • 清晰显示已启用的筛选条件
  • 显示结果数量
  • 支持清除单个或所有筛选条件
  • 实时更新结果,或通过“应用”按钮更新
  • 在 URL 中保留筛选状态
  • 为常见查询提供筛选预设
5. 表单布局模式
单列

最适合移动设备,且布局简单。

优点:

  • 更便于纵向浏览
  • 移动设备体验更好
  • 降低认知负担
  • 提高完成率
多列

适用于相关字段或需要节省空间的情况。

最佳实践:

  • 将相关字段放在一起
  • 标签左对齐
  • 仅用于较短的表单
  • 在移动设备上改为堆叠布局
标签位置
  • 顶部标签:完成速度最快,最适合移动设备
  • 左侧标签:节省空间,适合数据录入
  • 行内标签:占位符样式(谨慎使用)

数据展示模式

1. 表格模式

以行和列的形式展示结构化数据。

适用场景:

  • 比较多个维度的数据
  • 需要排序/筛选的大型数据集
  • 需要精确呈现的详细数据
  • 管理界面和仪表板

基本功能:

  • 排序:点击表头对列进行排序
  • 筛选:按列搜索或筛选
  • 分页:处理大型数据集
  • 行选择:使用复选框执行批量操作
  • 响应式:适配移动设备屏幕

高级功能:

  • 调整列宽:拖动以调整宽度
  • 调整列顺序:重新排列列
  • 冻结列:保持表头/首列可见
  • 展开行:显示更多详情
  • 行内编辑:直接编辑单元格
  • 导出:下载为 CSV/Excel

最佳实践:

  • 文本左对齐,数字右对齐
  • 使用一致的格式
  • 悬停时高亮显示
  • 显示加载状态
  • 处理空状态
  • 提供清晰的排序指示
  • 谨慎使用斑马纹
  • 尽可能避免横向滚动

响应式策略:

  • 横向滚动:实现简单,但不太理想
  • 卡片视图:将行转换为卡片
  • 优先列:隐藏不太重要的列
  • 展开行:展开前隐藏详情
  • 对比视图:并排显示 2-3 个项目

无障碍:

  • 使用语义化的 <table>、<thead>、<tbody>、<th>、<td>
  • 为表头添加 scope 属性
  • 为表格提供标题
  • 使用 aria-sort 标记可排序的列
  • 确保交互元素支持键盘导航
2. 卡片模式

用于展示相关信息并形成视觉层次的容器。

使用场景:

  • 商品列表
  • 用户资料
  • 仪表盘小组件
  • 内容预览
  • 混合内容类型

组成部分:

  • 图片/视觉元素:主图或图标
  • 标题栏:标题和元数据
  • 正文:描述或详情
  • 操作:按钮或链接
  • 页脚:补充信息

变体:

  • 商品卡片:图片、标题、价格、加入购物车
  • 用户卡片:头像、姓名、简介、关注按钮
  • 文章卡片:缩略图、标题、摘要、阅读时长
  • 统计卡片:数字、标签、趋势指示器

最佳实践:

  • 网格中的卡片尺寸保持一致
  • 建立清晰的视觉层次
  • 提供充足的内边距和间距
  • 添加悬停状态以提升交互性
  • 将操作限制为 1-2 个主要操作
  • 使用柔和的阴影营造层次感
  • 确保触控目标足够大(最小 44x44px)

网格布局:

  • 响应式列数(移动端 1 列,桌面端 2-4 列)
  • 卡片等高或采用瀑布流布局
  • 卡片间距保持一致

无障碍性:

  • 使用语义化 HTML
  • 为图片提供替代文本
  • 确保对比度充足
  • 适当时让整张卡片都可点击
  • 使用标题标签作为标题
3. 列表模式

按顺序展示相似项目。

类型:

  • 简单列表:纯文本项目
  • 详细列表:每个项目包含多行内容
  • 交互式列表:可点击/可选择的项目
  • 分组列表:按类别组织
  • 收件箱列表:包含预览、时间和状态的消息

最佳实践:

  • 在项目之间设置清晰的视觉分隔
  • 保持项目高度一致或采用自然流式布局
  • 显示项目数量
  • 突出显示已选项目
  • 提供快捷操作
  • 适当时支持多选
  • 为长列表实现虚拟滚动

无障碍性:

  • 使用语义化列表元素(<ul>、<ol>、<li>)
  • 为项目提供唯一 ID
  • 播报选择状态的变化
  • 支持键盘导航
4. 网格模式

将项目排列成行和列。

使用场景:

  • 图片库
  • 商品目录
  • 应用启动器
  • 图标集
  • 媒体库

网格类型:

  • 固定网格:项目尺寸一致
  • 瀑布流:高度不一,类似 Pinterest
  • 响应式网格:随屏幕尺寸调整

最佳实践:

  • 使用 CSS Grid 或 Flexbox
  • 保持宽高比
  • 为图片实现延迟加载
  • 提供网格/列表视图切换
  • 保持间距一致
  • 处理空状态

响应式行为:

Mobile: 1-2 columns
Tablet: 2-4 columns
Desktop: 4-6 columns
5. 仪表盘模式

概览关键指标和数据可视化。

组件:

  • KPI 卡片:包含趋势的关键指标
  • 图表:折线图、柱状图、饼图、面积图
  • 表格:详细数据
  • 动态消息流:近期事件
  • 快捷操作:常见任务

布局策略:

  • 固定布局:预先确定位置
  • 可拖动小组件:用户可自定义
  • 响应式网格:随屏幕尺寸调整

最佳实践:

  • 优先展示最重要的指标
  • 统一时间范围
  • 提供上下文信息(比较、趋势)
  • 支持下钻查看详情
  • 实时更新数据,或显示上次更新时间
  • 支持自定义
  • 支持导出/分享

反馈模式

1. Toast/提示条模式

简短的临时消息,用于说明系统状态或操作结果。

适用场景:

  • 确认操作已完成(已保存、已删除、已发送)
  • 显示简短通知
  • 提示非关键错误
  • 提供撤销操作的机会

最佳实践:

  • 显示 3-7 秒
  • 统一显示位置(底部居中或右上角)
  • 一次显示一条 Toast,或将多条排队显示
  • 提供关闭操作
  • 避免遮挡重要内容
  • 保持消息简洁
  • 使用恰当的颜色(成功:绿色,错误:红色,信息:蓝色)
  • 为破坏性操作提供撤销选项

不适用场景:

  • 需要用户采取行动的关键错误
  • 用户必须阅读的信息
  • 多条同时出现的消息
  • 长消息

无障碍:

  • 使用 role="status" 或 role="alert"
  • 向屏幕阅读器播报
  • 不要过快自动关闭
  • 提供手动关闭选项

示例结构:

<div class="toast" role="status" aria-live="polite">
  <span>Settings saved successfully</span>
  <button aria-label="Close notification">×</button>
</div>
2. 模态框/对话框模式

通过叠加层将用户注意力集中到特定任务或信息上。

类型:

  • 警告对话框:需要用户确认的重要消息
  • 确认对话框:用于是/否决策
  • 表单对话框:收集输入
  • 灯箱:图片/媒体查看器

适用场景:

  • 重要决策
  • 聚焦于单项任务
  • 收集必要信息
  • 中断破坏性操作
  • 显示全尺寸媒体

最佳实践:

  • 淡化背景内容(叠加层)
  • 禁止与背景交互
  • 提供明确的关闭方式(X 按钮、取消、Esc 键)
  • 打开时将焦点置于第一个输入框或关闭按钮
  • 关闭时将焦点返回到触发元素
  • 保持内容简洁
  • 在视口中央显示
  • 打开时禁止正文滚动
  • 避免模态框嵌套(在模态框中再打开模态框)

无障碍:

  • 使用 role="dialog" 或 role="alertdialog"
  • 设置 aria-modal="true"
  • 使用 aria-labelledby 和 aria-describedby
  • 实现焦点陷阱
  • 支持按 Esc 关闭
  • 向屏幕阅读器播报

结构:

<div class="modal-overlay">
  <div role="dialog" aria-modal="true" aria-labelledby="modal-title">
    <h2 id="modal-title">Confirm Deletion</h2>
    <p>Are you sure you want to delete this item?</p>
    <div class="modal-actions">
      <button>Cancel</button>
      <button class="danger">Delete</button>
    </div>
  </div>
</div>
3. 加载状态模式

指示正在进行的处理或数据获取。

类型:

  • 旋转加载指示器:圆形或线性进度指示器
  • 进度条:显示完成百分比
  • 骨架屏:内容占位符
  • 闪烁效果:动画占位符
  • 内嵌加载指示器:位于按钮或区块内

适用场景:

  • 页面加载
  • API 请求
  • 文件上传
  • 后台处理
  • 无限滚动加载

最佳实践:

  • 立即显示(100ms 内)
  • 尽可能指示进度
  • 长时间操作提供预计耗时
  • 适当时允许取消
  • 使用骨架屏提升感知性能
  • 避免不必要地阻塞整个 UI
  • 随加载逐步显示部分内容

骨架屏: 相比空白屏幕或旋转加载指示器,能提供更好的用户体验:

  • 匹配实际内容的布局
  • 使用细微动画
  • 逐步加载内容
  • 保持滚动位置

无障碍:

  • 加载期间使用 aria-busy="true"
  • 播报加载完成
  • 为视觉加载指示器提供文本替代
  • 确保键盘用户可以取消
4. 空状态模式

在没有内容时进行说明,并引导用户采取下一步操作。

类型:

  • 首次使用:引导新用户
  • 无结果:搜索/筛选未返回任何内容
  • 错误状态:发生问题
  • 已完成状态:所有任务均已完成

组成部分:

  • 插图:视觉元素
  • 标题:清晰的消息
  • 描述:说明和引导
  • 行动号召:主要的下一步操作

最佳实践:

  • 鼓励并提供帮助
  • 提供明确的下一步操作
  • 根据上下文采用恰当的语气
  • 添加相关插图
  • 突出行动号召
  • 提供替代方案或建议

示例:

首次使用:

"Welcome to your inbox!"
"You don't have any messages yet.
Why not invite your team?"
[Invite Team Button]

无结果:

"No results found for 'query'"
"Try different keywords or clear filters"
[Clear Filters Button]

错误:

"Oops, something went wrong"
"We couldn't load your data. Please try again."
[Retry Button]

无障碍:

  • 提供有意义的文本
  • 确保图片具有替代文本
  • 确保行动号召可通过键盘操作
5. 通知徽标模式

指示未读内容或待处理的操作。

类型:

  • 数字徽标:显示数量(5、12、99+)
  • 圆点徽标:指示有内容,但不显示数量
  • 状态徽标:在线、离线、忙碌状态

适用场景:

  • 未读消息
  • 待处理通知
  • 购物车商品数量
  • 用户状态指示器

最佳实践:

  • 位置保持一致(图标右上角)
  • 使用对比鲜明的颜色
  • 限制显示的数字(数量较大时显示 99+)
  • 查看后清除
  • 避免过度使用
  • 设置合适的尺寸

无障碍性:

  • 将徽标内容包含在无障碍名称中
  • 向屏幕阅读器播报更新
  • 示例:aria-label="Messages (3 unread)"

交互模式

1. 拖放模式

通过拖动来移动或重新排列项目。

使用场景:

  • 文件上传
  • 列表重新排序
  • 看板
  • 图片库
  • 表单构建器

交互状态:

  • 可拖动:显示视觉指示器(手柄图标)
  • 拖动中:项目跟随光标,显示原始位置
  • 放置区域:突出显示有效目标
  • 无效:显示无法放置的状态
  • 已放置:以动画过渡到最终位置

最佳实践:

  • 提供清晰的拖动手柄
  • 清晰显示放置区域
  • 平滑地为过渡添加动画
  • 支持键盘替代操作
  • 确认具有破坏性的放置操作
  • 在靠近边缘处拖动时自动滚动
  • 显示最终状态的预览

键盘替代操作:

  • 选择项目
  • 剪切/复制
  • 导航到目标位置
  • 粘贴/插入

无障碍性:

  • 实现键盘控制
  • 播报拖放操作
  • 提供替代交互方式
  • 使用合适的 ARIA 属性
2. 无限滚动模式

用户向下滚动时自动加载内容。

适用场景:

  • 社交媒体信息流
  • 图片库
  • 新闻信息流
  • 商品目录

最佳实践:

  • 显示加载指示器
  • 提供“加载更多”按钮作为备用方式
  • 返回导航时保留滚动位置
  • 仅在所有内容加载完成后显示页脚
  • 允许跳转到特定项目
  • 尽可能显示总数
  • 提供停止自动加载的方式

无障碍性注意事项:

  • 向屏幕阅读器播报新内容
  • 确保键盘用户能够访问所有内容
  • 提供跳转链接
  • 考虑提供分页作为替代方案

性能:

  • 对大型列表实现虚拟滚动
  • 延迟加载图片
  • 移除屏幕外的内容
  • 对滚动事件进行防抖处理
3. 筛选和排序模式

筛选并整理显示的数据。

筛选类型:

  • 复选框:多选类别
  • 单选按钮:单选
  • 范围滑块:数值范围
  • 日期选择器:日期范围
  • 搜索:文本匹配

排序选项:

  • 按字母顺序(A-Z、Z-A)
  • 按数值(从低到高、从高到低)
  • 按日期(最新、最早)
  • 相关性
  • 热门程度

最佳实践:

  • 清晰显示已启用的筛选条件
  • 显示结果数量
  • 允许清除单个筛选条件
  • 提供“全部清除”选项
  • 立即更新结果,或提供“应用”按钮
  • 在 URL 中保留筛选状态
  • 默认采用最实用的排序方式
  • 清晰显示排序方向

移动端注意事项:

  • 使用底部弹出层或侧边栏显示筛选条件
  • 提供带数量徽标的筛选按钮
  • 允许在关闭面板前应用筛选条件
4. 搜索模式

帮助用户查找特定内容或项目。

组件:

  • 搜索输入框:用于输入查询的文本框
  • 搜索按钮:提交搜索
  • 清除按钮:重置搜索
  • 自动完成:输入时显示建议
  • 最近搜索:之前搜索过的词条
  • 筛选条件:缩小结果范围
  • 结果:匹配的项目

最佳实践:

  • 让搜索功能醒目且易于查找
  • 显示搜索图标
  • 提供键盘快捷键(/、Ctrl+K)
  • 搜索范围受限时予以说明
  • 在结果中突出显示匹配的词语
  • 无结果时显示提示和建议
  • 在 URL 中保留搜索内容
  • 实现防抖(300ms)

搜索体验:

  • 即时搜索或搜索按钮提交
  • 自动完成建议
  • 对拼写错误进行模糊匹配
  • 在结果中继续搜索
  • 按相关性排序
5. 撤销/重做模式

反转或重放操作。

适用场景:

  • 内容编辑器
  • 绘图应用
  • 电子邮件客户端
  • 任何破坏性操作

实现方式:

  • 立即撤销:显示带撤销按钮的 Toast
  • 命令模式:使用可逆操作栈
  • 键盘快捷键:Ctrl+Z、Ctrl+Y/Ctrl+Shift+Z
  • 菜单选项:编辑菜单项

最佳实践:

  • 为所有重要操作提供撤销功能
  • 立即显示撤销选项(Toast)
  • 设置合理的时间限制(5-10 秒)
  • 清楚说明将撤销什么
  • 支持多级撤销
  • 没有可撤销操作时禁用撤销
  • 妥善保存撤销历史记录

无障碍模式

WCAG 原则

可感知:信息必须以用户能够感知的方式呈现。

  • 为非文本内容提供文本替代
  • 为多媒体提供字幕和替代内容
  • 创建能够以不同方式呈现的内容
  • 让内容更易于查看和收听

可操作:所有用户都必须能够操作界面组件。

  • 确保所有功能均可通过键盘访问
  • 为用户留出足够的时间阅读和使用内容
  • 不要设计可能引发癫痫的内容
  • 帮助用户浏览并查找内容

可理解:信息和 UI 操作必须易于理解。

  • 确保文本易读且易于理解
  • 确保内容以可预测的方式呈现和运行
  • 帮助用户避免并纠正错误

健壮:内容必须足够健壮,能够被各种用户代理解读。

  • 最大限度地兼容当前和未来的工具
键盘导航

基本模式:

  • Tab:在交互元素间向前移动
  • Shift+Tab:向后移动
  • Enter/Space:激活按钮和链接
  • 方向键:在组件内导航(菜单、标签页)
  • Esc:关闭对话框、取消操作
  • Home/End:跳转到首项/末项

焦点管理:

  • 显示可见的焦点指示器(轮廓、高亮)
  • 使用符合逻辑的 Tab 顺序(遵循视觉顺序)
  • 在模态框中锁定焦点
  • 关闭对话框后恢复焦点
  • 为主要内容提供跳过链接

最佳实践:

  • 不要依赖仅限悬停的交互
  • 确保所有交互元素均可通过键盘访问
  • 为常见操作提供键盘快捷键
  • 记录键盘快捷键
  • 仅使用键盘进行测试
ARIA(无障碍富互联网应用)

角色: 定义元素是什么或有什么作用:

  • role="button"、role="tab"、role="dialog"
  • role="navigation"、role="main"、role="search"
  • role="alert"、role="status"、role="log"

状态和属性:

  • aria-expanded:可展开元素(true/false)
  • aria-selected:选中项(true/false)
  • aria-checked:复选框(true/false/mixed)
  • aria-disabled:禁用状态(true/false)
  • aria-hidden:从屏幕阅读器中隐藏(true/false)
  • aria-label:无障碍名称
  • aria-labelledby:对标签元素的引用
  • aria-describedby:对描述的引用
  • aria-live:播报动态变化(polite/assertive)
  • aria-current:集合中的当前项(page/step/location)

最佳实践:

  • 优先使用语义化 HTML
  • 语义化 HTML 不足时再添加 ARIA
  • 不要覆盖原生语义
  • 确保 ARIA 属性与 UI 状态同步更新
  • 使用屏幕阅读器进行测试
屏幕阅读器支持

注意事项:

  • 使用符合逻辑的标题层级(h1、h2、h3...)
  • 使用描述性链接文本(避免使用“点击此处”)
  • 为图像提供替代文本
  • 为表单输入项提供标签
  • 将错误消息与输入项关联
  • 播报动态内容变化
  • 为视觉信息提供文本替代

常见屏幕阅读器:

  • NVDA(Windows,免费)
  • JAWS(Windows,商业软件)
  • VoiceOver(macOS、iOS)
  • TalkBack(Android)
颜色和对比度

要求:

  • 文本对比度:普通文本为 4.5:1,大号文本为 3:1(WCAG AA)
  • 增强对比度:普通文本为 7:1,大号文本为 4.5:1(WCAG AAA)
  • UI 组件:界面元素和图形为 3:1

最佳实践:

  • 不要仅依靠颜色传达信息
  • 除颜色外,还要使用图案、图标或文本
  • 使用色盲模拟器进行测试
  • 提供高对比度模式
  • 确保焦点指示器具有足够的对比度
表单无障碍访问

标签:

  • 使用 for/id 将 <label> 与输入框关联
  • 不要仅将 placeholder 用作标签
  • 使用 <fieldset> 和 <legend> 对相关输入框进行分组

验证:

  • 使用 aria-describedby 将错误与字段关联
  • 使用 aria-invalid="true" 标记无效字段
  • 使用 role="alert" 向屏幕阅读器播报错误
  • 验证状态不要仅依靠颜色来区分

说明:

  • 在表单前提供清晰的说明
  • 标明必填字段
  • 说明格式要求
  • 提供输入示例

响应式模式

移动优先方法

先为移动屏幕进行设计,然后针对更大的屏幕进行增强。

优点:

  • 强制聚焦于核心内容
  • 渐进式增强
  • 在移动设备上性能更好
  • 比桌面优先更简单

断点:

/* Mobile: 320px - 767px (default) */

/* Tablet: 768px+ */
@media (min-width: 768px) { }

/* Desktop: 1024px+ */
@media (min-width: 1024px) { }

/* Large Desktop: 1440px+ */
@media (min-width: 1440px) { }
自适应布局

流式网格:

  • 使用百分比或弹性单位(fr、%)
  • CSS Grid 和 Flexbox
  • 使用容器查询实现组件级响应式布局

弹性图像:

img {
  max-width: 100%;
  height: auto;
}

响应式排版:

  • 相对单位(rem、em)
  • 使用 clamp() 实现流式排版
  • 调整行长以提高可读性(45-75 个字符)
移动导航模式

汉堡菜单:

  • 点击图标可切换滑出式菜单
  • 最常见,但可能会隐藏导航
  • 添加标签以便清楚说明

标签栏:

  • 固定在底部的导航(iOS 模式)
  • 3-5 个主要部分
  • 始终可见

Priority+:

  • 显示可容纳的项目,将溢出项目隐藏在菜单中
  • 根据可用空间进行调整
  • 适用于主导航

底部抽屉:

  • 从底部向上滑出
  • 适用于筛选器和操作
  • 拇指容易触及
触控交互

触控目标:

  • 点击目标至少为 44x44px
  • 目标之间留有足够间距
  • 主要操作使用更大的目标

手势:

  • 轻触:主要操作
  • 双击:缩放(谨慎使用)
  • 长按:显示上下文菜单
  • 滑动:删除、归档、导航
  • 捏合:缩放
  • 下拉刷新:更新内容

最佳实践:

  • 为触控操作提供视觉反馈
  • 避免依赖悬停的交互
  • 支持纵向和横向模式
  • 考虑拇指活动范围(易于触及、需要伸展、难以触及)
  • 在实际设备上进行测试
响应式表格

策略:

  1. 水平滚动:最简单,但不够理想
  2. 优先列:隐藏不太重要的列
  3. 堆叠卡片:将每一行变为一张卡片
  4. 翻转表头:将表头旋转为行标签
  5. 对比视图:并排显示 2-3 个项目

示例 - 堆叠卡片:

Desktop:
| Name | Email | Role | Status |

Mobile:
┌─────────────┐
│ John Doe    │
│ Email: j@   │
│ Role: Admin │
│ Status: ✓   │
└─────────────┘

常见 UI 模式检查清单

按钮模式
  • 主要操作按钮(实心、高对比度)
  • 次要操作按钮(描边或幽灵样式)
  • 用于低优先级操作的三级/文本按钮
  • 用于常见操作的图标按钮
  • 用于相关操作的按钮组
  • 用于开/关状态的切换按钮
  • 用于移动设备主要操作的悬浮操作按钮(FAB)
  • 按钮中的加载状态
  • 降低不透明度以显示禁用状态
输入模式
  • 带标签和占位符的文本输入框
  • 带显示/隐藏切换的密码输入框
  • 带图标和清除按钮的搜索输入框
  • 用于多行输入的文本区域
  • 用于从选项中进行选择的下拉框
  • 用于从少量选项中单选的单选按钮
  • 用于多选的复选框
  • 用于开/关设置的切换开关
  • 用于选择日期的日期选择器
  • 支持拖放的文件上传
  • 用于数值输入的范围滑块
  • 用于选择颜色的颜色选择器
导航模式
  • 顶部导航栏
  • 侧边栏导航
  • 面包屑导航
  • 分页
  • 标签页
  • 多步骤流程的步骤指示器
  • 用于页面内导航的锚点链接
  • 返回顶部按钮
覆盖层模式
  • 模态对话框
  • 滑出面板/抽屉
  • 用于提供上下文信息的弹出框
  • 用于显示提示的工具提示
  • 下拉菜单
  • 上下文菜单(右键)
  • 底部弹出面板(移动端)
反馈模式
  • Toast 通知
  • 警告横幅
  • 行内消息
  • 加载动画
  • 进度条
  • 骨架屏
  • 成功/错误状态
  • 空状态
内容模式
  • 卡片布局
  • 列表视图
  • 网格布局
  • 表格显示
  • 时间线/动态信息流
  • 主视觉区域
  • 图片库
  • 轮播图/滑块
  • 视频播放器
  • 头像/个人资料图片

设计令牌

用于保持一致性的标准化设计变量。

颜色令牌
Primary Colors:
- primary-50 to primary-900 (shades)

Semantic Colors:
- success (green)
- warning (yellow)
- error (red)
- info (blue)

Neutral Colors:
- gray-50 to gray-900

Text Colors:
- text-primary
- text-secondary
- text-disabled
间距令牌
- spacing-xs: 4px
- spacing-sm: 8px
- spacing-md: 16px
- spacing-lg: 24px
- spacing-xl: 32px
- spacing-2xl: 48px
字体排印令牌
Font Sizes:
- text-xs: 12px
- text-sm: 14px
- text-base: 16px
- text-lg: 18px
- text-xl: 20px
- text-2xl: 24px

Font Weights:
- normal: 400
- medium: 500
- semibold: 600
- bold: 700

Line Heights:
- tight: 1.25
- normal: 1.5
- relaxed: 1.75
边框圆角令牌
- rounded-none: 0
- rounded-sm: 2px
- rounded: 4px
- rounded-md: 6px
- rounded-lg: 8px
- rounded-xl: 12px
- rounded-full: 9999px
阴影令牌
- shadow-sm: subtle elevation
- shadow: default elevation
- shadow-md: medium elevation
- shadow-lg: large elevation
- shadow-xl: maximum elevation

性能注意事项

感知性能
  • 立即显示内容(骨架屏)
  • 渐进式加载
  • 乐观 UI 更新
  • 流畅动画(60fps)
实际性能
  • 代码拆分
  • 延迟加载图片和组件
  • 对长列表使用虚拟滚动
  • 防抖和节流
  • 缓存策略
  • 尽量减少重排和重绘
图片优化
  • 使用适当的格式(WebP、AVIF)
  • 响应式图片(srcset)
  • 延迟加载
  • 模糊渐显占位技术
  • 合适的尺寸和压缩

UI 模式测试

可用性测试
  • 用户访谈
  • 任务完成度测试
  • A/B 测试
  • 热力图和点击追踪
  • 会话录制
无障碍测试
  • 键盘导航测试
  • 屏幕阅读器测试
  • 检查颜色对比度
  • 自动化无障碍审查(axe、Lighthouse)
  • 手动审查 WCAG 合规性
跨浏览器测试
  • 在主流浏览器中测试(Chrome、Firefox、Safari、Edge)
  • 在实际设备上测试
  • 使用浏览器开发者工具进行响应式测试
  • 检查渐进增强
性能测试
  • Lighthouse 审查
  • Core Web Vitals
  • 加载时间测试
  • 交互延迟
  • 动画帧率

资源与工具

设计系统
  • Material Design(Google)
  • Human Interface Guidelines(Apple)
  • Fluent Design(Microsoft)
  • Polaris(Shopify)
  • Carbon(IBM)
  • Ant Design
  • Atlassian Design System
组件库
  • Shadcn UI
  • Radix UI
  • Headless UI
  • Chakra UI
  • MUI(Material-UI)
  • Ant Design
  • Bootstrap
  • Tailwind UI
无障碍工具
  • axe DevTools
  • WAVE
  • Lighthouse
  • NVDA(屏幕阅读器)
  • VoiceOver(屏幕阅读器)
  • 颜色对比度检查工具
原型设计工具
  • Figma
  • Sketch
  • Adobe XD
  • Framer
  • InVision
模式库
  • UI Patterns
  • Patternry
  • Mobile Patterns
  • Pttrns

结论

UI 设计模式为常见的界面难题提供了经过验证的解决方案。了解并恰当运用这些模式,可以打造:

  • 一致的界面:熟悉的模式可降低学习成本
  • 无障碍体验:内置无障碍考量
  • 高效开发:可复用的组件和标准化方法
  • 更好的 UX:经过测试、用户易于理解的模式

请记住:

  • 选择适合具体场景的模式
  • 根据品牌和用户需求定制模式
  • 与真实用户进行测试
  • 优先考虑无障碍
  • 跟进不断演变的最佳实践
  • 关注用户需求,而非潮流

UI 模式是指导原则,而非严格规则。请审慎调整,打造能有效满足用户需求的界面。

评论

支持 Markdown