Search code examples
javascripttabshideshow

How can I close the active tab with JavaScript?


I've got a list of tabs where if a user clicks on a tab for e.g. "Tab 1" then it'll show the copy that sits under this tab, and if they click on "Tab 2", the copy under this tab will show and the copy under "Tab 1" would close and so on.

This works how i want it to, but what I'm struggling with is if the user clicks on a tab i want them to be able to close the same tab. Any help on this would be appreciated.

document.querySelectorAll('.tabs-menu a').forEach(function(el) {
  el.addEventListener('click', function(event) {
    event.preventDefault();
    this.closest('.tabs-menu')
      .querySelector('.current')
      .classList.remove("current");
    this.closest('a').classList.add("current");
    document.querySelectorAll('.tab-content').forEach(function(a) {
      a.style.display = "none";
    });
    var activeTab = this.getAttribute("href");
    document.querySelector(activeTab).style.display = "block";
  });
});
.tab-content {
  display: none;
}
<ul class="tabs-menu">
  <li><a href="#tab-1">Tab 1</a></li>
  <div id="tab-1" class="current tab-content">tab 1 content</div>
  <li><a href="#tab-2">Tab 2</a></li>
  <div id="tab-2" class="tab-content">tab 2 content</div>
  <li><a href="#tab-3">Tab 3</a></li>
  <div id="tab-3" class="tab-content">tab 3 content</div>
  <li><a href="#tab-4">Tab 4</a></li>
  <div id="tab-4" class="tab-content">tab 4 content</div>
</ul>


Solution

  • I took another look at this and created the below which looks to work the way i want it to.

    var acc = document.querySelectorAll('.tabs-menu li');
    var i;
    var open = null;
    for (i = 0; i < acc.length; i++) {
      acc[i].addEventListener("click", function() {
        if (open == this) {
          open.classList.toggle("active");
          open = null;
        } else {
          if (open != null) {
            open.classList.toggle("active");
          }
          this.classList.toggle("active");
          open = this;
        }
      });
    }
    .tab-content {
      display: none;
    }
    
    .tabs-menu .active+.tab-content {
      display: block;
    }
    <ul class="tabs-menu">
      <li><a href="#tab-1">Tab 1</a></li>
      <div id="tab-1" class="tab-content">tab 1 content</div>
    
      <li><a href="#tab-2">Tab 2</a></li>
      <div id="tab-2" class="tab-content">tab 2 content</div>
    
      <li><a href="#tab-3">Tab 3</a></li>
      <div id="tab-3" class="tab-content">tab 3 content</div>
    
      <li><a href="#tab-4">Tab 4</a></li>
      <div id="tab-4" class="tab-content">tab 4 content</div>
    </ul>