UI Design System
build dev

Anchor

在长页面章节间定位。中文惯用名:锚点。
稳定本期新增已接入

元信息

字段值
规范 IDcomponent.anchor
名称Anchor
二级分类导航(navigation)
用途在长页面章节间定位
描述中文惯用名:锚点。

预览

静态结构:<nav data-slot="anchor">(border-l 轨道 + 链接列);链接 <a data-slot="anchor-link">(-ml-px border-l-2,激活项 border-primary text-primary font-medium,未激活 text-muted-foreground),子链接缩进 pl-4。交互:点击阻止默认跳转、按 offsetTop 补偿平滑滚动;监听 window 滚动做 scroll-spy(取最后一个顶部越过 offsetTop 的章节)。状态控制:非受控(未传 activeKey)内部维护激活态;受控时激活态完全由 activeKey 驱动,点击 / 滚动定位仅经 onChange 上报 href(去重:与当前激活项相同或挂载对齐计算不重复触发)。本预览无对应锚点目标,仅演示结构与激活态。

DSL 结构

DslNode
{
  "type": "Anchor",
  "props": {
    "items": [
      {
        "href": "#sec-basic",
        "title": "基础信息"
      },
      {
        "href": "#sec-log",
        "title": "操作日志"
      }
    ],
    "offsetTop": 72
  }
}

何时用

何时使用

  • 长页面章节间定位:文档、详情页、设置页的右侧章节目录。
  • 需要 scroll-spy 同步阅读位置:滚动时自动高亮当前章节。
  • 两级以内的章节树:items 支持 children 嵌套。

何时不用

  • 跨页面导航:使用 Menu / NavigationMenu。
  • 页面内返回顶部:使用 BackTop。
  • 短页面(一屏内)不需要 Anchor。

变体

变体视觉形态适用场景
单层平铺章节链接章节无层级的文档
嵌套子链接缩进两级章节树(章 / 节)

API 属性

属性类型默认值说明
itemsAnchorItemData[][]锚点链接:{ href: "#id", title, children? }
activeKeystring—受控:当前激活链接 href;提供时激活态完全由外部驱动
onChangeevent—激活项变化(点击或滚动定位),传出 href(events.onChange 绑定动作,${event} 取 href)
offsetTopnumber0滚动定位的顶部偏移(如有固定头部)
className / stylestring / CSSProperties—通用:根节点 class 合并 / 内联样式

使用规范

  • href 与页面章节 id 一一对应,缺失目标时点击为空操作(onChange 仍上报)。
  • 有固定头部时务必设 offsetTop,避免目标被遮挡。
  • 章节数控制在 10 个以内,层级不超过两级。
  • 常配合 Affix 固定在页面右侧栏。
  • 需要与外部状态联动(如路由 / Tab 同步)时用 activeKey + onChange 受控;纯阅读定位用非受控即可。

正例

  • ✓ 文档详情页:右侧 Affix 固定 Anchor,scroll-spy 跟随阅读进度高亮。
  • ✓ 长设置页:基础设置 / 安全设置 / 通知设置三章快速定位。

反例

  • ✕ 用 Anchor 做站点主导航(应使用 Menu)。
  • ✕ 锚点目标 id 动态变化却不更新 items(点击落空)。

Design Token 映射

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