UI Design System
build dev

Tour

分步骤引导用户认识界面。中文惯用名:漫游引导。
稳定本期新增已接入

元信息

字段值
规范 IDcomponent.tour
名称Tour
二级分类反馈(feedback)
用途分步骤引导用户认识界面
描述中文惯用名:漫游引导。

预览

静态结构:open=false 或 steps 为空时渲染 null;开启时经 createPortal 挂到 document.body——半透明遮罩(data-slot="tour-mask",fixed inset-0 z-[90])+ 当前步骤卡片(data-slot="tour-card",fixed z-[100]、宽 w-72):按当前步骤 target(CSS selector)找到元素后以其 getBoundingClientRect 定位在元素下方(bottom+8 / 左对齐);选择器无匹配时卡片居中兜底(top/left 50% + translate,不抛错)。卡片内含标题(tour-title)+ 关闭按钮(tour-close,X 图标)+ 正文(tour-content)+ 底部「序号 n / 总数」与按钮组:非首步有 outline「上一步」,主按钮末步为「完成」、其余为「下一步」。

DSL 结构

DslNode
{
  "type": "Tour",
  "props": {
    "open": true,
    "steps": [
      {
        "target": "#top-nav",
        "title": "全局导航",
        "content": "在这里切换资产库五大分类。"
      },
      {
        "target": "#sidebar",
        "title": "侧边导航",
        "content": "分类内的子菜单与条目数。"
      }
    ]
  }
}

何时用

何时使用

  • 分步骤引导用户认识界面:新用户首次进入、重要改版后的功能导览。
  • 步骤不多(3~5 步)、每步聚焦一个界面元素的引导任务。
  • 需要用户主动开始 / 可随时关闭的轻引导(右上角关闭按钮 + 遮罩)。

何时不用

  • 单个元素的补充说明:使用 Tooltip / Popover,Tour 是多步流程。
  • 强制完成的任务教学或带校验的新手任务:Tour 无阻断校验能力,需自行组合 Dialog 等。
  • 常驻帮助文档:使用帮助面板 / 文档页,Tour 是一次性引导。

变体

变体视觉形态适用场景
定位步骤卡片吸附在 target 元素下方指向具体功能入口的导览步骤
居中步骤(兜底)target 缺省或无匹配时卡片屏幕居中开场欢迎 / 收尾总结等无具体锚点的步骤
受控步骤current 由外部状态控制需要与页面状态联动(如跳步、按条件分支)的引导
非受控步骤(默认)内部从 0 开始自维护步骤常规线性导览;open 重新置 true 时步骤重置为 0

API 属性

属性类型默认值说明
openbooleanfalse是否开启引导;重新开启时非受控步骤重置为 0
stepsTourStep[][]步骤列表;每步 target(CSS selector,无匹配时卡片居中兜底)+ title + content
currentnumber—受控步骤序号(缺省内部从 0 开始);越界时钳制到有效范围
onChange(index: number) => void—步骤切换事件:下一步 / 上一步触发,参数为目标序号
onClose() => void—完成(末步「完成」按钮)与关闭(右上角 X)事件
classNamestring—通用:步骤卡片 class(与内置样式合并)
styleCSSProperties—通用:步骤卡片内联样式

使用规范

  • steps.target 是 CSS selector:给被引导元素加稳定 data-* / id 选择器,不要用易变的类名或层级选择器。
  • target 无匹配时卡片居中兜底、不抛错:但应监控兜底发生,及时修正失效选择器。
  • 步骤控制在 3~5 步,每步一个焦点元素、一句标题 + 一段短说明;长教学拆成多次或改用帮助文档。
  • open 受 state 控制:首次进入置 true,onClose(完成或关闭)时置 false 并记录「已引导」,避免每次进入重复弹出。
  • 遮罩覆盖全屏(z-[90])且卡片置顶(z-[100]):引导期间页面操作被遮罩拦截,不要在其中要求用户操作被遮住的元素。
  • 末步按钮固定为「完成」并触发 onClose:完成与中途关闭走同一事件,需区分时在 state 中记录当前步数。

正例

  • ✓ 新用户导览:首步居中欢迎卡(不设 target),随后逐一定位「新建项目」「邀请成员」入口,末步「完成」。
  • ✓ 改版功能导览:open 绑定「未看过该版本引导」标记,onClose 后落库标记。
  • ✓ 受控联动:current 绑定 state,onChange 更新,按用户角色跳过管理员专属步骤。

反例

  • ✕ target 使用 nth-child 等脆弱选择器,页面微调后引导错位(应使用稳定 data 属性)。
  • ✕ 超过 7~8 步的长引导一口气弹完(用户流失,应拆分或改帮助文档)。
  • ✕ 引导期间要求用户点击被遮罩覆盖的元素(操作被拦截,引导卡死)。

Design Token 映射

不适用:组件 tokenRefs 为空:样式 Token 数据尚未接入,三层映射(Primitive → Semantic → Component)待样式 Token 接入后回填。