<div>
<b-nav>
<b-nav-item active>Active</b-nav-item>
<b-nav-item>Link</b-nav-item>
<b-nav-item>Another Link</b-nav-item>
<b-nav-item disabled>Disabled</b-nav-item>
</b-nav>
</div>
概述
基础 <b-nav>
组件使用 flexbox 构建,为构建所有类型的导航组件提供了坚实的基础。它包括一些样式覆盖(用于处理列表)、一些链接填充以获得更大的点击区域以及基本的禁用样式。基础导航中不包含任何活动状态。
<b-nav>
支持以下子组件
<b-nav-item>
用于可操作链接(或路由器链接) <b-nav-item-dropdown>
用于下拉菜单 <b-nav-text>
用于纯文本内容 <b-nav-form>
用于内联表单
链接外观
支持两种样式变体:tabs
和 pills
,它们支持 active
状态样式。这些变体是互斥的 - 只能使用一种样式。
标签样式
通过设置 tabs
属性,使导航看起来像标签。
<div>
<b-nav tabs>
<b-nav-item active>Active</b-nav-item>
<b-nav-item>Link</b-nav-item>
<b-nav-item>Another Link</b-nav-item>
<b-nav-item disabled>Disabled</b-nav-item>
</b-nav>
</div>
药丸样式
通过设置 pills
属性,使用药丸样式。
<div>
<b-nav pills>
<b-nav-item active>Active</b-nav-item>
<b-nav-item>Link</b-nav-item>
<b-nav-item>Another Link</b-nav-item>
<b-nav-item disabled>Disabled</b-nav-item>
</b-nav>
</div>
小
通过设置 small
属性,使导航更小。
<div>
<b-nav small>
<b-nav-item active>Active</b-nav-item>
<b-nav-item>Link</b-nav-item>
<b-nav-item>Another Link</b-nav-item>
<b-nav-item disabled>Disabled</b-nav-item>
</b-nav>
</div>
填充和对齐
强制您的 <b-nav>
内容扩展到全部可用宽度。
填充
要使用 <b-nav-item>
组件按比例填充所有可用空间,请设置 fill
属性。请注意,所有水平空间都被占用,但并非每个导航项都具有相同的宽度。
<div>
<b-nav tabs fill>
<b-nav-item active>Active</b-nav-item>
<b-nav-item>Link</b-nav-item>
<b-nav-item>Link with a long name </b-nav-item>
<b-nav-item disabled>Disabled</b-nav-item>
</b-nav>
</div>
对齐
对于等宽元素,请改用设置 justified
属性。所有水平空间都将被导航链接占用,但与上面的 fill
不同,每个 <b-nav-item>
都将具有相同的宽度。
<div>
<b-nav tabs justified>
<b-nav-item active>Active</b-nav-item>
<b-nav-item>Link</b-nav-item>
<b-nav-item>Link with a long name </b-nav-item>
<b-nav-item disabled>Disabled</b-nav-item>
</b-nav>
</div>
对齐
要对齐 <b-nav-item>
组件,请使用 align
属性。可用值包括 left
、center
和 right
。
<div>
<b-nav tabs align="center">
<b-nav-item active>Active</b-nav-item>
<b-nav-item>Link</b-nav-item>
<b-nav-item>Link with a long name </b-nav-item>
<b-nav-item disabled>Disabled</b-nav-item>
</b-nav>
</div>
垂直变化
默认情况下,<b-nav>
显示在水平线上。通过设置 vertical
属性,堆叠您的导航。
<div>
<b-nav vertical class="w-25">
<b-nav-item active>Active</b-nav-item>
<b-nav-item>Link</b-nav-item>
<b-nav-item>Another Link</b-nav-item>
<b-nav-item disabled>Disabled</b-nav-item>
</b-nav>
</div>
下拉支持
使用 <b-nav-item-dropdown>
将下拉菜单项放置在导航中。
<div>
<b-nav pills>
<b-nav-item active>Active</b-nav-item>
<b-nav-item>Link</b-nav-item>
<b-nav-item-dropdown
id="my-nav-dropdown"
text="Dropdown"
toggle-class="nav-link-custom"
right
>
<b-dropdown-item>One</b-dropdown-item>
<b-dropdown-item>Two</b-dropdown-item>
<b-dropdown-divider></b-dropdown-divider>
<b-dropdown-item>Three</b-dropdown-item>
</b-nav-item-dropdown>
</b-nav>
</div>
有时,您希望将自己的类名添加到生成的 Dropdown 切换按钮中,默认情况下,这些按钮具有 nav-link
和 dropdown-toggle
类。使用 toggle-class
属性来添加它们(如上所示),它将呈现类似于以下内容的 HTML
<li id="my-nav-dropdown" class="nav-item b-nav-dropdown dropdown">
<a
role="button"
href="#my-nav-dropdown"
id="my-nav-dropdown__BV_button_"
aria-haspopup="true"
aria-expanded="false"
class="nav-link dropdown-toggle nav-link-custom"
></a>
...
</li>
请参阅 <b-dropdown>
以获取受支持的子组件列表。
可选作用域的默认插槽
下拉菜单默认插槽是可选作用域,并提供以下作用域
属性或方法 | 说明 |
hide() | 可用于关闭下拉菜单。接受一个可选的布尔参数,如果为 true ,则将焦点返回到切换按钮 |
延迟加载下拉菜单
默认情况下,<b-nav-item-dropdown>
即使菜单未显示,也会在 DOM 中呈现菜单内容。当同一页面上呈现大量下拉菜单时,由于整体内存利用率较高,可能会影响性能。您可以通过将 lazy
属性设置为 true,指示 <b-nav-item-dropdown>
仅在菜单显示时才呈现菜单内容。
下拉菜单位置
使用下拉菜单属性 right
、dropup
、dropright
、dropleft
、no-flip
和 offset
来控制 <b-nav-item-dropdown>
的位置。
请参阅 <b-dropdown>
定位部分,了解这些属性的效果和用法。
下拉菜单实现说明
请注意,切换按钮实际上以链接 <a>
标记形式呈现,带有 role="button"
以便于设置样式,并且通常将 href
设置为 #
,除非通过 id
prop 提供 ID。
点击切换链接时,切换将防止滚动到顶部行为(通过 JavaScript)。在某些情况下,当使用 SSR 时,如果用户在 Vue 有机会对组件进行水合之前点击切换按钮,页面将滚动到顶部。在这些情况下,只需通过 id
prop 提供一个唯一的 ID,即可防止不必要的滚动到顶部行为。
导航文本内容
使用 <b-nav-text>
子组件将纯文本内容放入导航
<div>
<b-nav >
<b-nav-item href="#1">Link 1</b-nav-item>
<b-nav-item href="#2">Link 2</b-nav-item>
<b-nav-text>Plain text</b-nav-text>
</b-nav>
</div>
使用 <b-nav-form>
子组件将内嵌表单放入导航
<div>
<b-nav pills>
<b-nav-item href="#1" active>Link 1</b-nav-item>
<b-nav-item href="#2">Link 2</b-nav-item>
<b-nav-form @submit.stop.prevent="alert('Form Submitted')">
<b-form-input aria-label="Input" class="mr-1"></b-form-input>
<b-button type="submit">Ok</b-button>
</b-nav-form>
</b-nav>
</div>
有关放置表单控件的更多详细信息,请参阅 <b-form>
内嵌 文档。
选项卡本地内容支持
请参阅 <b-tabs>
组件,了解如何创建本地内容的可选项卡窗格(不适用于导航)。
卡片集成
在 <b-card>
头部中使用 <b-nav>
,方法是在 <b-nav>
上启用 card-header
prop,并设置 pills
或 tabs
prop
选项卡样式
<div>
<b-card title="Card Title" no-body>
<b-card-header header-tag="nav">
<b-nav card-header tabs>
<b-nav-item active>Active</b-nav-item>
<b-nav-item>Inactive</b-nav-item>
<b-nav-item disabled>Disabled</b-nav-item>
</b-nav>
</b-card-header>
<b-card-body class="text-center">
<b-card-text>
With supporting text below as a natural lead-in to additional content.
</b-card-text>
<b-button variant="primary">Go somewhere</b-button>
</b-card-body>
</b-card>
</div>
药丸样式
<div>
<b-card title="Card Title" no-body>
<b-card-header header-tag="nav">
<b-nav card-header pills>
<b-nav-item active>Active</b-nav-item>
<b-nav-item>Inactive</b-nav-item>
<b-nav-item disabled>Disabled</b-nav-item>
</b-nav>
</b-card-header>
<b-card-body class="text-center">
<b-card-text>
With supporting text below as a natural lead-in to additional content.
</b-card-text>
<b-button variant="primary">Go somewhere</b-button>
</b-card-body>
</b-card>
</div>
普通样式
仅当您应用 tabs
或 pills
样式时,才需要 card-header
prop。请注意,Bootstrap v4 SCSS 对于 active
状态普通样式导航项没有特殊样式。
<div>
<b-card title="Card Title" no-body>
<b-card-header header-tag="nav">
<b-nav>
<b-nav-item active>Active</b-nav-item>
<b-nav-item>Inactive</b-nav-item>
<b-nav-item disabled>Disabled</b-nav-item>
</b-nav>
</b-card-header>
<b-card-body class="text-center">
<b-card-text>
With supporting text below as a natural lead-in to additional content.
</b-card-text>
<b-button variant="primary">Go somewhere</b-button>
</b-card-body>
</b-card>
</div>
如果 <b-nav>
处于 vertical
模式,则 card-header
prop 没有样式效果。
与 Vue 路由配合使用
让你的卡片 <b-nav>
通过 <router-view>
或 <nuxt-child>
组件控制 vue 路由嵌套路由,以创建随路由 URL 变化的选项卡内容
// On page with route `/some/route`
<div>
<b-card title="Card Title" no-body>
<b-card-header header-tag="nav">
<b-nav card-header tabs>
<b-nav-item to="/some/route/" exact exact-active-class="active">Active</b-nav-item>
<b-nav-item to="/some/route/foo" exact exact-active-class="active">Foo</b-nav-item>
<b-nav-item to="/some/route/bar" exact exact-active-class="active">Bar</b-nav-item>
</b-nav>
</b-card-header>
<b-card-body>
<router-view></router-view>
</b-card-body>
</b-card>
</div>
注意:Vue 路由不支持使用哈希 (#
) 定义活动路由,这就是为什么你必须将“选项卡”内容定义为子路由。
上述内容的示例路由配置
const routes = [
{
path: '/some/route',
component: SomeRouteComponent,
children: [
{ path: '', component: DefaultTabComponent, name: 'some-route' },
{ path: 'foo', component: FooTabComponent },
{ path: 'bar', component: BarTabComponent }
]
}
]
还可以使用 Vue 路由 命名路由 和/或路由参数,而不是基于路径的路由。
更多详情请参见
无障碍
如果你使用 <b-nav>
提供导航栏,请务必为 <b-nav>
的最逻辑父容器添加 role="navigation"
,或用 <nav>
元素包裹 <b-nav>
。不要将角色添加到 <b-nav>
本身,因为这会阻止辅助技术将其宣布为实际列表。
在 <b-nav>
中使用 <b-nav-item-dropdown>
时,请务必为 <b-nav-item-dropdown>
分配一个唯一的 id
prop 值,以便可以自动生成适当的 aria-*
属性。
选项卡界面无障碍
请注意,导航栏,即使在视觉上以选项卡样式呈现,也不应赋予 role="tablist"
、role="tab"
或 role="tabpanel"
属性。这些属性仅适用于不会更改 URL 或 $route
的 选项卡界面,如 WAI ARIA 创作实践 中所述。请参阅 <b-tabs>
,了解符合 WAI ARIA 的动态选项卡界面。
选项卡界面应避免使用下拉菜单,因为这会导致可用性和无障碍问题
- 从可用性的角度来看,当前显示的选项卡的触发元素不可见(因为它位于关闭的下拉菜单中)这一事实可能会造成混淆。
- 从可访问性的角度来看,目前没有合理的方式将这种结构映射到标准 WAI ARIA 模式,这意味着辅助技术用户无法轻松理解。
另请参阅