import { Breadcrumb, BreadcrumbItem, BreadcrumbSeparator } from '@hina-ui/react'
export default function Demo() {
return (
<Breadcrumb>
<BreadcrumbItem href="#">首页</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem href="#">Galgame</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem href="#">枕</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem current>サクラノ詩</BreadcrumbItem>
</Breadcrumb>
)
}
tsx
用法
import { Breadcrumb, BreadcrumbItem, BreadcrumbSeparator } from '@hina-ui/react'
ts
Breadcrumb 是导航地标,BreadcrumbItem 是层级中的一项,BreadcrumbSeparator 是项与项之间的分隔符。项与分隔符按顺序交替排列,最后一项用 current 标出当前页面。
current 项不是链接,它渲染为文字并带上 aria-current="page"。当前页面链接至自身并无意义,且会使屏幕阅读器读出一个指向原处的链接。
import { Breadcrumb, BreadcrumbItem, BreadcrumbSeparator } from '@hina-ui/react'
export default function Demo() {
return (
<Breadcrumb>
<BreadcrumbItem href="#">首页</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem href="#">轻小说</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem current>春与修罗</BreadcrumbItem>
</Breadcrumb>
)
}
tsx
面包屑记录的是层级位置,不是浏览历史。层级自站点根部逐级列至当前页,与读者由何处进入无关。
示例
分隔符
分隔符默认是向右的箭头。children 可以换成任意内容,斜线与间隔号都是常见选择。同一条面包屑里的分隔符应当保持一致。
默认
斜线
文字
import { Slash } from 'lucide-react'
import { Breadcrumb, BreadcrumbItem, BreadcrumbSeparator, Stack, Text } from '@hina-ui/react'
export default function Demo() {
return (
<Stack gap="md">
<Stack gap="xs">
<Text size="sm" tone="faint">
默认
</Text>
<Breadcrumb>
<BreadcrumbItem href="#">首页</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem href="#">漫画</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem current>第 12 话</BreadcrumbItem>
</Breadcrumb>
</Stack>
<Stack gap="xs">
<Text size="sm" tone="faint">
斜线
</Text>
<Breadcrumb>
<BreadcrumbItem href="#">首页</BreadcrumbItem>
<BreadcrumbSeparator>
<Slash className="size-3.5" />
</BreadcrumbSeparator>
<BreadcrumbItem href="#">漫画</BreadcrumbItem>
<BreadcrumbSeparator>
<Slash className="size-3.5" />
</BreadcrumbSeparator>
<BreadcrumbItem current>第 12 话</BreadcrumbItem>
</Breadcrumb>
</Stack>
<Stack gap="xs">
<Text size="sm" tone="faint">
文字
</Text>
<Breadcrumb>
<BreadcrumbItem href="#">首页</BreadcrumbItem>
<BreadcrumbSeparator>·</BreadcrumbSeparator>
<BreadcrumbItem href="#">漫画</BreadcrumbItem>
<BreadcrumbSeparator>·</BreadcrumbSeparator>
<BreadcrumbItem current>第 12 话</BreadcrumbItem>
</Breadcrumb>
</Stack>
</Stack>
)
}
tsx
路由链接
as 指定该项渲染为何种元素或组件,默认为 a。在 Next.js 中传入 next/link 的 Link 即可获得客户端跳转,其余属性(如 href)会透传到该元素上。
需要完全接管渲染时用 asChild,此时项的样式类会合并到子元素上。
'use client'
import NextLink from 'next/link'
import { Breadcrumb, BreadcrumbItem, BreadcrumbSeparator } from '@hina-ui/react'
export default function Demo() {
return (
<Breadcrumb>
<BreadcrumbItem as={NextLink} href="/components/button">
Button
</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem as={NextLink} href="/components/tag">
Tag
</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem current>Breadcrumb</BreadcrumbItem>
</Breadcrumb>
)
}
tsx
图标
项的内容可以是任意节点。首项常用图标代替「首页」二字,此时图标要标为 aria-hidden,并用 VisuallyHidden 补一个只给屏幕阅读器的名称——否则这一项对辅助技术就是一个没有名字的链接。
import { House } from 'lucide-react'
import { Breadcrumb, BreadcrumbItem, BreadcrumbSeparator, VisuallyHidden } from '@hina-ui/react'
export default function Demo() {
return (
<Breadcrumb>
<BreadcrumbItem href="#" className="inline-flex items-center">
<House className="size-4" aria-hidden="true" />
<VisuallyHidden>首页</VisuallyHidden>
</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem href="#">Galgame</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem current>ATRI -My Dear Moments-</BreadcrumbItem>
</Breadcrumb>
)
}
tsx
导航名称
Breadcrumb 渲染为 nav 地标,带有随界面语言给出的无障碍名。一个页面里出现多个导航地标时,用 label 分别命名,屏幕阅读器的地标列表才能区分它们。
import { Breadcrumb, BreadcrumbItem, BreadcrumbSeparator } from '@hina-ui/react'
export default function Demo() {
return (
<Breadcrumb label="作品位置">
<BreadcrumbItem href="#">首页</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem href="#">轻小说</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem current>第三卷</BreadcrumbItem>
</Breadcrumb>
)
}
tsx
无障碍
- 外层是
nav地标,内部是有序列表,屏幕阅读器会读出项数与序号。 - 分隔符带
aria-hidden,不会被读出,也不占列表序号之外的语义。 - 当前项带
aria-current="page"且不可点击。 - 默认地标名取自界面语言(简体中文为「面包屑」),
label可覆盖。 - 用图标代替文字时,必须另行提供可读的名称。
API
Breadcrumb
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
label | string | 取自界面语言 | 导航地标的无障碍名 |
className | string | — | 追加到根元素的类 |
| 属性 | 说明 |
|---|---|
children | 交替排列的项与分隔符 |
BreadcrumbItem
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
current | boolean | false | 是否为当前页面,为真时渲染为不可点击的文字 |
as | string | Component | 'a' | 渲染成的元素或组件 |
asChild | boolean | false | 由子元素承担渲染 |
className | string | — | 追加到根元素的类 |
其余属性透传到实际渲染的元素上,例如 href 或路由组件的 to。
| 属性 | 说明 |
|---|---|
children | 项的内容 |
BreadcrumbSeparator
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
className | string | — | 追加到根元素的类 |
| 属性 | 说明 |
|---|---|
children | 分隔符内容,缺省为向右的箭头 |