@LastGeneral

Как закрывать открытое sub-menu, при клике на пункт меню?

Сейчас при нажатии на пункты меню, они могут открыться оба, а как сделать что бы только один отображался, а второй сразу скрывался? Сейчас они могут открываться оба и это ломает верстку

<ul>
  <li class="menu-item menu-item-type-taxonomy menu-item-object-product_cat menu-item-has-children">
    <a href="#">Пункт 1</a>
    <ul class="sub-menu">
      <li>Подпункт 1</li>
      <li>Подпункт 2</li>
      <li>Подпункт 3</li>
    </ul>
  </li>
  <li class="menu-item menu-item-type-custom menu-item-object-custom">
    <a href="#">Пункт 2</a>
  </li>
  <li class="menu-item menu-item-type-taxonomy menu-item-object-product_cat menu-item-has-children">
    <a href="#">Пункт 3</a>
    <ul class="sub-menu">
      <li>Подпункт 1</li>
      <li>Подпункт 2</li>
      <li>Подпункт 3</li>
    </ul>
  </li>
</ul>

.sub-menu { display: none; }
.open .active { display: block; }

document.querySelector('ul').onclick = function(ev) {
let listItem = ev.target.closest('.menu-item-has-children');
  if (!listItem) return
  listItem.classList.toggle('open');
  listItem.querySelector('.sub-menu').classList.toggle('active');
}
  • Вопрос задан
  • 122 просмотра
Пригласить эксперта
Ответы на вопрос 1
delphinpro
@delphinpro Куратор тега JavaScript
frontend developer
1. Скрыть все
2. Открыть нужный

UPD: пример для вдохновения. Не факт, что работает, но задаст нужный вектор в написании своего решения.

const allMenus = document.querySelectorAll('.hasChildren');
function hideOtherMenus(current){
  allMenus.filter(menu => menu != current).forEach(menu => {
    menu.classList.remove('open');
    menu.querySelector('.subMenu').classList.remove('active');
  });
}
allMenus.forEach(menu => {
  menu.addEventListener('click', e => {
    hideOtherMenu(e.target);
    e.target.classList.toggle('open');
    e.target.querySelector('.subMenu').classList.toggle('active');
  })
})
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
24 нояб. 2024, в 21:55
200000 руб./за проект
24 нояб. 2024, в 21:41
1000 руб./за проект
24 нояб. 2024, в 21:19
35000 руб./за проект