Anything you need is set needed data-attributes.
- data-tabs - main container
- data-triggers - container for header
- data-body - container for content
- data-id - unique identificator
Also need link with attribute href with set unique identificator.
new class Tabs { | |
constructor() { | |
this.$wrapper; | |
this.$triggers; | |
this.$body; | |
this.init(); | |
} | |
init() { | |
document.querySelectorAll('[data-tabs]').forEach((wrapper) => { | |
this.$wrapper = wrapper; | |
this.$triggers = [...wrapper.querySelector('[data-triggers]').children]; | |
this.$body = [...wrapper.querySelector('[data-body]').children]; | |
this.$triggers[0].classList.add('active'); | |
this.$body[0].classList.add('active'); | |
this.update(); | |
this.addListenerClick(); | |
this.addListenerHash(); | |
}); | |
} | |
update(event) { | |
const trigger = this.$wrapper.querySelector(`a[href="${window.location.hash}"]`); | |
const content = this.$wrapper.querySelector(`[data-id="${window.location.hash}"]`); | |
if (window.location.hash && trigger && content) { | |
this.$triggers.forEach((trigger) => { | |
trigger.classList.remove('active'); | |
}); | |
this.$body.forEach((content) => { | |
content.classList.remove('active'); | |
}); | |
trigger.classList.add('active'); | |
content.classList.add('active'); | |
} | |
sessionStorage.setItem("last-url", event?.oldURL); | |
} | |
addListenerClick() { | |
this.$triggers.forEach(trigger => { | |
trigger.addEventListener('click', this.changeTab.bind(this)); | |
}); | |
} | |
addListenerHash() { | |
window.addEventListener('hashchange', this.update.bind(this)); | |
} | |
changeTab(event) { | |
event.preventDefault(); | |
const trigger = event.target.closest('a[href^="#"]'); | |
const content = this.$wrapper.querySelector(`[data-id="${trigger.hash}"]`); | |
this.$triggers.forEach(trigger => { | |
trigger.classList.remove('active'); | |
}); | |
this.$body.forEach(content => { | |
content.classList.remove('active'); | |
}); | |
trigger.classList.add('active'); | |
content.classList.add('active'); | |
history.replaceState(undefined, undefined, trigger.hash) | |
} | |
}; |
<div class="example__tabs" data-tabs> | |
<div class="example__triggers" data-triggers> | |
<a href="#content-1" class="example__tab"> | |
Tab 1 | |
</a> | |
<a href="#content-2" class="example__tab"> | |
Tab 2 | |
</a> | |
</div> | |
<div class="example__body" data-body> | |
<div class="example__content" data-id="#content-1"> | |
Content 1 | |
</div> | |
<div class="example__content" data-id="#content-2"> | |
Content 2 | |
</div> | |
</div> | |
</div> |
.example__tab { | |
&.active { | |
text-decoration: underline; | |
} | |
} | |
.example__content { | |
display: none; | |
&.active { | |
display: block; | |
} | |
} |
Anything you need is set needed data-attributes.
Also need link with attribute href with set unique identificator.