关于如何使用 Bootstrap 的文档和示例包括导航组件。
基础导航
Bootstrap 中可用的导航共享通用标记和样式,从基础 .nav
类到活动和禁用状态。 交换修饰符类以在每种样式之间切换。
基础 .nav
组件是使用 flexbox 构建的,为构建所有类型的导航组件提供了坚实的基础。 它包括一些样式覆盖(用于处理列表)、一些针对较大点击区域的链接填充以及基本的禁用样式。
基本 .nav
组件不包含任何 .active
状态。 下面的例子包括了这个类,主要是为了说明这个特定的类不会触发任何特殊的样式。
要将活动状态传达给辅助技术,请使用 aria-current
属性 — 对当前页面使用 page
值,或对当前页面使用 true
一组中的项目。
<ul class="nav"> <li class="nav-item"> <a class="nav-link active" aria-current="page" href="#">选中的</a> </li> <li class="nav-item"> <a class="nav-link" href="#">链接</a> </li> <li class="nav-item"> <a class="nav-link" href="#">链接</a> </li> <li class="nav-item"> <a class="nav-link disabled">禁用的</a> </li> </ul>
类贯穿始终,因此您的标记可以非常灵活。 像上面一样使用 <ul>
,如果您的项目顺序很重要,请使用 <ol>
,或者使用 <nav>
元素。 因为 .nav
使用 display: flex
,所以导航链接的行为与导航项目相同,但没有额外的标记。
<nav class="nav"> <a class="nav-link active" aria-current="page" href="#">选中的</a> <a class="nav-link" href="#">链接</a> <a class="nav-link" href="#">链接</a> <a class="nav-link disabled">禁用的</a> </nav>
可用样式
使用修饰符和实用程序更改 .nav
组件的样式。 根据需要混合和匹配,或构建自己的。
水平对齐
使用flexbox 实用程序更改导航的水平对齐方式。 默认情况下,导航是左对齐的,但您可以轻松地将它们更改为居中或右对齐。
以 .justify-content-center
为中心:
<ul class="nav justify-content-center"> <li class="nav-item"> <a class="nav-link active" aria-current="page" href="#">选中的</a> </li> <li class="nav-item"> <a class="nav-link" href="#">链接</a> </li> <li class="nav-item"> <a class="nav-link" href="#">链接</a> </li> <li class="nav-item"> <a class="nav-link disabled">禁用的</a> </li> </ul>
与 .justify-content-end
右对齐:
<ul class="nav justify-content-end"> <li class="nav-item"> <a class="nav-link active" aria-current="page" href="#">选中的</a> </li> <li class="nav-item"> <a class="nav-link" href="#">链接</a> </li> <li class="nav-item"> <a class="nav-link" href="#">链接</a> </li> <li class="nav-item"> <a class="nav-link disabled">禁用的</a> </li> </ul>
Vertical
通过使用 .flex-column
实用程序更改弹性项目方向来堆叠导航。 需要将它们堆叠在某些视口上而不是其他视口上? 使用响应式版本(例如,.flex-sm-column
)。
<ul class="nav flex-column"> <li class="nav-item"> <a class="nav-link active" aria-current="page" href="#">选中的</a> </li> <li class="nav-item"> <a class="nav-link" href="#">链接</a> </li> <li class="nav-item"> <a class="nav-link" href="#">链接</a> </li> <li class="nav-item"> <a class="nav-link disabled">禁用的</a> </li> </ul>
与往常一样,垂直导航也可以在没有 <ul>
的情况下进行。
<nav class="nav flex-column"> <a class="nav-link active" aria-current="page" href="#">选中的</a> <a class="nav-link" href="#">链接</a> <a class="nav-link" href="#">链接</a> <a class="nav-link disabled">禁用的</a> </nav>
选项卡
从上面获取基本导航并添加 .nav-tabs
类以生成选项卡式界面。 通过我们的 tab JavaScript 插件,使用它们创建可选项卡区域。
<ul class="nav nav-tabs"> <li class="nav-item"> <a class="nav-link active" aria-current="page" href="#">选中的</a> </li> <li class="nav-item"> <a class="nav-link" href="#">链接</a> </li> <li class="nav-item"> <a class="nav-link" href="#">链接</a> </li> <li class="nav-item"> <a class="nav-link disabled">禁用的</a> </li> </ul>
胶囊形式
采用相同的 HTML,但使用 .nav-pills
代替:
<ul class="nav nav-pills"> <li class="nav-item"> <a class="nav-link active" aria-current="page" href="#">选中的</a> </li> <li class="nav-item"> <a class="nav-link" href="#">链接</a> </li> <li class="nav-item"> <a class="nav-link" href="#">链接</a> </li> <li class="nav-item"> <a class="nav-link disabled">禁用的</a> </li> </ul>
使...排满并对齐
强制您的 .nav
’s 内容扩展两个修饰符类之一的完整可用宽度。 要使用 .nav-item
按比例填充所有可用空间,请使用 .nav-fill
。 请注意,所有水平空间都被占用,但并非每个导航项都具有相同的宽度。
<ul class="nav nav-pills nav-fill"> <li class="nav-item"> <a class="nav-link active" aria-current="page" href="#">选中的</a> </li> <li class="nav-item"> <a class="nav-link" href="#">更长的导航链接</a> </li> <li class="nav-item"> <a class="nav-link" href="#">链接</a> </li> <li class="nav-item"> <a class="nav-link disabled">禁用的</a> </li> </ul>
当使用基于 <nav>
的导航时,您可以安全地省略 .nav-item
,因为样式只需要 .nav-link
<a>
元素。
<nav class="nav nav-pills nav-fill"> <a class="nav-link active" aria-current="page" href="#">选中的</a> <a class="nav-link" href="#">更长的导航链接</a> <a class="nav-link" href="#">链接</a> <a class="nav-link disabled">禁用的</a> </nav>
对于等宽元素,请使用 .nav-justified
。 所有水平空间都将被导航链接占用,但与上面的 .nav-fill
不同,每个导航项的宽度都相同。
<ul class="nav nav-pills nav-justified"> <li class="nav-item"> <a class="nav-link active" aria-current="page" href="#">选中的</a> </li> <li class="nav-item"> <a class="nav-link" href="#">更长的导航链接</a> </li> <li class="nav-item"> <a class="nav-link" href="#">链接</a> </li> <li class="nav-item"> <a class="nav-link disabled">禁用的</a> </li> </ul>
类似于使用基于 <nav>
的导航的 .nav-fill
示例。
<nav class="nav nav-pills nav-justified"> <a class="nav-link active" aria-current="page" href="#">选中的</a> <a class="nav-link" href="#">更长的导航链接</a> <a class="nav-link" href="#">链接</a> <a class="nav-link disabled">禁用的</a> </nav>
使用 flex 实用程序
如果您需要响应式导航变体,请考虑使用一系列flexbox 实用程序。 虽然更冗长,但这些实用程序提供了跨响应断点的更大定制。在下面的示例中,我们的导航将堆叠在最低断点上,然后适应水平布局,从小断点开始填充可用宽度。
<nav class="nav nav-pills flex-column flex-sm-row"> <a class="flex-sm-fill text-sm-center nav-link active" aria-current="page" href="#">选中的</a> <a class="flex-sm-fill text-sm-center nav-link" href="#">更长的导航链接</a> <a class="flex-sm-fill text-sm-center nav-link" href="#">链接</a> <a class="flex-sm-fill text-sm-center nav-link disabled">禁用的</a> </nav>
关于可访问性
如果您正在使用 navs 提供导航栏,请务必将 role="navigation"
添加到 <ul>
最符合逻辑的父容器中, 或者在整个导航周围包裹一个 <nav>
元素。 不要将角色添加到 <ul>
本身,因为这会阻止它被辅助技术宣布为实际列表。
请注意,导航栏,即使在视觉上被设计为带有 .nav-tabs
类的选项卡,也应该不被赋予 role="tablist"
、role="tabpanel"
或 role="tabpanel"
属性。 这些仅适用于动态选项卡式界面,如 中所述 WAI ARIA 创作实践。 有关示例,请参阅本节中的JavaScript 行为了解动态选项卡式界面。 aria-current
属性在动态选项卡式界面上不是必需的,因为我们的 JavaScript 通过在活动选项卡上添加 aria-selected="true"
来处理选定状态。
使用下拉菜单
添加带有一点额外 HTML 和 dropdowns JavaScript 插件的下拉菜单。
带有下拉菜单的选项卡
<ul class="nav nav-tabs"> <li class="nav-item"> <a class="nav-link active" aria-current="page" href="#">选中的</a> </li> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#" role="button" aria-expanded="false">Beyond</a> <ul class="dropdown-menu"> <li><a class="dropdown-item" href="#">长城</a></li> <li><a class="dropdown-item" href="#">光辉岁月</a></li> <li><a class="dropdown-item" href="#">喜欢你</a></li> <li><hr class="dropdown-divider"></li> <li><a class="dropdown-item" href="#">谁伴我闯荡</a></li> </ul> </li> <li class="nav-item"> <a class="nav-link" href="#">链接</a> </li> <li class="nav-item"> <a class="nav-link disabled">禁用的</a> </li> </ul>
带有下拉菜单的胶囊样式
<ul class="nav nav-pills"> <li class="nav-item"> <a class="nav-link active" aria-current="page" href="#">选中的</a> </li> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#" role="button" aria-expanded="false">Beyond</a> <ul class="dropdown-menu"> <li><a class="dropdown-item" href="#">长城</a></li> <li><a class="dropdown-item" href="#">光辉岁月</a></li> <li><a class="dropdown-item" href="#">喜欢你</a></li> <li><hr class="dropdown-divider"></li> <li><a class="dropdown-item" href="#">谁伴我闯荡</a></li> </ul> </li> <li class="nav-item"> <a class="nav-link" href="#">链接</a> </li> <li class="nav-item"> <a class="nav-link disabled">禁用的</a> </li> </ul>
JavaScript 行为
使用标签 JavaScript 插件(单独包含它或通过编译的 bootstrap.js
文件包含它)来扩展我们的导航标签和药丸以创建本地内容的可标签窗格。
动态选项卡式界面,如 WAI 中所述 ARIA 创作实践,需要 role="tablist"
,role="tab"
、role="tabpanel"
和其他 aria-
属性,以便将它们的结构、功能和当前状态传达给辅助技术(例如屏幕阅读器)的用户 . 作为最佳实践,我们建议对选项卡使用 <button>
元素,因为这些是触发动态更改的控件,而不是导航到新页面或新位置的链接。
这是一些占位符内容,主页选项卡的相关内容。单击另一个选项卡将切换此选项卡的可见性以供下一个选项卡使用。 选项卡 JavaScript 交换类以控制内容可见性和样式。 您可以将它与标签、胶囊形式和任何其他 .nav
驱动的导航一起使用。
《辽海丹忠录》是一部有插图的章回体通俗小说。有崇祯年间刊本藏于日本内阁文库,共八卷四十回,题“平原孤愤生戏草,铁崖热肠人偶评”。未完结。显然是由于后来战事的发展超乎了作者的预料。
赤雅,书名。明邝露撰。三卷。作者南海人,以迕邑令走粤西,为傜女云亸娘之客,因悉其山川风土仪物,撰为此书。半系亲身经历,半亦取自古人笔乘。中如“猺人祀典”、“祸斗”、“木客”、“短狐”等条,均有神话传说。
<ul class="nav nav-tabs mb-3" id="myTab" role="tablist"> <li class="nav-item" role="presentation"> <button class="nav-link active" id="home-tab" data-bs-toggle="tab" data-bs-target="#home" type="button" role="tab" aria-controls="home" aria-selected="true">首页</button> </li> <li class="nav-item" role="presentation"> <button class="nav-link" id="profile-tab" data-bs-toggle="tab" data-bs-target="#profile" type="button" role="tab" aria-controls="profile" aria-selected="false">个人简介</button> </li> <li class="nav-item" role="presentation"> <button class="nav-link" id="contact-tab" data-bs-toggle="tab" data-bs-target="#contact" type="button" role="tab" aria-controls="contact" aria-selected="false">联系我们</button> </li> </ul> <div class="tab-content" id="myTabContent"> <div class="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab"> <p><strong>这是一些占位符内容,主页选项卡的相关内容。</strong>单击另一个选项卡将切换此选项卡的可见性以供下一个选项卡使用。 选项卡 JavaScript 交换类以控制内容可见性和样式。 您可以将它与标签、胶囊形式和任何其他 <code>.nav</code> 驱动的导航一起使用。</p> </div> <div class="tab-pane fade" id="profile" role="tabpanel" aria-labelledby="profile-tab"> <p>《辽海丹忠录》是一部有插图的章回体通俗小说。有崇祯年间刊本藏于日本内阁文库,共八卷四十回,题“平原孤愤生戏草,铁崖热肠人偶评”。未完结。显然是由于后来战事的发展超乎了作者的预料。</p> </div> <div class="tab-pane fade" id="contact" role="tabpanel" aria-labelledby="contact-tab"> <p>赤雅,书名。明邝露撰。三卷。作者南海人,以迕邑令走粤西,为傜女云亸娘之客,因悉其山川风土仪物,撰为此书。半系亲身经历,半亦取自古人笔乘。中如“猺人祀典”、“祸斗”、“木客”、“短狐”等条,均有神话传说。</p> </div> </div>
为了帮助满足您的需求,这适用于基于 <ul>
的标记,如上所示,或任何任意的“滚动你自己的”。 标记。 请注意,如果您正在使用 <nav>
,则不应直接向其添加 role="tablist"
,因为这会覆盖元素的原生 作为导航地标的作用。相反,切换到一个替代元素(在下面的示例中,一个简单的 <div>
)并将 <nav>
包裹在它周围。
<nav> <div class="nav nav-tabs mb-3" id="nav-tab" role="tablist"> <button class="nav-link active" id="nav-home-tab" data-bs-toggle="tab" data-bs-target="#nav-home" type="button" role="tab" aria-controls="nav-home" aria-selected="true">首页</button> <button class="nav-link" id="nav-profile-tab" data-bs-toggle="tab" data-bs-target="#nav-profile" type="button" role="tab" aria-controls="nav-profile" aria-selected="false">个人简介</button> <button class="nav-link" id="nav-contact-tab" data-bs-toggle="tab" data-bs-target="#nav-contact" type="button" role="tab" aria-controls="nav-contact" aria-selected="false">联系我们</button> </div> </nav> <div class="tab-content" id="nav-tabContent"> <div class="tab-pane fade show active" id="nav-home" role="tabpanel" aria-labelledby="nav-home-tab"> <p>作者谈迁是我国17世纪的爱国历史家,《北游录》是记述他1653年到1656年去北京期间的经历见闻,和他写的一些诗文。</p> </div> <div class="tab-pane fade" id="nav-profile" role="tabpanel" aria-labelledby="nav-profile-tab"> <p>《飞龙全传》是清代吴璿根据旧本《飞龙传》增补改编的长篇英雄传奇小说,共六十回。飞龙:借指皇帝,喻其居高位而临天下,如飞龙在天。</p> </div> <div class="tab-pane fade" id="nav-contact" role="tabpanel" aria-labelledby="nav-contact-tab"> <p>《银钩赌坊》描述的是西方魔教玉罗刹教主之子玉天宝被杀,银钩赌坊主人蓝胡子栽赃陆小凤。</p> </div> </div>
选项卡插件也适用于胶囊形式。
从来国家吉凶祸福,虽系天命,多因人事;既有定数,必有预兆。于此若能恐惧修省,便可转灾为祥。所谓妖由人兴,亦由人灭。若但心怀猜忌,欲遏乱萌,好行诛杀,因而奸佞乘机,设谋害人,此非但不足以弭灾,且适足以酿祸。
却说隋主,因梦洪水淹城,心疑有个水傍名姓之人为祸。时朝中有老臣成阝国公李浑,原系陈朝勋旧,陈亡而降隋,仍其旧爵为成阝公。隋主猛然想得:“浑字军傍着水,其封爵为成阝公,成阝者城也,正合水淹城之梦。且军乃兵像,莫非此人便是个祸胎也?但其人已老,又不掌兵权,干不得甚事,除非应在他子孙身上。”
因问左右:“李浑有几子,其子何名?”左右奏道:“李浑长子已亡,止存幼子,小名洪儿。”隋主闻洪儿两字,一发惊疑,想道:“我梦中曾见城上有树,树上有果。树乃本也,树上果是木之子也,木子二字,合来正是个李字。今李家儿子的小名,恰好的洪水的洪字,更合我之所梦。此子将来必不利于国家,当即除之。”
<ul class="nav nav-pills mb-3" id="pills-tab" role="tablist"> <li class="nav-item" role="presentation"> <button class="nav-link active" id="pills-home-tab" data-bs-toggle="pill" data-bs-target="#pills-home" type="button" role="tab" aria-controls="pills-home" aria-selected="true">首页</button> </li> <li class="nav-item" role="presentation"> <button class="nav-link" id="pills-profile-tab" data-bs-toggle="pill" data-bs-target="#pills-profile" type="button" role="tab" aria-controls="pills-profile" aria-selected="false">个人简介</button> </li> <li class="nav-item" role="presentation"> <button class="nav-link" id="pills-contact-tab" data-bs-toggle="pill" data-bs-target="#pills-contact" type="button" role="tab" aria-controls="pills-contact" aria-selected="false">联系我们</button> </li> </ul> <div class="tab-content" id="pills-tabContent"> <div class="tab-pane fade show active" id="pills-home" role="tabpanel" aria-labelledby="pills-home-tab"> <p>从来国家吉凶祸福,虽系天命,多因人事;既有定数,必有预兆。于此若能恐惧修省,便可转灾为祥。所谓妖由人兴,亦由人灭。若但心怀猜忌,欲遏乱萌,好行诛杀,因而奸佞乘机,设谋害人,此非但不足以弭灾,且适足以酿祸。</p> </div> <div class="tab-pane fade" id="pills-profile" role="tabpanel" aria-labelledby="pills-profile-tab"> <p>却说隋主,因梦洪水淹城,心疑有个水傍名姓之人为祸。时朝中有老臣成阝国公李浑,原系陈朝勋旧,陈亡而降隋,仍其旧爵为成阝公。隋主猛然想得:“浑字军傍着水,其封爵为成阝公,成阝者城也,正合水淹城之梦。且军乃兵像,莫非此人便是个祸胎也?但其人已老,又不掌兵权,干不得甚事,除非应在他子孙身上。”</p> </div> <div class="tab-pane fade" id="pills-contact" role="tabpanel" aria-labelledby="pills-contact-tab"> <p>因问左右:“李浑有几子,其子何名?”左右奏道:“李浑长子已亡,止存幼子,小名洪儿。”隋主闻洪儿两字,一发惊疑,想道:“我梦中曾见城上有树,树上有果。树乃本也,树上果是木之子也,木子二字,合来正是个李字。今李家儿子的小名,恰好的洪水的洪字,更合我之所梦。此子将来必不利于国家,当即除之。”</p> </div> </div>
垂直方向的胶囊形式。
遂令内侍赍手敕至李浑家,将洪儿赐死。李浑逼于君命,不得不从。可怜洪儿无端殒命,举家号哭。后人有诗叹云:殷高与文王,因梦得良相。楚襄风流梦,感得神女降。堪叹隋高祖,恶梦添魔障。杀人当禳梦,举动殊孟浪。
隋主以疑心杀了李家之子,此事传播,早惊动了一个姓李的,陡起一片雄心。那人姓李,名靖,字药师,三原人氏,足智多谋深通兵法,且又弓马娴熟。真个能文能武。幼丧父母,育于外家,其舅即韩擒虎也。擒虎常与他谈兵,赞叹道:“可与谈孙吴者,非此子而谁?”时年方弱冠,却负大志。见隋朝用法太峻,料他国脉必不长久。
闻知隋主以梦杀人,暗笑道:“王者不死,杀人何益?”又想道:“据梦树木生子,固当是个李字;洪水滔天,乃天下混一也。将来有天下者,必是个姓李之人。”因便想到自己身上。一日,偶有事到华州,路经华山,闻说山神西岳大王,甚有灵应。
遂具香烛,到庙瞻拜,具疏默祷道:“布衣李靖,不揆狂简,献疏西岳大王殿下。靖闻上清下浊,爱分天地之仪;昼明夜昏,乃著神人之道。又闻聪明正直,依人而行,至诚感神,位不虚矣。伏惟大王嵯峨擅德,肃爽凝威;为灵术制百神,配位名雄四岳;...焚其庙宇,建纵横之略,未为晚也。惟神裁之。”
<div class="d-flex align-items-start"> <div class="nav flex-column nav-pills me-3" id="v-pills-tab" role="tablist" aria-orientation="vertical"> <button class="nav-link active" id="v-pills-home-tab" data-bs-toggle="pill" data-bs-target="#v-pills-home" type="button" role="tab" aria-controls="v-pills-home" aria-selected="true">首页</button> <button class="nav-link" id="v-pills-profile-tab" data-bs-toggle="pill" data-bs-target="#v-pills-profile" type="button" role="tab" aria-controls="v-pills-profile" aria-selected="false">个人简介</button> <button class="nav-link" id="v-pills-messages-tab" data-bs-toggle="pill" data-bs-target="#v-pills-messages" type="button" role="tab" aria-controls="v-pills-messages" aria-selected="false">消息留言</button> <button class="nav-link" id="v-pills-settings-tab" data-bs-toggle="pill" data-bs-target="#v-pills-settings" type="button" role="tab" aria-controls="v-pills-settings" aria-selected="false">设置</button> </div> <div class="tab-content" id="v-pills-tabContent"> <div class="tab-pane fade show active" id="v-pills-home" role="tabpanel" aria-labelledby="v-pills-home-tab"> <p>遂令内侍赍手敕至李浑家,将洪儿赐死。李浑逼于君命,不得不从。可怜洪儿无端殒命,举家号哭。后人有诗叹云:殷高与文王,因梦得良相。楚襄风流梦,感得神女降。堪叹隋高祖,恶梦添魔障。杀人当禳梦,举动殊孟浪。</p> </div> <div class="tab-pane fade" id="v-pills-profile" role="tabpanel" aria-labelledby="v-pills-profile-tab"> <p>隋主以疑心杀了李家之子,此事传播,早惊动了一个姓李的,陡起一片雄心。那人姓李,名靖,字药师,三原人氏,足智多谋深通兵法,且又弓马娴熟。真个能文能武。幼丧父母,育于外家,其舅即韩擒虎也。擒虎常与他谈兵,赞叹道:“可与谈孙吴者,非此子而谁?”时年方弱冠,却负大志。见隋朝用法太峻,料他国脉必不长久。</p> </div> <div class="tab-pane fade" id="v-pills-messages" role="tabpanel" aria-labelledby="v-pills-messages-tab"> <p>闻知隋主以梦杀人,暗笑道:“王者不死,杀人何益?”又想道:“据梦树木生子,固当是个李字;洪水滔天,乃天下混一也。将来有天下者,必是个姓李之人。”因便想到自己身上。一日,偶有事到华州,路经华山,闻说山神西岳大王,甚有灵应。</p> </div> <div class="tab-pane fade" id="v-pills-settings" role="tabpanel" aria-labelledby="v-pills-settings-tab"> <p>遂具香烛,到庙瞻拜,具疏默祷道:“布衣李靖,不揆狂简,献疏西岳大王殿下。靖闻上清下浊,爱分天地之仪;昼明夜昏,乃著神人之道。又闻聪明正直,依人而行,至诚感神,位不虚矣。伏惟大王嵯峨擅德,肃爽凝威;为灵术制百神,配位名雄四岳;...焚其庙宇,建纵横之略,未为晚也。惟神裁之。”</p> </div> </div> </div>
使用数据属性
只需指定 data-bs-toggle="tab"
或 data-bs-toggle="pill"
即可激活选项卡或药丸导航,而无需编写任何 JavaScript 在一个元素上。 在 .nav-tabs
或 .nav-pills
上使用这些数据属性。
<!-- Nav tabs --> <ul class="nav nav-tabs" id="myTab" role="tablist"> <li class="nav-item" role="presentation"> <button class="nav-link active" id="home-tab" data-bs-toggle="tab" data-bs-target="#home" type="button" role="tab" aria-controls="home" aria-selected="true">首页</button> </li> <li class="nav-item" role="presentation"> <button class="nav-link" id="profile-tab" data-bs-toggle="tab" data-bs-target="#profile" type="button" role="tab" aria-controls="profile" aria-selected="false">个人简介</button> </li> <li class="nav-item" role="presentation"> <button class="nav-link" id="messages-tab" data-bs-toggle="tab" data-bs-target="#messages" type="button" role="tab" aria-controls="messages" aria-selected="false">消息留言</button> </li> <li class="nav-item" role="presentation"> <button class="nav-link" id="settings-tab" data-bs-toggle="tab" data-bs-target="#settings" type="button" role="tab" aria-controls="settings" aria-selected="false">设置</button> </li> </ul> <!-- Tab panes --> <div class="tab-content"> <div class="tab-pane active" id="home" role="tabpanel" aria-labelledby="home-tab">...</div> <div class="tab-pane" id="profile" role="tabpanel" aria-labelledby="profile-tab">...</div> <div class="tab-pane" id="messages" role="tabpanel" aria-labelledby="messages-tab">...</div> <div class="tab-pane" id="settings" role="tabpanel" aria-labelledby="settings-tab">...</div> </div>
通过 JavaScript
通过 JavaScript 启用可选项卡(每个选项卡需要单独激活):
var triggerTabList = Array.prototype.slice.call(document.querySelectorAll('#myTab button')) triggerTabList.forEach(function (triggerEl) { var tabTrigger = new bootstrap.Tab(triggerEl) triggerEl.addEventListener('click', function (event) { event.preventDefault() tabTrigger.show() }) })
您可以通过多种方式激活单个选项卡:
var triggerEl = document.querySelector('#myTab button[data-bs-target="#profile"]') bootstrap.Tab.getInstance(triggerEl).show() // Select tab by name var triggerFirstTabEl = document.querySelector('#myTab li:first-child button') bootstrap.Tab.getInstance(triggerFirstTabEl).show() // Select first tab
淡化效果
要使标签淡入,请将 .fade
添加到每个 .tab-pane
。 第一个选项卡窗格还必须具有 .show
以使初始内容可见。
<div class="tab-content"> <div class="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab">...</div> <div class="tab-pane fade" id="profile" role="tabpanel" aria-labelledby="profile-tab">...</div> <div class="tab-pane fade" id="messages" role="tabpanel" aria-labelledby="messages-tab">...</div> <div class="tab-pane fade" id="settings" role="tabpanel" aria-labelledby="settings-tab">...</div> </div>
方法
所有 API 方法都是异步并启动transition。 它们会在过渡开始后但在过渡结束之前返回给调用者。 此外,转换组件上的方法调用将被忽略。
激活选项卡元素和内容容器。 Tab 应该有一个 data-bs-target
或者,如果使用链接,一个 href
属性,以 DOM 中的容器节点为目标。
<ul class="nav nav-tabs" id="myTab" role="tablist"> <li class="nav-item" role="presentation"> <button class="nav-link active" id="home-tab" data-bs-toggle="tab" data-bs-target="#home" type="button" role="tab" aria-controls="home" aria-selected="true">首页</button> </li> <li class="nav-item" role="presentation"> <button class="nav-link" id="profile-tab" data-bs-toggle="tab" data-bs-target="#profile" type="button" role="tab" aria-controls="profile" aria-selected="false">个人简介</button> </li> <li class="nav-item" role="presentation"> <button class="nav-link" id="messages-tab" data-bs-toggle="tab" data-bs-target="#messages" type="button" role="tab" aria-controls="messages" aria-selected="false">消息留言</button> </li> <li class="nav-item" role="presentation"> <button class="nav-link" id="settings-tab" data-bs-toggle="tab" data-bs-target="#settings" type="button" role="tab" aria-controls="settings" aria-selected="false">设置</button> </li> </ul> <div class="tab-content"> <div class="tab-pane active" id="home" role="tabpanel" aria-labelledby="home-tab">...</div> <div class="tab-pane" id="profile" role="tabpanel" aria-labelledby="profile-tab">...</div> <div class="tab-pane" id="messages" role="tabpanel" aria-labelledby="messages-tab">...</div> <div class="tab-pane" id="settings" role="tabpanel" aria-labelledby="settings-tab">...</div> </div> <script> var firstTabEl = document.querySelector('#myTab li:last-child button') var firstTab = new bootstrap.Tab(firstTabEl) firstTab.show() </script>show
选择给定的选项卡并显示其关联的窗格。 之前选择的任何其他选项卡都将被取消选择,并且其关联的窗格被隐藏。 在选项卡窗格实际显示之前返回调用方(即在 shown.bs.tab
事件发生之前)。
var someTabTriggerEl = document.querySelector('#someTabTrigger') var tab = new bootstrap.Tab(someTabTriggerEl) tab.show()dispose
销毁元素的选项卡。
getInstanceStatic 方法,允许您获取与 DOM 元素关联的选项卡实例。
var triggerEl = document.querySelector('#trigger') var tab = bootstrap.Tab.getInstance(triggerEl) // Returns a Bootstrap tab instancegetOrCreateInstance
静态方法,允许您获取与 DOM 元素关联的选项卡实例,或创建一个新的实例以防它未初始化
var triggerEl = document.querySelector('#trigger') var tab = bootstrap.Tab.getOrCreateInstance(triggerEl) // Returns a Bootstrap tab instance
Events
显示新选项卡时,事件按以下顺序触发:
hide.bs.tab
(在当前活动选项卡上)show.bs.tab
(在待显示的选项卡上)hidden.bs.tab
(在上一个活动选项卡上,与hide.bs.tab
事件相同)shown.bs.tab
(在新激活的刚刚显示的选项卡上,与show.bs.tab
事件相同)
如果没有选项卡处于活动状态,则不会触发 hide.bs.tab
和 hidden.bs.tab
事件。
事件类型 | 描述 |
---|---|
show.bs.tab |
此事件在标签显示时触发,但在新标签显示之前。 使用 event.target 和 event.relatedTarget 分别定位活动选项卡和上一个活动选项卡(如果可用)。 |
shown.bs.tab |
显示选项卡后,此事件在选项卡显示时触发。 使用 event.target 和 event.relatedTarget 分别定位活动选项卡和上一个活动选项卡(如果可用)。 |
hide.bs.tab |
此事件在要显示新选项卡时触发(因此要隐藏先前的活动选项卡)。 使用 event.target 和 event.relatedTarget 分别定位当前活动选项卡和新的即将活动选项卡。 |
hidden.bs.tab |
此事件在显示新选项卡后触发(因此先前的活动选项卡被隐藏)。 使用 event.target 和 event.relatedTarget 分别定位上一个活动选项卡和新活动选项卡。 |
var tabEl = document.querySelector('button[data-bs-toggle="tab"]') tabEl.addEventListener('shown.bs.tab', function (event) { event.target // newly activated tab event.relatedTarget // previous active tab })