生态产品多个设计器现已发布正式版

查看生态总览
跳转到内容

Breadcrumb 面包屑 ​

显示当前页面在信息层级中的位置。

用法 ​

显示当前页面的层级路径

组件结构 ​

加粗的是必需部件。

data-scope="breadcrumb":root · list · item · link · link-icon · separator · ellipsis · ellipsis-trigger

示例 ​

折叠层级 ​

收起过长路径的中间部分,按下省略位展开完整路径

自定义分隔符 ​

替换层级之间的视觉标记

尺寸 ​

适配不同的信息密度

设计指引 ​

何时使用 ​

  • 页面具有明确的父子层级。
  • 用户可能从搜索或外链直接进入深层页面。

何时不用 ​

  • 扁平页面不需要面包屑。
  • 流程进度使用步骤条。

特性 ​

  • collection 可直接生成完整路径,也支持手写部件。
  • 不写结构时照标准结构铺:有序列表里按折叠后的序列一项一个 li,层与层之间是分隔符,被折叠的一段是装着展开按钮的折叠位;链接带图标时图标在前。Vue / React 不写默认插槽与 Web Components 不写部件(或只写 root)时生成的节点出自同一个结构函数;Web Components 里分隔符与折叠位按钮的内容可用宿主直接子节点 slot="separator:<后一项的值>"(折叠位前的写 separator:ellipsis)与 slot="ellipsis" 给出。
  • maxItems 将过长路径的中间层折叠为一个省略位。省略位里的 ellipsis-trigger 是被折叠层级的入口:它是一枚按钮,键盘可达、读屏念出 translations.ellipsis(缺省 Show full path),按下即就地展开完整路径,省略位收起,焦点落到第一条展开出来的链接上;展开后不再折回。
  • Vue / React 由 collection 铺开时自动折叠与展开;Web Components 把完整路径逐层写成部件,在首层之后放一个装着触发器的省略位,元素按 max-items 收起中间层,展开后放出来。
  • 默认分隔符为一条斜线,可通过插槽或渲染函数替换。
  • 当前页使用 aria-current="page",不参与键盘导航。

组合 ​

  • 通常放在页头或正文标题之前。
  • ellipsis 是路径里的一个列表项,里面放 ellipsis-trigger;触发器不写内容时由皮肤画一枚省略号字形,写了内容即换成作者的,可及名始终取 translations.ellipsis。被收起的层级与展开后的省略位带 hidden,紧跟在它后面的分隔符由皮肤一并收起。

接路由 ​

  • Vue / React 的 link 缺省渲染 <a>,href 由作者写或取自 collection。接客户端路由时给 XhBreadcrumbLink 加 asChild,把路由链接放进去当唯一的子节点:部件属性与按压接线合到它渲出的元素上,跳转交给路由;子节点不是恰好一个元素时直接报错。
  • 当前页那条部件照样对点击 preventDefault、退出 Tab 序列;路由链接跳往当前路由本来也是空操作。
  • Web Components 不需要 asChild:link 本来就是作者写的节点,元素只往它身上写属性与监听、不替换它。路由库自己的链接元素,或自行拦截点击的 <a>,直接标 data-xh-part="link" 即可。
vue
<XhBreadcrumbItem>
  <XhBreadcrumbLink value="orders" as-child>
    <RouterLink to="/orders">订单</RouterLink>
  </XhBreadcrumbLink>
</XhBreadcrumbItem>
tsx
<XhBreadcrumbItem>
  <XhBreadcrumbLink value="orders" asChild>
    <Link to="/orders">订单</Link>
  </XhBreadcrumbLink>
</XhBreadcrumbItem>;

最佳实践 ​

  • 当前项使用清晰的页面标题,避免“详情”等泛化名称。
  • 同页有多个 nav 地标时给面包屑单独的 aria-label。

反模式 ​

  • 不要用面包屑表示浏览历史。
  • 当前项不要链接到自身。

API 参考 ​

产物 ​

层值
自定义元素<xh-breadcrumb>
Vue 组件XhBreadcrumbEllipsis XhBreadcrumbEllipsisTrigger XhBreadcrumbItem XhBreadcrumbLink XhBreadcrumbLinkIcon XhBreadcrumbList XhBreadcrumbRoot XhBreadcrumbSeparator
组合式函数useBreadcrumb
状态机breadcrumbMachine
皮肤@xihan-ui/styles/breadcrumb.css

Props ​

属性类型必填说明
collectionreadonly BreadcrumbNode[]层级数据,文字、链接与当前页的事实源。 未提供时回到层级逐个写成部件的方式。
maxItemsnumber最多展开的层数,超出的中间层折叠为一个省略位;未提供时全部列出。 省略位里的触发器按下即展开完整路径,焦点落到第一条展开出来的链接上。
dirDirection文字方向,只作用于排版;作者未提供时不写入。
translationsPartial<BreadcrumbTranslations>
toneTone语气:brand / neutral / success / warning / danger / info,决定使用哪族颜色。
sizeSize尺寸:sm / md / lg。

collection 的元素。

字段类型必填说明
valuestring是层级身份,写入 data-value。
labelstring显示文字;默认回退为 value。
hrefstring链接地址;未提供时渲染为不带 href 的 a。
iconstring图标文本,写入 link-icon 部件;需要放置图形时改用插槽。
currentboolean当前页所在层级。

React 适配器 props ​

只列各组件自己声明的那些:继承自 ComponentPropsWithRef 的 DOM 属性不在其中,根组件上与上面 Props 表同名的也不重复列。Vue 的对应物是上面的插槽表。

React 组件属性类型必填说明
XhBreadcrumbLinkvaluestring链接身份,按压通道按它记住正被按住的那一条;未声明时派生一个实例内稳定的键。
XhBreadcrumbLinkcurrentboolean当前页的条目。
XhBreadcrumbRootrenderSeparator() => ReactNode分隔符的内容;未提供时由皮肤绘制默认箭头。
XhBreadcrumbRootrenderEllipsis(nodes: readonly BreadcrumbNodeMeta[]) => ReactNode省略位的内容,可得到被折叠的层;未提供时为一个省略号。

状态 ​

以下名称仅用于内部状态机。

状态:idle

事件:PRESS.START · PRESS.END · EXPAND · LIST.TRACKED

判据:canPress

connect API ​

getXxxProps() 返回对应部件的宿主属性。

成员类型说明
collectionreadonly BreadcrumbNodeMeta[]由 collection 推导的层级元信息,按数据顺序排列;未提供 collection 时为空数组。
itemsreadonly BreadcrumbItem[]按 maxItems 折叠后的序列,省略位自带被折叠的层级;展开后即完整路径;未提供 collection 时为空数组。
expandedboolean省略位已被展开。
expand() => void展开折叠的路径;焦点不动。
collapsedRange(count: number) => BreadcrumbCollapsedRange | null一条 count 层的路径按 maxItems 折掉的那一段;不折或已展开时为 null。 层级由作者逐个写成部件时(Web Components)据它收起被折叠的层级。
getRootProps() => T['element']
getListProps() => T['element']
getItemProps() => T['element']
getLinkProps(props: BreadcrumbLinkProps) => T['element']
getLinkIconProps() => T['element']
getSeparatorProps() => T['element']
getEllipsisProps() => T['element']省略位:列表项,展开后 hidden。
getEllipsisTriggerProps() => T['button']省略位里的触发器:按下展开完整路径,焦点落到第一条展开出来的链接上。

无障碍 ​

键盘 ​

规格出处:W3C APG

按键生效条件行为
Enterfocus in link, 非当前页跟随链接(原生 <a href> 的激活行为,面包屑自己不监听按键)
Enter / Spaceheld in link, 非当前页按住期间该链接投影 data-pressed,与指针 :active 同一副按压面;抬起或失焦撤下。跟随链接照旧由这一次按键(原生 <a href>)承担,当前页那条不进
Enter / Spacefocus in ellipsis-trigger展开被折叠的层级(原生 <button> 的激活行为),省略位收起,焦点落到第一条展开出来的链接上
Tab / Shift+Tabfocus in root逐条走过可点的链接与省略位触发器;面包屑不做 roving tabindex,当前页那条带 tabindex=-1 自动脱序

ARIA ​

以下属性由 connect 生成。

部件属性值
rootaria-labeltranslations.root
linkaria-current'page' | undefined
linkaria-disabled'true' | 'false'
link-iconaria-hidden'true'
separatoraria-hidden'true'
ellipsis-triggeraria-labeltranslations.ellipsis

样式参考 ​

皮肤 ​

@xihan-ui/styles/breadcrumb.css 按 [data-scope="breadcrumb"][data-part="root"] 部件选择器书写,发布产物以挂载类 .xh-scope-breadcrumb 代替其中的 data-scope(特异性相同),位于 xihan.components 层。覆盖样式使用 xihan.overrides,部件选择器照常可用。

forced-colors: active 下另有一套规则:颜色交给系统,边框与状态标记改用系统色关键字。

数据属性 ​

由 connect 生成;条件不成立时不输出无值属性。

部件属性值
rootdata-sizeprops.size
rootdata-toneprops.tone
listdata-instant''(条件成立时才出现)
linkdata-current''(条件成立时才出现)
linkdata-pressed''(条件成立时才出现)
linkdata-xh-collection-context'nav'
linkdata-xh-collection-item''
linkdata-xh-collection-sizeprops.size
linkdata-xh-collection-terminal''(条件成立时才出现)
ellipsis-triggerdata-xh-collection-context'nav'
ellipsis-triggerdata-xh-collection-item''
ellipsis-triggerdata-xh-collection-sizeprops.size

CSS 变量 ​

本组件公开覆盖槽由独立皮肤的实际消费位生成;默认来源、作用部件和状态均与 CSS 同源。

变量部件CSS 属性状态默认来源说明
--xh-breadcrumb-ellipsis-sizeellipsismin-inline-sizedefault--xh-space-5breadcrumb 的 ellipsis 部件 min-inline-size 覆盖槽。
--xh-breadcrumb-ellipsis-trigger-hellipsis-triggermin-block-sizedefault--xh-breadcrumb-link-hbreadcrumb 的 ellipsis-trigger 部件 min-block-size 覆盖槽。
--xh-breadcrumb-fgellipsis-trigger
link
root
colordefault
xh-collection-context=nav
--xh-fg-mutedbreadcrumb 的 ellipsis-trigger、link、root 部件 color 覆盖槽。
--xh-breadcrumb-font-sizeellipsis-trigger
link
root
font-sizedefault--xh-_breadcrumb-font-sizebreadcrumb 的 ellipsis-trigger、link、root 部件 font-size 覆盖槽。
--xh-breadcrumb-gaplistgapdefault--xh-_breadcrumb-gapbreadcrumb 的 list 部件 gap 覆盖槽。
--xh-breadcrumb-icon-sizeellipsis-trigger
link
root
--xh-icon-sizedefault--xh-glyph-size-textbreadcrumb 的 ellipsis-trigger、link、root 部件 --xh-icon-size 覆盖槽。
--xh-breadcrumb-leadingellipsis-trigger
link
root
line-heightdefault--xh-leading-tightbreadcrumb 的 ellipsis-trigger、link、root 部件 line-height 覆盖槽。
--xh-breadcrumb-link-bg-hoverlinkbackground-colordisabled
error
hover
not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error])
xh-collection-context=nav
--xh-bg-subtlebreadcrumb 的 link 部件 background-color 覆盖槽。
--xh-breadcrumb-link-bg-pressedlinkbackground-colordisabled
error
is(:active, [data-pressed])
not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error])
pressed
xh-collection-context=nav
--xh-bg-subtle-hoverbreadcrumb 的 link 部件 background-color 覆盖槽。
--xh-breadcrumb-link-fg-currentlinkcolorcurrent
xh-collection-context=nav
xh-collection-terminal
--xh-_breadcrumb-accent-textbreadcrumb 的 link 部件 color 覆盖槽。
--xh-breadcrumb-link-fg-hoverlinkcolordisabled
error
hover
not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error])
xh-collection-context=nav
--xh-_tone-fgbreadcrumb 的 link 部件 color 覆盖槽。
--xh-breadcrumb-link-fg-pressedlinkcolordisabled
error
is(:active, [data-pressed])
not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error])
pressed
xh-collection-context=nav
--xh-_tone-fgbreadcrumb 的 link 部件 color 覆盖槽。
--xh-breadcrumb-link-font-weight-currentlinkfont-weightcurrent
xh-collection-context=nav
xh-collection-terminal
--xh-font-weight-mediumbreadcrumb 的 link 部件 font-weight 覆盖槽。
--xh-breadcrumb-link-gaplinkgapdefault--xh-space-1breadcrumb 的 link 部件 gap 覆盖槽。
--xh-breadcrumb-link-hellipsis-trigger
link
min-block-sizedefault--xh-control-action-sizebreadcrumb 的 ellipsis-trigger、link 部件 min-block-size 覆盖槽。
--xh-breadcrumb-link-icon-sizelink-iconblock-size
inline-size
default--xh-glyph-size-textbreadcrumb 的 link-icon 部件 block-size、inline-size 覆盖槽。
--xh-breadcrumb-link-max-wlinkmax-inline-sizedefault--xh-nav-link-max-wbreadcrumb 的 link 部件 max-inline-size 覆盖槽。
--xh-breadcrumb-link-pxlinkpadding-inlinedefault--xh-space-1breadcrumb 的 link 部件 padding-inline 覆盖槽。
--xh-breadcrumb-link-radiuslinkborder-radiusdefault--xh-shape-controlbreadcrumb 的 link 部件 border-radius 覆盖槽。
--xh-breadcrumb-separator-fgellipsis
separator
colordefault--xh-fg-disabledbreadcrumb 的 ellipsis、separator 部件 color 覆盖槽。
--xh-breadcrumb-separator-sizeseparatorinline-sizedefault--xh-glyph-size-textbreadcrumb 的 separator 部件 inline-size 覆盖槽。

动效 ​

动效角色:按压 · 状态 · 指示与换位 · 出现(见动效规范)。

共享关键帧 xh-fade-in · xh-fade-out 由 family/motion.css 提供,皮肤 @import 它,单独引入仍成立;translate 走 transition 过渡。时长与缓动读动效令牌,改令牌即改全局节奏。

系统开启减弱动效时由令牌层统一收敛,皮肤不另作判断。

Released under The MIT License