<div class="js-tab__init">
<div class="item js-tab__item active" data-tab-item="content-1">
Филиалы
</div>
<div class="item js-tab__item" data-tab-item="content-2">
Проекты
</div>
<div class="item js-tab__item" data-tab-item="content-3">
Общие вопросы
</div>
<div class="panel js-tab__panel show" data-tab-panel="content-1">
content 1
</div>
<div class="panel js-tab__panel" data-tab-panel="content-2">
Content 2
</div>
<div class="panel js-tab__panel" data-tab-panel="content-3">
This content 3
</div>
</div>
.item {
background-color: darkgray;
color: #fff;
padding: 5px;
margin-bottom: 32px;
display: inline-block;
}
.item.active {
background-color: darkred;
}
.panel:not(.show) {
display: none;
}
const $tabs = (target) => {
let tabItem = "js-tab__item",
tabItemActive = "active",
tabPanelShow = "show",
_elemTabs =
typeof target === "string" ? document.querySelector(target) : target,
_eventTabsShow;
const _showTab = function (tabsLinkTarget) {
let tabsPaneTarget, tabsLinkActive, tabsPaneShow;
tabsPaneTarget = document.querySelector(
`.js-tab__panel[data-tab-panel="${tabsLinkTarget.dataset.tabItem}"]`
);
tabsLinkActive = tabsLinkTarget.parentElement.querySelector(
"." + tabItemActive
);
tabsPaneShow = tabsPaneTarget.parentElement.querySelector(
"." + tabPanelShow
);
// если следующая вкладка равна активной, то завершаем работу
if (tabsLinkTarget === tabsLinkActive) {
return;
}
// удаляем классы у текущих активных элементов
if (tabsLinkActive !== null) {
tabsLinkActive.classList.remove(tabItemActive);
}
if (tabsPaneShow !== null) {
tabsPaneShow.classList.remove(tabPanelShow);
}
// добавляем классы к элементам (в зависимости от выбранной вкладки)
tabsLinkTarget.classList.add(tabItemActive);
tabsPaneTarget.classList.add(tabPanelShow);
document.dispatchEvent(_eventTabsShow);
};
const _switchTabTo = function (tabsLinkIndex) {
let tabsLinks = _elemTabs.querySelectorAll("." + tabItem);
if (tabsLinks.length >= 0) {
if (tabsLinkIndex > tabsLinks.length) {
tabsLinkIndex = tabsLinks.length;
}
_showTab(tabsLinks[tabsLinkIndex]);
}
};
_eventTabsShow = new CustomEvent("tab.show", { detail: _elemTabs });
if (_elemTabs) {
_elemTabs.addEventListener("click", function (e) {
let tabsLinkTarget = e.target;
// завершаем выполнение функции, если кликнули не по ссылке
if (!tabsLinkTarget.classList.contains(tabItem)) {
return;
}
_showTab(tabsLinkTarget);
});
}
return {
showTab: function (target) {
_showTab(target);
},
/* программно переключиться на 2 вкладку (2 – номер вкладки, на которую нужно перейти)
const tabCollection = $tabs('.tabs');
tabCollection.switchTabTo(2);
*/
switchTabTo: function (index) {
_switchTabTo(index);
}
};
};
// Инициализация ТАБов
$tabs(".js-tab__init");
This Pen doesn't use any external CSS resources.
This Pen doesn't use any external JavaScript resources.