How do we make an additional TAB navigation on JS?



  • The TABs have been implemented in a net JS, but additional navigation on TABs from LINK elements is required, as in the example below. Tell me what you missed, tried different options. I'd do jQuery, but I'm trying to make JS work.

    const tabLinks = document.querySelectorAll('.item'),
          tabContent = document.querySelectorAll('.panel'),
          tabActive = 'active';
    

    [].forEach.call(tabLinks, (el) => {
    el.addEventListener('click', openTabs);
    });

    function openTabs(el) {
    let btnTarget = el.currentTarget,
    idTab = btnTarget.dataset.tab;

    [].forEach.call(tabContent, (el) => {
    el.classList.remove(tabActive);
    });

    [].forEach.call(tabLinks, (el) => {
    el.classList.remove(tabActive);
    });

    document.querySelector("#" + idTab).classList.add(tabActive);

    btnTarget.classList.add(tabActive);
    }

    .flex {
    width: 300px;
    padding-left: 0;
    display: flex;
    list-style: none;
    justify-content: space-between;
    }

    .item.active {
    color: red
    }

    .panel:not(.active) {
    display: none;
    }

    <ul class="flex">
    <li>LINK 1</li>
    <li>LINK 2</li>
    <li>LINK 3</li>
    </ul>

    <hr>
    <br>
    <br>

    <div class="flex">
    <div class="item active" data-tab="tab-1">TAB item 1</div>
    <div class="item" data-tab="tab-2">TAB item 2</div>
    <div class="item" data-tab="tab-3">TAB item 3</div>
    </div>

    <hr>

    <div class="panel active" id="tab-1">Tab content 1</div>
    <div class="panel" id="tab-2">Tab content 2</div>
    <div class="panel" id="tab-3">Tab content 3</div>



  • If there is a quantity <li>.item and .panel Equally, all collections of these elements to the masses can be brought and managed by indexes:

    const tabLi = [...document.querySelectorAll('li')],
      tabLinks = [...document.querySelectorAll('.item')],
      tabContent = [...document.querySelectorAll('.panel')],
      tabActive = 'active';
    

    tabLinks.forEach((el, i) => {
    el.addEventListener('click', openTabs);
    tabLi[i].addEventListener('click', function() {
    tabLinks[tabLi.indexOf(this)].click();
    });
    });

    function openTabs(ev) {
    tabContent.forEach((el, i) => {
    el.classList.remove(tabActive);
    tabLi[i].classList.remove(tabActive);
    tabLinks[i].classList.remove(tabActive);
    });
    document.querySelector("#" + this.dataset.tab).classList.add(tabActive);
    this.classList.add(tabActive);
    tabLi[tabLinks.indexOf(this)].classList.add(tabActive);
    }

    .flex {
    width: 300px;
    padding-left: 0;
    display: flex;
    list-style: none;
    justify-content: space-between;
    }

    li.active,
    .item.active {
    color: red
    }

    .panel:not(.active) {
    display: none;
    }

    <ul class="flex">
    <li class="active">LINK 1</li>
    <li>LINK 2</li>
    <li>LINK 3</li>
    </ul>

    <hr><br><br>

    <div class="flex">
    <div data-tab="tab-1" class="item active">TAB item 1</div>
    <div data-tab="tab-2" class="item">TAB item 2</div>
    <div data-tab="tab-3" class="item">TAB item 3</div>
    </div>

    <hr>

    <div id="tab-1" class="panel active">Tab content 1</div>
    <div id="tab-2" class="panel">Tab content 2</div>
    <div id="tab-3" class="panel">Tab content 3</div>



Suggested Topics

  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2