Как сделать бокове меню с помощью
Есть левые и правые колонки. На мобильной версии боковое меню, с помощью которой происходит переключение, дожно превращается в подобие выпадающего меню, как на картинке.
В моем коде js вроде работает, но нужно сделать так, чтобы выбранный элемент не отображался в списке, при выборе.
let tabs = document.querySelectorAll("._tabs");
for (let index = 0; index < tabs.length; index++) {
let tab = tabs[index];
let tabs_items = tab.querySelectorAll(".sidebar__item");
let tabs_blocks = tab.querySelectorAll("._tabs-block");
for (let index = 0; index < tabs_items.length; index++) {
let tabs_item = tabs_items[index];
tabs_item.addEventListener("click", function(e) {
for (let index = 0; index < tabs_items.length; index++) {
let tabs_item = tabs_items[index];
tabs_item.classList.remove('_active');
tabs_blocks[index].classList.remove('_active');
}
tabs_item.classList.add('_active');
tabs_blocks[index].classList.add('_active');
e.preventDefault();
});
}
}
let select = function() {
let selectHeader = document.querySelectorAll('.sidebar__item-mobile');
let selectItem = document.querySelectorAll('.sidebar__item');
selectHeader.forEach(item => {
item.addEventListener('click', selectToggle)
});
selectItem.forEach(item => {
item.addEventListener('click', selectChoose)
});
function selectToggle() {
this.parentElement.classList.toggle('_active');
}
function selectChoose() {
let text = this.innerHTML,
select = this.closest('.sidebar__nav'),
currentText = select.querySelector('.sidebar__item-current');
currentText.innerHTML = text;
select.classList.remove('_active');
}
};
select();
._tabs-block {
display: none;
width: 200px;
height: 200px;
}
._tabs-block._active {
display: block
}
.one {
background: red;
}
.two {
background: green;
}
.three {
background: yellow;
}
.sidebar__list {
list-style: none;
}
.sidebar__item-mobile {
width: 200px;
cursor: pointer;
background: grey;
padding: 5px 10px;
}
.sidebar__item-current {
width: 100%;
}
.sidebar__link {
border: none;
color: #fff;
background: inherit;
}
.sidebar__list {
width: 200px;
height: 0px;
background: grey;
padding: 0;
margin: 0;
opacity: 0;
visibility: hidden;
transition: all .4s ease 0s;
}
.sidebar__nav._active .sidebar__list {
height: 90px;
opacity: 1;
visibility: visible;
}
.sidebar__item {
border: 1px solid #000;
padding: 5px 10px;
}
.left {
margin: 0 0 20px;
}
<div class="user__inner _tabs">
<div class="left">
<nav class="sidebar__nav">
<div class="sidebar__item-mobile">
<div class="sidebar__item-current">1</div>
</div>
<ul class="sidebar__list">
<li class="sidebar__item _active">
<button class="sidebar__link">1</button>
</li>
<li class="sidebar__item">
<button class="sidebar__link">2</button>
</li>
<li class="sidebar__item">
<button class="sidebar__link">3</button>
</li>
</ul>
</nav>
</div>
<div class="right">
<div class="_tabs-block one _active">1</div>
<div class="_tabs-block two">2</div>
<div class="_tabs-block three">3</div>
</div>
</div>
Ответы (1 шт):
Автор решения: Даня
→ Ссылка
Как вариант можно добавить display:none; активному итему, и контейнер растянуть на 100%
let tabs = document.querySelectorAll("._tabs");
for (let index = 0; index < tabs.length; index++) {
let tab = tabs[index];
let tabs_items = tab.querySelectorAll(".sidebar__item");
let tabs_blocks = tab.querySelectorAll("._tabs-block");
for (let index = 0; index < tabs_items.length; index++) {
let tabs_item = tabs_items[index];
tabs_item.addEventListener("click", function(e) {
for (let index = 0; index < tabs_items.length; index++) {
let tabs_item = tabs_items[index];
tabs_item.classList.remove('_active');
tabs_blocks[index].classList.remove('_active');
}
tabs_item.classList.add('_active');
tabs_blocks[index].classList.add('_active');
e.preventDefault();
});
}
}
let select = function() {
let selectHeader = document.querySelectorAll('.sidebar__item-mobile');
let selectItem = document.querySelectorAll('.sidebar__item');
selectHeader.forEach(item => {
item.addEventListener('click', selectToggle)
});
selectItem.forEach(item => {
item.addEventListener('click', selectChoose)
});
function selectToggle() {
this.parentElement.classList.toggle('_active');
}
function selectChoose() {
let text = this.innerHTML,
select = this.closest('.sidebar__nav'),
currentText = select.querySelector('.sidebar__item-current');
currentText.innerHTML = text;
select.classList.remove('_active');
}
};
select();
._tabs-block {
display: none;
width: 200px;
height: 200px;
}
._tabs-block._active {
display: block
}
.one {
background: red;
}
.two {
background: green;
}
.three {
background: yellow;
}
.sidebar__list {
list-style: none;
}
.sidebar__item-mobile {
width: 200px;
cursor: pointer;
background: grey;
padding: 5px 10px;
}
.sidebar__item-current {
width: 100%;
}
.sidebar__link {
border: none;
color: #fff;
background: inherit;
}
.sidebar__list {
width: 200px;
height: 0px;
background: grey;
padding: 0;
margin: 0;
opacity: 0;
visibility: hidden;
transition: all .4s ease 0s;
}
.sidebar__nav._active .sidebar__list {
height: 100%;
opacity: 1;
visibility: visible;
}
.sidebar__item {
border: 1px solid #000;
padding: 5px 10px;
}
.sidebar__item._active {
display: none;
}
.left {
margin: 0 0 20px;
}
<div class="user__inner _tabs">
<div class="left">
<nav class="sidebar__nav">
<div class="sidebar__item-mobile">
<div class="sidebar__item-current">1</div>
</div>
<ul class="sidebar__list">
<li class="sidebar__item _active">
<button class="sidebar__link">1</button>
</li>
<li class="sidebar__item">
<button class="sidebar__link">2</button>
</li>
<li class="sidebar__item">
<button class="sidebar__link">3</button>
</li>
</ul>
</nav>
</div>
<div class="right">
<div class="_tabs-block one _active">1</div>
<div class="_tabs-block two">2</div>
<div class="_tabs-block three">3</div>
</div>
</div>
