Powered by NeGD | MeitY Government of India® UX4G
Navs and Tabs
Documentation and examples for how to use UX4G’s included navigation components.
Base nav#
The base .nav
class, active and disabled states, and overall markup and styling are all shared by the navigation offered in UX4G. To transition between each style, switch modifier classes.
The base .Flexbox
is used to design the navigation component, which serves as a solid basis for creating various navigation component kinds. It adds some style overrides (for working with lists), basic disabled styling, and some link padding for wider hit areas.
There is no
.active
state in the base.nav
component. The class is used in the examples that follow primarily to show that it has no effect on special styling.Use the
aria-current
attribute with the page value for the current page or true for the current item in a set to communicate the active status to assistive technologies.
<ul class="nav"><li class="nav-item"><a class="nav-link active" aria-current="page" href="#">Active</a></li><li class="nav-item"><a class="nav-link" href="#">Link</a></li><li class="nav-item"><a class="nav-link" href="#">Link</a></li><li class="nav-item"><a class="nav-link disabled">Disabled</a></li></ul>
RESULT
Classes are used throughout, so your markup can be
super flexible. Use <ul>
s like above,
<ol>
if the order of your items is important,
or roll your own with a <nav>
element.
Because the .nav
uses display: flex
,
the nav links behave the same as nav items would, but without
the extra markup.
<nav class="nav"><a class="nav-link active" aria-current="page" href="#">Active</a><a class="nav-link" href="#">Link</a><a class="nav-link" href="#">Link</a><a class="nav-link disabled">Disabled</a></nav>
RESULT
Available styles#
Change the style of .nav
s component with
modifiers and utilities. Mix and match as needed, or build
your own.
Horizontal alignment#
Utilize flexbox utilities to modify the horizontal alignment of your navigation. Navigators are centered or right-aligned by default, it can be easily modified.
Centered with .justify-content-center
:
<ul class="nav justify-content-center"><li class="nav-item"><a class="nav-link active" aria-current="page" href="#">Active</a></li><li class="nav-item"><a class="nav-link" href="#">Link</a></li><li class="nav-item"><a class="nav-link" href="#">Link</a></li><li class="nav-item"><a class="nav-link disabled">Disabled</a></li></ul>
Result
Right-aligned with
.justify-content-end
<ul class="nav justify-content-end"><li class="nav-item"><a class="nav-link active" aria-current="page" href="#">Active</a></li><li class="nav-item"><a class="nav-link" href="#">Link</a></li><li class="nav-item"><a class="nav-link" href="#">Link</a></li><li class="nav-item"><a class="nav-link disabled">Disabled</a></li></ul>
RESULT
Vertical#
Stack the navigation by changing the flex item direction with the .flex-column
utility. Some viewports must have them stacked, but not others. Use the mobile-friendly variations (like .flex-sm-column
).
<ul class="nav flex-column"><li class="nav-item"><a class="nav-link active" aria-current="page" href="#">Active</a></li><li class="nav-item"><a class="nav-link" href="#">Link</a></li><li class="nav-item"><a class="nav-link" href="#">Link</a></li><li class="nav-item"><a class="nav-link disabled">Disabled</a></li></ul>
Result
As always, vertical navigation is possible
without <ul>
s, too.
<nav class="nav flex-column"><a class="nav-link active" aria-current="page" href="#">Active</a><a class="nav-link" href="#">Link</a><a class="nav-link" href="#">Link</a><a class="nav-link disabled">Disabled</a></nav>
Result
Tabs#
Adds the.nav-tabs class to the basic nav from above to produce a tabbed UI. Use them to create tabbable zones.
<ul class="nav nav-tabs"><li class="nav-item"><a class="nav-link active" aria-current="page" href="#">Active</a></li><li class="nav-item"><a class="nav-link" href="#">Link</a></li><li class="nav-item"><a class="nav-link" href="#">Link</a></li><li class="nav-item"><a class="nav-link disabled">Disabled</a></li></ul>
Result
Pills#
Take that same HTML, but use .nav-pills
instead:
<ul class="nav nav-pills"><li class="nav-item"><a class="nav-link active" aria-current="page" href="#">Active</a></li><li class="nav-item"><a class="nav-link" href="#">Link</a></li><li class="nav-item"><a class="nav-link" href="#">Link</a></li><li class="nav-item"><a class="nav-link disabled">Disabled</a></li></ul>
Result
Fill and justify#
One of two modifier classes can be used to make the contents of your .nav
take up the entire available width. Use .nav-fill
to appropriately fill the entire space with your .nav-items
. Although every square inch of horizontal space is taken up, not every nav item has the same width.
<ul class="nav nav-pills nav-fill"><li class="nav-item"><a class="nav-link active" aria-current="page" href="#">Active</a></li><li class="nav-item"><a class="nav-link" href="#">Much longer nav link</a></li><li class="nav-item"><a class="nav-link" href="#">Link</a></li><li class="nav-item"><a class="nav-link disabled">Disabled</a></li></ul>
Result
It can safely omit when utilizing a navigation system .nav-item
as the sole. For customizing an element, nav-link is necessary.
<nav class="nav nav-pills nav-fill"><a class="nav-link active" aria-current="page" href="#">Active</a><a class="nav-link" href="#">Much longer nav link</a><a class="nav-link" href="#">Link</a><a class="nav-link disabled">Disabled</a></nav>
Result
Use .nav-justified
for elements with equal widths. The navigation links will take up the entire horizontal space, but unlike the .nav-fill
above, each nav item will have the same width.
<ul class="nav nav-pills nav-justified"><li class="nav-item"><a class="nav-link active" aria-current="page" href="#">Active</a></li><li class="nav-item"><a class="nav-link" href="#">Much longer nav link</a></li><li class="nav-item"><a class="nav-link" href="#">Link</a></li><li class="nav-item"><a class="nav-link disabled">Disabled</a></li></ul>
Result
Similar to the .nav-fill
example
using
a <nav>
-based navigation.
<nav class="nav nav-pills nav-justified"><a class="nav-link active" aria-current="page" href="#">Active</a><a class="nav-link" href="#">Much longer nav link</a><a class="nav-link" href="#">Link</a><a class="nav-link disabled">Disabled</a></nav>
Result
Working with flex utilities#
Consider utilizing a variety of flexbox utilities if it is required responsive nav alternatives. These utilities provide additional customization across responsive breakpoints despite being verbose. The navigation in the example below will be stacked at the lowest breakpoint and will then adjust to a horizontal layout that covers the available width beginning at the small breakpoint.
<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="#">Active</a><a class="flex-sm-fill text-sm-center nav-link" href="#">Longer nav link</a><a class="flex-sm-fill text-sm-center nav-link" href="#">Link</a><a class="flex-sm-fill text-sm-center nav-link disabled">Disabled</a></nav>
Result
Regarding accessibility#
Make sure to add a role="navigation"
to the logical parent container if there is a use of navs to create a navigation bar, or wrap the entire navigation in an element. Avoid adding the role to the list since this would prevent assistive technologies from announcing it as a real list.
It should be noted that navigation bars should not have the role="tablist"
, role="tab"
, or role="tabpanel"
characteristics, even if they are aesthetically styled as tabs using the .nav-tabs class
. These are only suitable for dynamic tabbed interfaces, as explained in the tabs pattern in the ARIA Authoring Practices Guide. For an illustration, see the JavaScript behavior for dynamic tabbed interfaces in this section. On dynamic tabbed interfaces, the aria-current attribute is not required because our JavaScript manages the selected state by adding aria-selected="true"
on the active tab.
Using dropdowns#
Add dropdown menus with a little extra HTML and the dropdowns JavaScript plugin.
<ul class="nav nav-tabs"><li class="nav-item"><a class="nav-link active" aria-current="page" href="#">Active</a></li><li class="nav-item dropdown"><a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#" role="button" aria-expanded="false">Dropdown</a><ul class="dropdown-menu"><li><a class="dropdown-item" href="#">Action</a></li><li><a class="dropdown-item" href="#">Another action</a></li><li><a class="dropdown-item" href="#">Something else here</a></li><li><hr class="dropdown-divider"/></li><li><a class="dropdown-item" href="#">Separated link</a></li></ul></li><li class="nav-item"><a class="nav-link" href="#">Link</a></li><li class="nav-item"><a class="nav-link disabled">Disabled</a></li></ul>
Result
Pills with dropdowns#
<ul class="nav nav-pills"><li class="nav-item"><a class="nav-link active" aria-current="page" href="#">Active</a></li><li class="nav-item dropdown"><a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#" role="button" aria-expanded="false">Dropdown</a><ul class="dropdown-menu"><li><a class="dropdown-item" href="#">Action</a></li><li><a class="dropdown-item" href="#">Another action</a></li><li><a class="dropdown-item" href="#">Something else here</a></li><li><hr class="dropdown-divider"/></li><li><a class="dropdown-item" href="#">Separated link</a></li></ul></li><li class="nav-item"><a class="nav-link" href="#">Link</a></li><li class="nav-item"><a class="nav-link disabled">Disabled</a></li></ul>
Result
CSS #
Variables #
Added in v1.0.0
Local CSS variables are now used by navs on .nav
, .nav-tabs
, and .nav-pills
as part of UX4G's expanding approach to CSS variables for improved real-time customisation. Sass is used to set the values for the CSS variables, therefore Sass customization is still available.
--#{$prefix}nav-link-padding-x: #{$nav-link-padding-x};
--#{$prefix}nav-link-padding-y: #{$nav-link-padding-y};
@include rfs($nav-link-font-size, --#{$prefix}nav-link-font-size);
--#{$prefix}nav-link-font-weight: #{$nav-link-font-weight};
--#{$prefix}nav-link-color: #{$nav-link-color};
--#{$prefix}nav-link-hover-color: #{$nav-link-hover-color};
--#{$prefix}nav-link-disabled-color: #{$nav-link-disabled-color};
On the .nav-tabs
modifier class:
--#{$prefix}nav-tabs-border-width: #{$nav-tabs-border-width};
--#{$prefix}nav-tabs-border-color: #{$nav-tabs-border-color};
--#{$prefix}nav-tabs-border-radius: #{$nav-tabs-border-radius};
--#{$prefix}nav-tabs-link-hover-border-color: #{$nav-tabs-link-hover-border-color};
--#{$prefix}nav-tabs-link-active-color: #{$nav-tabs-link-active-color};
--#{$prefix}nav-tabs-link-active-bg: #{$nav-tabs-link-active-bg};
--#{$prefix}nav-tabs-link-active-border-color: #{$nav-tabs-link-active-border-color};
On the .nav-pills
modifier class:
--#{$prefix}nav-pills-border-radius: #{$nav-pills-border-radius};
--#{$prefix}nav-pills-link-active-color: #{$nav-pills-link-active-color};
--#{$prefix}nav-pills-link-active-bg: #{$nav-pills-link-active-bg};
Sass variables #
$nav-link-padding-y: .5rem;
$nav-link-padding-x: 1rem;
$nav-link-font-size: null;
$nav-link-font-weight: null;
$nav-link-color: var(--#{$prefix}link-color);
$nav-link-hover-color: var(--#{$prefix}link-hover-color);
$nav-link-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out;
$nav-link-disabled-color: $gray-600;
$nav-tabs-border-color: $gray-300;
$nav-tabs-border-width: $border-width;
$nav-tabs-border-radius: $border-radius;
$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color;
$nav-tabs-link-active-color: $gray-700;
$nav-tabs-link-active-bg: $body-bg;
$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg;
$nav-pills-border-radius: $border-radius;
$nav-pills-link-active-color: $component-active-color;
$nav-pills-link-active-bg: $component-active-bg;
JavaScript behavior #
Use the tab JavaScript plugin to expand the navigational tabs and pills to create tabbable panes of local content. There is an option to include it separately or through the built UX4G.js file.
<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-tab-pane" type="button" role="tab" aria-controls="home-tab-pane" aria-selected="true">Home</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="profile-tab" data-bs-toggle="tab" data-bs-target="#profile-tab-pane" type="button" role="tab" aria-controls="profile-tab-pane" aria-selected="false">Profile</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="contact-tab" data-bs-toggle="tab" data-bs-target="#contact-tab-pane" type="button" role="tab" aria-controls="contact-tab-pane" aria-selected="false">Contact</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="disabled-tab" data-bs-toggle="tab" data-bs-target="#disabled-tab-pane" type="button" role="tab" aria-controls="disabled-tab-pane" aria-selected="false" disabled>Disabled</button>
</li>
</ul>
<div class="tab-content" id="myTabContent">
<div class="tab-pane fade show active" id="home-tab-pane" role="tabpanel" aria-labelledby="home-tab" tabindex="0">...</div>
<div class="tab-pane fade" id="profile-tab-pane" role="tabpanel" aria-labelledby="profile-tab" tabindex="0">...</div>
<div class="tab-pane fade" id="contact-tab-pane" role="tabpanel" aria-labelledby="contact-tab" tabindex="0">...</div>
<div class="tab-pane fade" id="disabled-tab-pane" role="tabpanel" aria-labelledby="disabled-tab" tabindex="0">...</div>
</div>
Result
This is some placeholder content the Home tab's associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other .nav
-powered navigation.
This is some placeholder content the Profile tab's associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other .nav
-powered navigation.
This is some placeholder content the Contact tab's associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other .nav
-powered navigation.
This is some placeholder content the Disabled tab's associated content.
This works with ul-based
markup, as demonstrated above, or with any random "roll your own" markup, depending on the needs. Be aware that adding role="tablist"
straight to the nav element might replace its default function as a navigation landmark. Change to a different element (in the example below, a straightforward div) and wrap the nav around it instead.
<nav>
<div class="nav nav-tabs" 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">Home</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">Profile</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">Contact</button>
<button class="nav-link" id="nav-disabled-tab" data-bs-toggle="tab" data-bs-target="#nav-disabled" type="button" role="tab" aria-controls="nav-disabled" aria-selected="false" disabled>Disabled</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" tabindex="0">...</div>
<div class="tab-pane fade" id="nav-profile" role="tabpanel" aria-labelledby="nav-profile-tab" tabindex="0">...</div>
<div class="tab-pane fade" id="nav-contact" role="tabpanel" aria-labelledby="nav-contact-tab" tabindex="0">...</div>
<div class="tab-pane fade" id="nav-disabled" role="tabpanel" aria-labelledby="nav-disabled-tab" tabindex="0">...</div>
</div>
Result
This is some placeholder content the Home tab's associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other .nav
-powered navigation.
This is some placeholder content the Profile tab's associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other .nav
-powered navigation.
This is some placeholder content the Contact tab's associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other .nav
-powered navigation.
This is some placeholder content the Disabled tab's associated content.
The tabs plugin also works with pills.
<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">Home</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">Profile</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">Contact</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="pills-disabled-tab" data-bs-toggle="pill" data-bs-target="#pills-disabled" type="button" role="tab" aria-controls="pills-disabled" aria-selected="false" disabled>Disabled</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" tabindex="0">...</div>
<div class="tab-pane fade" id="pills-profile" role="tabpanel" aria-labelledby="pills-profile-tab" tabindex="0">...</div>
<div class="tab-pane fade" id="pills-contact" role="tabpanel" aria-labelledby="pills-contact-tab" tabindex="0">...</div>
<div class="tab-pane fade" id="pills-disabled" role="tabpanel" aria-labelledby="pills-disabled-tab" tabindex="0">...</div>
</div>
Result
This is some placeholder content the Home tab's associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other .nav
-powered navigation.
This is some placeholder content the Profile tab's associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other .nav
-powered navigation.
This is some placeholder content the Contact tab's associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other .nav
-powered navigation.
This is some placeholder content the Disabled tab's associated content.
And with vertical pills. Ideally, for vertical
tabs, you should also add
aria-orientation="vertical"
to the tab list
container.
<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">Home</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">Profile</button>
<button class="nav-link" id="v-pills-disabled-tab" data-bs-toggle="pill" data-bs-target="#v-pills-disabled" type="button" role="tab" aria-controls="v-pills-disabled" aria-selected="false" disabled>Disabled</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">Messages</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">Settings</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" tabindex="0">...</div>
<div class="tab-pane fade" id="v-pills-profile" role="tabpanel" aria-labelledby="v-pills-profile-tab" tabindex="0">...</div>
<div class="tab-pane fade" id="v-pills-disabled" role="tabpanel" aria-labelledby="v-pills-disabled-tab" tabindex="0">...</div>
<div class="tab-pane fade" id="v-pills-messages" role="tabpanel" aria-labelledby="v-pills-messages-tab" tabindex="0">...</div>
<div class="tab-pane fade" id="v-pills-settings" role="tabpanel" aria-labelledby="v-pills-settings-tab" tabindex="0">...</div>
</div>
</div>
Result
This is some placeholder content the Home tab's associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other .nav
-powered navigation.
This is some placeholder content the Profile tab's associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other .nav
-powered navigation.
This is some placeholder content the Disabled tab's associated content.
This is some placeholder content the Messages tab's associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other .nav
-powered navigation.
This is some placeholder content the Settings tab's associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other .nav
-powered navigation.
Accessibility #
Role="tablist"
, Role="tab"
, Role="tabpanel"
, and additional aria- attributes
are needed for dynamic tabbed interfaces, as described in the ARIA Authoring Practices Guide tabs pattern, in order to communicate their structure, functionality, and current state to users of assistive technologies (like screen readers). As a recommended practice, we advise using button elements for the tabs rather than links that take the user to an other page or site because these are controls that cause a dynamic change.
According to the ARIA Authoring Practices pattern, the keyboard emphasis is only given to the active tab. The JavaScript plugin will set tabindex="-1" on all inactive tab controls when it is first activated. The cursor keys activate the previous/next tab after the presently active tab gets focus, and the plugin adjusts the roaming tabindex as necessary. Note that the JavaScript plugin does not differentiate between horizontal and vertical tab lists when it comes to cursor key interactions, as the up and left cursor always navigate to the previous tab and the right and down cursor always navigate to the next tab, regardless of the orientation of the tab list.
tabindex="0"
to your HTML because the JavaScript plugin makes no attempt to manage this feature.
Using data attributes #
By just putting data-bs-toggle="tab"
or data-bs-toggle="pill"
on an element, it may activate a tab or pill navigation without writing any JavaScript. On.nav-tabs or .nav-pills
, use these data attributes.
<!-- 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">Home</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">Profile</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">Messages</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">Settings</button>
</li>
</ul>
<!-- Tab panes -->
<div class="tab-content">
<div class="tab-pane active" id="home" role="tabpanel" aria-labelledby="home-tab" tabindex="0">...</div>
<div class="tab-pane" id="profile" role="tabpanel" aria-labelledby="profile-tab" tabindex="0">...</div>
<div class="tab-pane" id="messages" role="tabpanel" aria-labelledby="messages-tab" tabindex="0">...</div>
<div class="tab-pane" id="settings" role="tabpanel" aria-labelledby="settings-tab" tabindex="0">...</div>
</div>
Via JavaScript #
Enable tabbable tabs via JavaScript (each tab needs to be activated individually):
const triggerTabList = document.querySelectorAll('#myTab button')
triggerTabList.forEach(triggerEl => {
const tabTrigger = new ux4g.Tab(triggerEl)
triggerEl.addEventListener('click', event => {
event.preventDefault()
tabTrigger.show()
})
})
You can activate individual tabs in several ways:
const triggerEl = document.querySelector('#myTab button[data-bs-target="#profile"]')
ux4g.Tab.getInstance(triggerEl).show() // Select tab by name
const triggerFirstTabEl = document.querySelector('#myTab li:first-child button')
ux4g.Tab.getInstance(triggerFirstTabEl).show() // Select first tab
Fade effect #
To make tabs fade in, add .fade
to each
.tab-pane
. The first tab pane must also have
.show
to make the initial content visible.
<div class="tab-content">
<div class="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab" tabindex="0">...</div>
<div class="tab-pane fade" id="profile" role="tabpanel" aria-labelledby="profile-tab" tabindex="0">...</div>
<div class="tab-pane fade" id="messages" role="tabpanel" aria-labelledby="messages-tab" tabindex="0">...</div>
<div class="tab-pane fade" id="settings" role="tabpanel" aria-labelledby="settings-tab" tabindex="0">...</div>
</div>
Methods #
Asynchronous methods and transitions ​
All API methods are asynchronous and start a transition. They return to the caller as soon as the transition is started but before it ends. In addition, a method call on a transitioning component will be ignored.
Activates your content as a tab element.
You can create a tab instance with the constructor, for example:
const bsTab = new ux4g.Tab('#myTab')
Method | Description |
---|---|
dispose |
Destroys an element’s tab. |
getInstance |
Static method which allows you to get the tab instance associated with a DOM element, you can use it like this: ux4g.Tab.getInstance(element) . |
getOrCreateInstance |
Static method which returns a tab instance associated to a DOM element or create a new one in case it wasn’t initialized. You can use it like this: ux4g.Tab.getOrCreateInstance(element) . |
show |
Shows the associated window and selects the specified tab. The related pane for any other tab that was previously selected is hidden and becomes unselected. Before the shown.bs.tab event takes place (and the tab pane is actually displayed), the function returns to the caller. |
Events #
When showing a new tab, the events fire in the following order:
hide.bs.tab
(on the current active tab)show.bs.tab
(on the to-be-shown tab)hidden.bs.tab
(on the previous active tab, the same one as for the hide.bs.tab event)shown.bs.tab
(on the newly-active just-shown tab, the same one as for the show.bs.tab event)
If no tab was already active, then the
hide.bs.tab
and hidden.bs.tab
events will not be fired.
Event type | Description |
---|---|
hide.bs.tab |
This event fires when a new tab is to be
shown
(and thus the previous active tab is to be
hidden). Use event.target and
event.relatedTarget to target
the
current active tab and the new
soon-to-be-active
tab, respectively.
|
hidden.bs.tab |
This event fires after a new tab is shown
(and
thus the previous active tab is hidden). Use
event.target and
event.relatedTarget to target
the
previous active tab and the new active tab,
respectively.
|
show.bs.tab |
This event fires on tab show, but before the
new
tab has been shown. Use
event.target and
event.relatedTarget to target
the
active tab and the previous active tab (if
available) respectively.
|
shown.bs.tab |
This event fires on tab show after a tab has
been shown. Use event.target
and
event.relatedTarget to target
the
active tab and the previous active tab (if
available) respectively.
|
const tabEl = document.querySelector('button[data-bs-toggle="tab"]')
tabEl.addEventListener('shown.bs.tab', event => {
event.target // newly activated tab
event.relatedTarget // previous active tab
})