Имеется выпадающее подменю. Открывается по клику на второй пункт меню, закрывается по клику на него же, либо на любое пространство, кроме самого выпавшего подменю. Чтобы подменю закрывалось по клику вне его, пришлось запретить всплытие при его открытии, иначе оно открывалось и мгновенно закрывалось. Можно ли как то это реализовать не запрещая всплытие?
let subMenuShow = document.querySelector('.menu li:nth-child(2)');
let subMenu = document.querySelector('.sub-menu');
// Открыть подменю
let SwitchMenu = function() {
subMenu.classList.toggle('open');
event.stopPropagation();
};
subMenuShow.addEventListener("click", SwitchMenu);
// Закрыть подменю
function menuClose() {
subMenu.classList.remove('open');
}
function menuCloseClickOutside(e) {
if (!e.target.matches('.sub-menu, .sub-menu *')) {
menuClose();
};
};
document.addEventListener('click', menuCloseClickOutside);
document.addEventListener('touchstart', menuCloseClickOutside);
Непонятно, зачем вообще хардкодить индекс элемента меню.
Можно решить задачу очень просто, и относительно гибко:
document.addEventListener('DOMContentLoaded', () => {
document.body.addEventListener('click', e => {
const lastChild = e.target.lastElementChild;
if (lastChild && lastChild.matches('.menu.sub'))
return (e.target.classList.toggle('active'), undefined);
for (const mi of document.querySelectorAll('.menu > li'))
mi.classList.remove('active');
});
});
html, body { height: 100%; font-family: sans-serif; }
.menu { list-style: none; font-size: 0; padding: 0; white-space: nowrap; }
.menu > li { position: relative; display: inline-block; padding: 0.5em; font-size: 1rem; box-shadow: 0 0 0 1px #777; user-select: none; cursor: pointer; }
.menu > li + li { margin-left: 1px; }
.menu.sub { position: absolute; top: 100%; left: 0; display: none; width: 100%; }
.menu.sub > li { margin-top: 1px; }
.menu > li.active { background: #def; }
.menu > li.active > .menu.sub { display: inline-block; }
<ul class="menu">
<li>flat</li>
<li>with submenu
<ul class="menu sub">
<li>flat</li>
<li>flat</li>
<li>with submenu
<ul class="menu sub">
<li>flat</li>
</ul>
</li>
</ul>
</li>
<li>flat</li>
<li>flat</li>
</ul>
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
У меня alert, prompt и прочие функции нормально работают в файле scriptjs, но вот вызов элементов и подобные штуки не работают
Подскажите, пожалуйста, как после генерации SPA Nuxt проекта (build) оставлять в нем конфиг (env или другой)?
Хочу сделать блоки как https://wp-kamaru/id_7686/miniatyury-dlya-elemetov-taksonomij