跳转到内容

Breadcrumb 面包屑 ​

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

用法 ​

显示当前页面的层级路径

组件结构 ​

加粗的是必需部件。

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

示例 ​

折叠层级 ​

收起过长路径的中间部分

自定义分隔符 ​

替换层级之间的视觉标记

尺寸 ​

适配不同的信息密度

设计指引 ​

何时使用 ​

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

何时不用 ​

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

特性 ​

  • collection 可直接生成完整路径,也支持手写部件。
  • maxItems 将过长路径的中间层折叠为省略号。
  • 默认分隔符为箭头,可通过插槽或渲染函数替换。
  • 当前页使用 aria-current="page",不参与键盘导航。

组合 ​

  • 通常放在页头或正文标题之前。

最佳实践 ​

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

反模式 ​

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

API 参考 ​

产物 ​

层值
自定义元素<xh-breadcrumb>
Vue 组件XhBreadcrumbEllipsis 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

判据:canPress

connect API ​

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

成员类型说明
collectionreadonly BreadcrumbNodeMeta[]由 collection 推导的层级元信息,按数据顺序排列;未提供 collection 时为空数组。
itemsreadonly BreadcrumbItem[]按 maxItems 折叠后的序列,省略位自带被折叠的层级;未提供 collection 时为空数组。
getRootProps() => T['element']
getListProps() => T['element']
getItemProps() => T['element']
getLinkProps(props: BreadcrumbLinkProps) => T['element']
getLinkIconProps() => T['element']
getSeparatorProps() => T['element']
getEllipsisProps() => T['element']

无障碍 ​

键盘 ​

规格出处:W3C APG

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

ARIA ​

以下属性由 connect 生成。

部件属性值
rootaria-labelprops.translations.root
linkaria-current'page' | undefined
linkaria-disabled'true' | 'false'
link-iconaria-hidden'true'
separatoraria-hidden'true'
ellipsisaria-hidden'true'

样式参考 ​

皮肤 ​

@xihan-ui/styles/breadcrumb.css 使用 [data-scope="breadcrumb"][data-part="root"] 部件选择器,位于 xihan.components 层。覆盖样式使用 xihan.overrides。

数据属性 ​

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

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

CSS 变量 ​

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

变量部件CSS 属性状态默认来源说明
--xh-breadcrumb-ellipsis-sizeellipsisinline-sizedefault--xh-space-5breadcrumb 的 ellipsis 部件 inline-size 覆盖槽。
--xh-breadcrumb-fglink
root
colordefault
xh-collection-context=nav
--xh-fg-mutedbreadcrumb 的 link、root 部件 color 覆盖槽。
--xh-breadcrumb-font-sizelink
root
font-sizedefault--xh-_breadcrumb-font-sizebreadcrumb 的 link、root 部件 font-size 覆盖槽。
--xh-breadcrumb-gaplistgapdefault--xh-_breadcrumb-gapbreadcrumb 的 list 部件 gap 覆盖槽。
--xh-breadcrumb-icon-sizelink
root
--xh-icon-sizedefault--xh-glyph-size-textbreadcrumb 的 link、root 部件 --xh-icon-size 覆盖槽。
--xh-breadcrumb-leadinglink
root
line-heightdefault--xh-leading-tightbreadcrumb 的 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-_breadcrumb-accent-textbreadcrumb 的 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-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-subtlebreadcrumb 的 ellipsis、separator 部件 color 覆盖槽。
--xh-breadcrumb-separator-sizeseparatorinline-sizedefault--xh-glyph-size-textbreadcrumb 的 separator 部件 inline-size 覆盖槽。

动效 ​

动效角色:按压 · 状态(见动效规范)。

本组件皮肤不含过渡与关键帧,也没有脚本驱动的动效:状态一变,外观立即到位。

RTL ​

另有按 dir 分支的规则。

Released under The MIT License