I’m setting up a JS based tab navigation but somehow the Tab content doesnt show properly. The idea is to only show the Tab content of the active state.
I just want the Tab Content to show that belongs to the tab.
The Code looks like this:
function setupTabs () { document.querySelectorAll(`.tabs_button`).forEach(button => { button.addEventListener('click', () => { const sideBar = button.parentElement; let tabsContainer; tabsContainer = document.querySelector(`section`); const tabNumber = button.dataset.forTab; const tabToActivate = tabsContainer.querySelector(`.tabs_content[data-tab='${tabNumber}']`); sideBar.querySelectorAll('.tabs_button').forEach(button => { button.classList.remove("tabs_button--active"); }); tabsContainer.querySelectorAll(`.tabs_content`).forEach(tab => { tab.classList.remove("tab_content--active"); }); button.classList.add("tabs_button--active") tabToActivate.classList.add("tabs_content--active") }); }); } document.addEventListener('DOMContentLoaded', () => { setupTabs(); });
* {box-sizing: border-box} .wrapper{ display: grid; grid-template-columns: 150px 1fr; border:1px solid #cccccc; padding: 15px; margin: 0 auto; grid-template-areas: 'nav main ' 'nav main' } .tabs_sidebar { grid-area: nav; display: flex; flex-direction: column; background: #cccccc; } section { display: flex; flex-direction: row; flex-shrink: 0; min-height: 400px; } .tabs_content { grid-area: main; background: #f6e3e3; padding-left: 15px; font-size: 1rem; display: none; } .tabs_button { display: block; padding: 10px; background: #eeeeee; border: none; width: 100%; outline: none; cursor: pointer; font-size: 1rem; } .tabs_button:active { background: #dddddd; } .tabs_button:not(:last-of-type){ border-bottom: 1px solid #cccccc; } .tabs_button--active { font-weight: bold; border-right: 3px solid #009879; background: #dddddd; } .tabs_content--active { display: block; }
<div class="wrapper"> <nav class="tabs_sidebar"> <button class="tabs_button tabs_button--active" data-for-tab="1">Tab #1</button> <button class="tabs_button" data-for-tab="2">Tab #2</button> <button class="tabs_button" data-for-tab="3">Tab #3</button> </nav> <section id="main_con" class="tabs_content tabs_content--active"> <div class="tabs_content tabs_content--active" data-tab="1"> <h2>Tab #1</h2> <p>Lorem ipsum dolor sit amet, </p> </div> <div class="tabs_content" data-tab="2"> <h2>Tab #2</h2> <p>Nunc vel risus </p> </div> <div class="tabs_content" data-tab="3"> <h2>Tab #3</h2> <p>Lorem ipsum dolor </p> </div> </section> </div>
I cannot find the error. Any help is much appreciated.
merci in advance
A
Advertisement
Answer
Please notice that you have a typo.
You can modify this line:
tab.classList.remove("tab_content--active");
to this:
tab.classList.remove("tabs_content--active");
and it will work as expected for toggling the xxxx-active class for the clicked button and its corresponding data tab.