Skip to content

Instantly share code, notes, and snippets.

@ImKubass
Last active April 17, 2023 03:27
Show Gist options
  • Save ImKubass/9df6e3f2e167a47a26780ae5a26101ea to your computer and use it in GitHub Desktop.
Save ImKubass/9df6e3f2e167a47a26780ae5a26101ea to your computer and use it in GitHub Desktop.
Abstract tabs handle
const tabsGroup = document.querySelectorAll(".js-tabs")
tabsGroup.forEach(tabGroup => {
const tabItems = tabGroup.querySelectorAll(".js-tabs__tab-item")
const panels = tabGroup.querySelectorAll(".js-tabs__panel")
const closeAllPanels = () => panels.forEach(content => content.classList.remove("--active"))
const resetAllTabItems = () => tabItems.forEach(link => link.classList.remove("--active"))
tabItems.forEach(tabItem => {
tabItem.addEventListener("click", (event) => {
event.preventDefault()
if (tabItem.classList.contains("--active")) return
const targetId = tabItem.getAttribute("data-tab-target") ?? ""
const targetPanel = tabGroup.querySelector(`[data-panel-id="${targetId}"]`)
if (targetPanel === null) return
closeAllPanels()
resetAllTabItems()
targetPanel.classList.add("--active")
tabItem.classList.add("--active")
})
})
})
@ImKubass
Copy link
Author

ImKubass commented Apr 17, 2023

<div class="js-tabs">

  <div>
    <div class="js-tabs__tab-item --active" data-tab-target="panel-1">One</div>
    <div class="js-tabs__tab-item" data-tab-target="panel-2">Two</div>
    <div class="js-tabs__tab-item" data-tab-target="panel-3">Three</div>
  </div>

  <div>
    <div class="js-tabs__panel --active" data-panel-id="panel-1">my content</div>
    <div class="js-tabs__panel" data-panel-id="panel-2">my content 2</div>
    <div class="js-tabs__panel" data-panel-id="panel-3">my content 3</div>
  </div>

</div>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment