• author: Kevin Powell

Introduction: The Ubiquitous Nature of Tabs on the Web

Tabs have become a common feature on websites across the internet. Whether you're shopping or simply browsing, you're likely to encounter tabs in various forms. They are widely used by big-box stores and even popular platforms like YouTube, which utilize top-aligned tabs for easy navigation. Tabs come in different styles, such as the traditional horizontal tabs that we are familiar with, as well as vertical tabs and carousel/tab combinations.

The Disadvantages of Tabs

While tabs have their uses, it's important to consider their drawbacks before incorporating them into a website. One significant disadvantage is that tabs hide information from users and force them to cycle through content. This can be frustrating and may not provide the best user experience. Auto-playing tabs can be particularly problematic, as they attempt to guide users through content forcefully. Additionally, tabs can be challenging to use and may not always be recognized as an interactive element.

Furthermore, tabs often provide little to no value to a website. Canadian Tire, a big-box store, serves as an example of how tabs can be redundant. An examination of their website reveals that tabs labeled "features" and "specifications" essentially contain the same information. This redundancy suggests that tabs are not always necessary and might not add any value to a website.

Considerations Before Using Tabs

Before incorporating tabs into your project, it is essential to assess whether they are needed. Tabs can potentially hinder information accessibility, contradicting the inherent advantage of the web, which allows users to scroll and browse through content effortlessly. Therefore, it is wise to ponder the necessity of tabs and their actual benefits to ensure they serve a purpose.

Implementing Tabs Strategically and Effectively

However, despite the potential shortcomings of tabs, there may be situations that necessitate their utilization. If you find yourself tasked with creating tabs or your designers have presented you with a design that includes tabs, it is crucial to approach their implementation correctly. In the following sections, we will explore how to create a tab system that is user-friendly and offers a smooth browsing experience.

Building the Tab Structure

To begin, we need to establish the basic structure of the tabs. At the heart of our tab system is a div element with the class tab-container. Here, we will house our tabs and their associated content panels. The tabs themselves will be represented by a list (ul), and the content panels will be represented by individual div elements.

It is important to note that the example presented here uses links within a list instead of buttons. Initially, buttons seemed like a more logical choice for an interactive element. However, after consulting with Hayden Pickering, who provided valuable insights on tab creation, I opted for links instead. This decision was made with progressive enhancement in mind, ensuring that if JavaScript fails to load, the tabs will still function as intended by leveraging the hyperlinking capability.

Styling and Enhancing the Tab System

At its current state, the tab system does not possess any elaborate styling, except for basic aesthetic alterations such as color changes. However, the structure itself is fully functional. Clicking on a tab heading will navigate the user to the corresponding content panel, providing a seamless browsing experience.

Once we have attained a functional tab system based on progressive enhancement, we can proceed to enhance its aesthetics. By adding styles to the tabs, we can give them the appearance of a more traditional tab system. Furthermore, we can explore creating distinct styles for situations where JavaScript is enabled and when it is not, thus accommodating different scenarios.

Implementing a Tab System with JavaScript

One common UI element found on many websites is a tab system. Tabs allow users to navigate between different sections or pages of content within a single container. In this article, we will explore how to create a tab system using JavaScript.

Getting Started

Before diving into the JavaScript code, let's set up the HTML structure for our tab system. We need a container (tab-container), a list of tab buttons (tab-list), and corresponding content panels (tab-panels).

<divclass="tab-container"><ulclass="tab-list"><li><ahref="#tab-1">Tab 1</a></li><li><ahref="#tab-2">Tab 2</a></li><li><ahref="#tab-3">Tab 3</a></li></ul><divclass="tab-panels"><divid="tab-1"><p>Content for Tab 1</p></div><divid="tab-2"><p>Content for Tab 2</p></div><divid="tab-3"><p>Content for Tab 3</p></div></div></div>

Note that we have assigned unique IDs to each content panel for easy referencing in the JavaScript code.

Hiding Tab Content

To start, let's focus on hiding the tab content initially and ensuring that only the active tab's content is visible when a user interacts with the tabs.

In JavaScript, we can select the necessary elements using the querySelector method and store them in variables for later use.

consttabContainer=document.querySelector('.tab-container');consttabButtons=document.querySelectorAll('.tab-list li');consttabPanels=document.querySelectorAll('.tab-panels div');

Now, let's loop through the tab buttons and their corresponding panels to apply logic for hiding and showing the content.


By default, we hide all the tab buttons except for the first one (index = 0) and add a hidden class to all but the first tab panel. This ensures that only the content for the active tab is visible when the page loads. Additionally, we add the hidden attribute to the button elements to remove them from the accessibility tree.

Making Tabs Clickable

Now that we have hidden the inactive tab content, let's make the tabs clickable so that when a user clicks on a tab, the corresponding content becomes visible.

To achieve this, we need to add an event listener to the tab container and prevent the default behavior when a click event occurs.

tabContainer.addEventListener('click',(e)=>{e.preventDefault();constclickedTab=e.target.closest('a');if(!clickedTab)return;// Logic to show the clicked tab's content});

By using event delegation, we can bind the event listener to the container rather than individual tab buttons. This allows us to capture clicks on any part of the container, making the code more efficient.

Inside the event listener, we first check if the clicked element is a tab button (<a>). If not, we exit the function and do nothing.

Now, we need to implement the logic to show the content for the clicked tab while hiding the content for other tabs. We can achieve this by manipulating the CSS classes of the tab panels.


In the above code, we iterate over each tab button and compare it with the clicked button. If there's a match, we remove the hidden attribute from the button and remove the hidden class from the corresponding panel to make it visible. For the non-matching buttons and panels, we hide them as before.

Enhancing Tabbed Navigation with JavaScript

In this section, we will explore how to enhance tabbed navigation using JavaScript to make it more interactive and accessible. We will start by adding functionality to prevent default browser behavior when clicking on tabs.

Preventing Default Behavior

To prevent the browser from parsing unnecessary JavaScript, we can use the preventDefault method. By implementing this, we ensure that the browser only executes relevant JavaScript when a tab is clicked. As a result, other elements on the page will not be affected.

To implement this, we can add an event listener to the tabs and use the preventDefault method to stop the default behavior. After this change, clicking on the tabs will trigger the desired functionality without any unwanted side effects.

Leveraging Anchor Links

An additional advantage of implementing this improvement is that we avoid the automatic addition of the hashtag in the URL when the tabs are clicked. Previously, clicking on a tab would result in the hashtag being added to the address bar. While this behavior is necessary for anchor links, it is unnecessary for tabs.

By preventing the default behavior, we eliminate this issue entirely. As a result, the URL remains unchanged, but we maintain access to the tabs, allowing us to use their associated IDs for further JavaScript manipulations.

Activating the Desired Panel

To ensure that the correct panel is displayed when a tab is clicked, we need to modify our JavaScript code. This modification involves extracting the clicked tab's href attribute, which corresponds to the ID of the panel we want to activate.

By using this information, we can locate the corresponding panel and update its visibility state accordingly. We accomplish this by selecting the tabs container and iterating over each panel, setting their visibility to hidden. We then remove the hidden attribute from the active panel, making it visible.

To maintain clean and manageable code, it is advisable to create a separate function called switchTab that handles this functionality. By encapsulating the switching logic, we can easily extend it without cluttering the main code.

Improving Keyboard Navigation and Accessibility

While the current implementation is functional, it lacks proper keyboard navigation and accessibility support. Currently, pressing the Tab key cycles through the different tabs, which contradicts accessibility guidelines. According to the Web Content Accessibility Guidelines (WCAG), users should navigate through tabs using arrow keys instead of Tab.

To address this, we need to enhance our JavaScript code further. By modifying our code to adhere to WCAG standards, we ensure a more consistent and user-friendly experience for keyboard users.

To achieve this, we need to add additional keyboard event handlers to navigate between tabs using the arrow keys. This enhancement will offer users better control over their tabbed navigation experience and enable them to seamlessly access content without losing their context.

Incorporating ARIA Roles for Enhanced Accessibility

To enhance the accessibility of our tabbed navigation, we can utilize ARIA roles. ARIA (Accessible Rich Internet Applications) roles provide additional information to assistive technologies, enabling users with disabilities to interact effectively with our interface.

While semantic HTML is generally sufficient for building accessible interfaces, interactive components like tabs often require additional ARIA roles. These roles help convey the intended behavior and provide more clarity to assistive technology users.

It may be challenging to determine the appropriate ARIA roles to use, but resources like the WCAG guidelines and online accessibility community discussions can provide valuable insights. By researching and learning from existing solutions, we can ensure that our tabbed navigation is accessible and inclusive.

Creating Accessible Tabs with Automatic Navigation

Tabs are a commonly used component in web design to organize content and improve user experience. However, it's important to consider accessibility when implementing tabs. In this article, we will discuss how to create accessible tabs with automatic navigation.

1. Avoid Third-Party Tools

When making a website accessible, it's crucial to avoid using third-party tools that force accessibility features. Instead, take the time to learn about accessible design principles. Although it may require some effort initially, learning HTML, CSS, and JavaScript for accessibility purposes will become second nature with practice.

2. Automatic Tabs vs. Manual Tabs

Before creating the tabs, it's essential to decide whether they should have automatic or manual navigation. In automatic tabs, the focus automatically shifts to the selected tab when navigating with a keyboard. On the other hand, manual tabs require users to cycle through different tabs using the keyboard and click on the desired tab. In this article, we will focus on implementing automatic tabs with the option to switch to manual tabs if needed.

3. Setting Tab List Attributes

To begin creating the tabs, we need to set the appropriate attributes. In this case, we will start by setting the "role" attribute on the tab list to "tablist". This role informs assistive technologies that the container is a tablist component.

<ulrole="tablist"><!-- Tab list items --></ul>

4. Transforming List Items to Tabs

Next, we need to transform the list items into tabs. To achieve this, we will remove the semantic meaning of the li elements and add tab semantics to the links within them. There are two steps involved in this process.

First, we will update the role of the list items to "presentation" to remove their semantics. This can be done using JavaScript as shown below:


Secondly, we will add the tabindex attribute with a value of -1 to the links within the list items. This is done to exclude the links from the regular tab order and allow keyboard or arrow key navigation through the tabs. Here's an example:

consttabLinks=document.querySelectorAll('li a');tabLinks.forEach(link=>{link.setAttribute('tabindex','-1');});

5. Setting Tab Panels Attributes

To complete the tab creation process, we also need to set attributes for the tab panels. In this case, we will set the tabindex attribute of the tab panels to 0. This ensures that users can navigate directly to the content of the selected tab using the keyboard.

<divid="tab1"tabindex="0"><!-- Content of the first tab panel --></div>

6. Testing and Usability Considerations

When implementing tabs, it's essential to conduct thorough testing to ensure a seamless and intuitive user experience. While following the best practices, it's important to anticipate how users will interact with the tabs and validate that the navigation and content are accessible.

Overall, by understanding the principles of accessible design and following the steps outlined in this article, you can create an accessible and user-friendly tab component for your website. Remember to prioritize accessibility to ensure inclusivity and a positive experience for all users.

Note: The examples and code snippets in this article are simplified for illustration purposes. For more detailed information, the linked resources provide in-depth explanations of accessible tabs.

Best Practices for Building Accessible Tabs

Tabs are a popular way to organize content on websites and applications, but it is essential to ensure that they are accessible to all users. While following best practices is a good starting point, testing and user feedback are crucial to ensure a seamless and user-friendly experience. In this article, we will explore the suggested approach for building accessible tabs and discuss the importance of collaboration and user testing.

Collaborating with Accessibility Experts

When working on projects with accessibility requirements, it is important to seek assistance from experts in the field. Collaborating with individuals who specialize in accessibility can significantly enhance the quality and usability of your tabs. Hayden and Amber, who have expertise in accessibility and WordPress, provided valuable insights and assistance during the development process. Their knowledge and experience contributed to making this project more accessible and user-friendly.

User Testing and Screen Readers

To ensure the accessibility of tabs, it is crucial to test them thoroughly with a focus on screen reader interaction. Screen readers are software programs that audibly present the content to users with visual impairments. Amber provided valuable assistance by recording interactions with screen readers, showcasing the functionality and usability of the tabs. Such testing helps identify any issues or areas for improvement and ensures that the tabs are compatible with various assistive technologies.

The Role of Area Controls

One aspect that came up during discussions with Hayden was the use of area controls on links within the tabs. Originally, the links were accompanied by buttons with area controls. However, it was discovered that area controls did not provide the expected benefits. While they used to announce the relationship between the button and its corresponding feature, it was deemed unnecessary and even hindering to user experience. Consequently, there have been ongoing discussions within the accessibility community regarding the usage of area controls. It is crucial to stay updated with the latest best practices and ongoing discussions to ensure the most accessible implementation.

Importance of Collaboration and User Testing

Building accessible tabs requires not only following guidelines but also engaging in discussions with experts and testing with the intended audience. Collaborating with accessibility specialists and seeking user feedback throughout the development process significantly improves the accessibility and usability of the tabs. User testing allows for real-world scenarios and feedback, helping to identify potential challenges and suggest alternative approaches. Incorporating these suggestions and insights results in a more user-friendly and accessible end product.

Enhancing Functionality with Semantic CSS and JavaScript

In this section, we will discuss how we can enhance the functionality of our tab system using semantic CSS selectors and JavaScript. We will start by styling the tab list, followed by adding functionality to switch between tabs using keyboard navigation.

Styling the Tab List

To style the tab list, we can select the tab list based on its role attribute. If the role is equal to tablist, we can apply the following CSS properties to it:

  • list-style: none to remove the bullet points
  • display: flex to make the tabs appear next to each other
  • margin: 0 to remove any margin
  • padding: 0 to remove any padding
  • gap: 1rem to create some space between the tabs

Additionally, we can style the selected tab by setting the area-selected attribute to true. For example, we can add the following CSS properties to the selected tab:

  • text-decoration-thickness: 0.5rem to make the underline thicker
  • text-underline-offset: 0.5rem to move the underline down
  • color: orange-red to make the text stand out

It's important to note that these styles are only applied if JavaScript is loaded, ensuring progressive enhancement.

Adding Keyboard Navigation Functionality

To enable keyboard navigation between tabs, we will create two functions: moveLeft and moveRight. These functions will determine the currently active tab and move the focus accordingly.

To determine the active tab, we can use the currentActiveElement property, which gives us the element currently in focus. This property assumes that the user is actively interacting with the tab system.

In the moveLeft function, we will check the currently active tab and move the focus to the previous tab. Similarly, in the moveRight function, we will move the focus to the next tab.

By separating the tab switching functionality from the click event listener, we can reuse these functions for keyboard navigation.

Providing Additional Context with Aria Attributes (optional)

To provide additional context for users interacting with the tab system, we can use Aria attributes. For example, we can add an aria-describedby attribute to each tab button, pointing to a hidden <div> that contains a description.

The hidden <div> can include text such as "Press tab to move to the tab panel," giving users a better understanding of how to interact with the system. This extra hint can be beneficial for users who use screen readers or have low vision.

It's important to consider the potential impact on screen reader users when adding extra information, as it may lengthen the interactions and affect usability. Therefore, thorough testing and consideration for internationalization should accompany the use of Aria attributes.

Implementing Keyboard Navigation for Tab Navigation

As mentioned earlier, we will now focus on implementing keyboard navigation for the tab navigation. This will allow users to navigate through the tabs using their arrow keys, as well as the Home and End keys.

Moving Left and Right

To begin, we want to ensure that when the user presses the Left arrow key, the tab selection moves to the previous tab. Similarly, when the user presses the Right arrow key, the tab selection moves to the next tab.

To achieve this, we will create two distinct functions - moveLeft and moveRight. These functions will be triggered whenever the respective arrow key is pressed.

The moveLeft Function

The moveLeft function is responsible for moving the tab selection to the left. When the user presses the Left arrow key, the function will find the previous tab and activate it.

To accomplish this, the function utilizes DOM traversal to locate the previous tab's link element. Here's how it works:

  1. Get the current tab's parent element.
  2. Find the previous sibling element.
  3. Locate the link element within the previous sibling element.
  4. Activate the new tab through the switchTab function.

Implementing this functionality allows the user to cycle through the tabs in a counter-clockwise manner. However, it is important to note that this functionality should only apply when the current tab is not the first one. In other words, if the user is on the first tab and presses the Left arrow key, the focus should move to the last tab instead of the previous tab.

To address this, we introduce a conditional statement that checks if there is a previous sibling element. If there isn't one, it means that the current tab is the first tab, and we want to cycle to the last tab instead. By using the switchTab function and obtaining the index of the last tab, we ensure that the focus moves to the correct tab.

The moveRight Function

Similarly, the moveRight function handles moving the tab selection to the right. When the user presses the Right arrow key, the function will find the next tab and activate it.

To accomplish this, the function relies on DOM traversal to locate the next tab's link element. The process works as follows:

  1. Get the current tab's parent element.
  2. Find the next sibling element.
  3. Locate the link element within the next sibling element.
  4. Activate the new tab through the switchTab function.

Just like with the moveLeft function, we need to consider the scenario where the current tab is the last tab. In this case, we want the focus to move to the first tab. By incorporating a conditional statement that checks for the presence of a next sibling element, we can redirect the focus to the first tab instead of to a non-existent next tab.

Implementing Keyboard Event Listeners

Now that we have created the moveLeft and moveRight functions, we can set up the appropriate event listeners to trigger these functions when the corresponding arrow keys are pressed.

We will add a keydown event listener to the tabsContainer element. This event listener will only respond to keydown events that occur within the tabsContainer. This ensures that our keyboard navigation is active only when the user is actively interacting with the tab navigation.

Extending Keyboard Navigation

In addition to the Left and Right arrow keys, we can enhance the keyboard navigation experience by including the Home and End keys. These keys will allow the user to jump directly to the first and last tabs, respectively.

To implement this functionality, we will extend the switch statement within the event listener to include case statements for each of the keys we want to handle - Left arrow, Right arrow, Home, and End. For each case, we will call the corresponding function (moveLeft, moveRight, switchTab) to perform the desired action.

Verifying the Functionality

To verify that the keyboard navigation is working as intended, we can test it by clicking on a tab and pressing the appropriate arrow keys. This should result in the tab selection moving accordingly.

It is important to note that during testing, you might encounter situations where the tab selection appears to be stuck. This is often caused by the focus not shifting to the new tab. To rectify this, we include a line of code that ensures the new tab gains focus after it is activated.

With the implementation of these keyboard navigation features, users will have a more accessible and efficient way of interacting with the tab navigation.

Implementing Keyboard Navigation in Tabs with Accessibility and Progressive Enhancement in Mind

In this article, we will explore how to enhance the functionality of tabs by implementing keyboard navigation, with a focus on accessibility and progressive enhancement. Tabs are commonly used in web applications to organize content and provide users with an intuitive way to navigate between different sections. However, without proper keyboard navigation, these tabs can be difficult to use for individuals with disabilities or those who rely on keyboard input.

Handling Key Events

To implement keyboard navigation in tabs, we need to listen for key events and respond accordingly. By using JavaScript, we can capture the key that the user pressed and perform specific actions based on that key.

To begin, we can capture the key event by using the keydown event listener. By doing so, we can retrieve the key code for the pressed key. Each key has an individual number assigned to it, known as the key code. For example, pressing the letter "A" would result in a key code of 65. To retrieve the key code, we can access the keyCode property of the keyboard event object.


Mapping Keys to Actions

Once we have captured the key code, we can map specific keys to perform certain actions. For example, if the user presses the left arrow key, we can move to the previous tab, while pressing the right arrow key will take us to the next tab.

To achieve this, we can use a switch statement to match the key code to the desired action. For instance, if the key code matches the left arrow key code (37), we can move the selection to the previous tab. To do this, we can use JavaScript to change the focus or visibility of the respective tab.

switch(keyCode){case37:// Left arrow key// Move selection to previous tabbreak;case39:// Right arrow key// Move selection to next tabbreak;}

Furthermore, to prevent unintended scrolling of the page when the user presses the home or end keys, we can add an event.preventDefault() to the corresponding cases. By doing so, we can ensure that the page does not scroll when the home or end keys are triggered.

Enhancing User Experience

In addition to keyboard navigation, it is crucial to consider user experience when implementing tabs. One way to enhance user experience is by styling the tabs based on their roles. By adding different classes or styles depending on the active tab, we can provide visual cues to users and indicate which tab is currently selected.

Another important aspect is responsiveness. Tabs can sometimes present challenges on narrower screens or when there are too many tabs to fit within the available space. In such cases, it is essential to provide alternative navigation options or collapse the tabs into a menu structure.

While tabs may have their disadvantages, there are instances where they can serve a purpose on a website. by considering the drawbacks and critically evaluating the need for tabs, one can make an informed decision regarding their implementation. should the need for tabs arise, following the steps outlined in this article will ensure the creation of an effective and user-friendly tab system.
In this part of the article, we learned how to implement a basic tab system using javascript. we covered hiding tab content, making the tabs clickable, and showing the corresponding content for the clicked tab. by progressively enhancing the experience, we can ensure that the tab system functions even if javascript is disabled.

in the next part of this article, we will explore how to style the tab system to make it visually appealing. stay tuned for more!
Enhancing tabbed navigation with javascript allows us to create a more interactive and accessible user experience. by preventing default behavior, leveraging anchor links, and incorporating aria roles, we can improve the functionality and usability of our tabs. however, it is crucial to consider accessibility guidelines and user feedback to ensure our implementation aligns with best practices. with proper enhancements, we can build tabbed navigation systems that are both visually appealing and usable for all users.
In conclusion, building accessible tabs requires a combination of following best practices, collaborating with accessibility experts, and involving user testing. engaging in discussions with specialists, seeking user feedback, and conducting thorough testing significantly enhance the accessibility and usability of tabs. whether you have access to resources or not, it is essential to explore available guidelines, follow relevant discussions, and learn from experts to improve your understanding of accessibility. by prioritizing accessibility from the initial stages of development, you can create tabs that are not only visually appealing but also fully accessible to all users.
By combining semantic css selectors and javascript, we can enhance the functionality of our tab system. we have styled the tab list and added keyboard navigation capabilities. additionally, we explore the option of providing extra context using aria attributes.

the next step is to implement the tab switching functionality for keyboard navigation. this will allow users to navigate between tabs using arrow keys and have a seamless user experience across different interaction methods.

Implementing keyboard navigation in tabs is essential for ensuring accessibility and a positive user experience. By capturing key events and mapping them to specific actions, users can navigate through tabs easily using their keyboard. Additionally, by considering the role of each tab and providing responsiveness, we can further enhance the usability and functionality of tabs on various devices.

While this article has focused on the technical implementation of keyboard navigation in tabs, it is equally important to consider accessibility and progressive enhancement throughout the development process. By prioritizing these principles, we can create web applications that are inclusive and user-friendly.

Remember, tabs should be used judiciously, considering the context and requirements of the project. If tabs are necessary, it is crucial to implement them properly, following the guidelines discussed in this article.

For more accessibility-related tips and tricks, you may also want to check out our video on implementing a simple accessibility fix known as "skip to main." This fix is relatively easy to implement and can greatly improve the accessibility of your website.

Finally, we would like to express our gratitude to our patrons and fellow developers who support us in making the internet a more accessible and awesome place. Thank you!

Until next time, let's continue making the web a little bit more awesome!

Previous Post

Exploring the Exciting Features of Figma's Dev Mode

Next Post

Search Buzz Video Recap: Volatile Google Search Results, AI for SEO, and More

About The auther

New Posts

Popular Post