React Tabs Components
Tabs
Limited-time offer for the first 100 customers in 2025. Use code 2025SKY25 at checkout.
The CoreUI React Tabs component provides a flexible and accessible way to create tabbed navigation in your application. It supports various styles and configurations to meet different design requirements.
Example#
The basic React tabs example uses the variant="tabs"
props to generate a tabbed interface.
Available styles#
Change the style of <CTabs>
's component with modifiers and utilities. Mix and match as needed, or build your own.
Unstyled#
If you don’t provide the variant
prop, the component will default to a basic style.
Pills#
Take that same code, but use variant="pills"
instead:
Underline#
Take that same code, but use variant="underline"
instead:
Underline border#
Take that same code, but use variant="underline-border"
instead:
Fill and justify#
Force your <CTabs>
's contents to extend the full available width one of two modifier classes. To proportionately fill all available space use layout="fill"
. Notice that all horizontal space is occupied, but not every nav item has the same width.
For equal-width elements, use layout="justified"
. All horizontal space will be occupied by nav links, but unlike the layout="fill"
above, every nav item will be the same width.
Accessibility#
Dynamic tabbed interfaces, as described in the WAI ARIA Authoring Practices, require role="tablist"
, role="tab"
, role="tabpanel"
, and additional aria-
attributes in order to convey their structure, functionality and current state to users of assistive technologies (such as screen readers).
WAI-ARIA Roles#
- The element that serves as the container for the set of tabs has the role
tablist
. - Each element that serves as a tab has the role
tab
and is contained within the element with the roletablist
. - Each element that contains the content panel for a tab has the role
tabpanel
. - If the tab list has a visible label, the element with the role
tablist
hasaria-labelledby
set to a value that refers to the labeling element. Otherwise, thetablist
element has a label provided byaria-label
. - Each element with the role
tab
has the propertyaria-controls
referring to its associatedtabpanel
element. - The active tab element has the state
aria-selected
set totrue
, and all other tab elements have it set tofalse
. - Each element with the role
tabpanel
has the propertyaria-labelledby
referring to its associatedtab
element.
Our React Tabs component automatically manages all role="..."
and aria-
attributes for accessibility. It also handles the selected state by adding aria-selected="true"
to the active tab. Additionally, you have the flexibility to manually set these attributes, as shown in the example below:
<CTabs activeItemKey={2}> <CTabList variant="tabs"> <CTab id="home-tab" aria-controls="home-tab-pane" itemKey={1}>Home</CTab> <CTab id="profile-tab" aria-controls="profile-tab-pane" itemKey={2}>Profile</CTab> <CTab id="contact-tab" aria-controls="contact-tab-pane" itemKey={3}>Contact</CTab> <CTab id="disabled-tab" aria-controls="disabled-tab-pane" disabled itemKey={4}>Disabled</CTab> </CTabList> <CTabContent> <CTabPanel id="home-tab-pane" className="p-3" aria-labelledby="home-tab-pane" aria-labelledby="home-tab" itemKey={1}> Home tab content </CTabPanel> <CTabPanel id="profile-tab-pane" className="p-3" aria-labelledby="profile-tab-pane" aria-labelledby="profile-tab" itemKey={2}> Profile tab content </CTabPanel> <CTabPanel id="contact-tab-pane" className="p-3" aria-labelledby="contact-tab-pane" aria-labelledby="contact-tab" itemKey={3}> Contact tab content </CTabPanel> <CTabPanel id="disabled-tab-pane" className="p-3" aria-labelledby="disabled-tab-pane" aria-labelledby="disabled-tab" itemKey={4}> Disabled tab content </CTabPanel> </CTabContent></CTabs>
This example demonstrates how to manually set aria-selected
, aria-controls
, and aria-labelledby
attributes on your <CTab>
's and <CTabPanels>
's.
Keyboard Interaction#
When focus enters the tab list:
Tab: It places focus on the active tab
element.
When focus is on a tab element:
Tab: Moves focus to the next element in the tab sequence, typically the tabpanel unless the first focusable element inside the tabpanel is found earlier.
Left Arrow: Moves focus to the previous tab. If on the first tab, it wraps around to the last tab.
Right Arrow: Moves focus to the next tab. If on the last tab, it wraps around to the first tab.
Home: Moves focus to the first tab.
End: Moves focus to the last tab.
API#
Check out the documentation below for a comprehensive guide to all the props you can use with the components mentioned here.