Не скрывать открытое подменю при клике на него
const navLinkToggle = document.querySelectorAll('.nav__link_toggle');
const navSubmenuLevelTwo = document.querySelectorAll('.nav__submenu');
for (button of navLinkToggle) {
button.addEventListener('click', function(event) {
event.preventDefault();
event.stopPropagation();
const dropdownList = event.target.nextElementSibling;
const dropdownButton = event.target;
if (dropdownList.classList.contains('nav__submenu_visible')) {
dropdownList.classList.remove('nav__submenu_visible');
dropdownButton.classList.remove('nav__link_active');
} else {
for (button of navLinkToggle) {
button.classList.remove('nav__link_active');
}
for (list of navSubmenuLevelTwo) {
list.classList.remove('nav__submenu_visible');
}
dropdownList.classList.add('nav__submenu_visible');
dropdownButton.classList.add('nav__link_active');
document.body.addEventListener('click', function(event) {
dropdownButton.classList.remove('nav__link_active');
dropdownList.classList.remove('nav__submenu_visible');
});
}
});
}
body {
height: 500px
}
a {
text-decoration: none;
}
.nav {
height: 66px;
line-height: 66px;
}
.nav__list {
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
.nav__item:not(:last-child) {
margin-right: 20px;
}
.nav__submenu {
position: absolute;
display: none;
background-color: #000;
width: 100%;
top: 66px;
left: 0px;
z-index: 9999;
}
.nav__submenu_visible {
display: block;
}
.nav__container {
display: block;
position: relative;
width: 100%;
margin-left: auto;
margin-right: auto;
padding-left: 15px;
padding-right: 15px;
}
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Заголовок</title>
</head>
<body>
<nav class="nav">
<div class="nav__wrapper">
<ul class="nav__list">
<li class="nav__item">
<a href="/index.html" class="nav__link">link</a>
</li>
<li class="nav__item">
<a href="#" class="nav__link">link</a>
</li>
<li class="nav__item">
<a href="#" class="nav__link">link</a>
</li>
<li class="nav__item nav__item_dropdown">
<a href="/paragraph.html" class="nav__link nav__link_toggle">toggle link</a>
<div class="nav__submenu">
<div class="nav__container">
<ul class="nav__listLevelTwo">
<li class="nav__itemLevelTwo nav__itemLevelTwo_dropdown">
<a href="#" class="nav__linkLevelTwo nav__linkLevelTwo_toggle">1 level two</a>
</li>
</ul>
</div>
</div>
</li>
<li class="nav__item">
<a href="#" class="nav__link">link</a>
</li>
<li class="nav__item">
<a href="#" class="nav__link">link</a>
</li>
<li class="nav__item nav__item_dropdown">
<a href="#" class="nav__link nav__link_toggle">toggle link</a>
<div class="nav__submenu">
<div class="nav__container">
<ul class="nav__listLevelTwo">
<li class="nav__itemLevelTwo nav__itemLevelTwo_dropdown">
<a href="#" class="nav__linkLevelTwo nav__linkLevelTwo_toggle">2 level two</a>
</li>
</ul>
</div>
</div>
</li>
</ul>
</div>
</nav>
</body>
</html>
Ответы (1 шт):
Автор решения: Денис Степанов
→ Ссылка
Исходя из вашего кода, надо просто прервать всплытие события.
navSubmenuLevelTwo.forEach(element => element.addEventListener('click', event => event.stopPropagation()))
const navLinkToggle = document.querySelectorAll('.nav__link_toggle');
const navSubmenuLevelTwo = document.querySelectorAll('.nav__submenu');
navSubmenuLevelTwo.forEach(element => element.addEventListener('click', event => event.stopPropagation()));
for (button of navLinkToggle) {
button.addEventListener('click', function(event) {
event.preventDefault();
event.stopPropagation();
const dropdownList = event.target.nextElementSibling;
const dropdownButton = event.target;
if (dropdownList.classList.contains('nav__submenu_visible')) {
dropdownList.classList.remove('nav__submenu_visible');
dropdownButton.classList.remove('nav__link_active');
} else {
for (button of navLinkToggle) {
button.classList.remove('nav__link_active');
}
for (list of navSubmenuLevelTwo) {
list.classList.remove('nav__submenu_visible');
}
dropdownList.classList.add('nav__submenu_visible');
dropdownButton.classList.add('nav__link_active');
document.body.addEventListener('click', function(event) {
dropdownButton.classList.remove('nav__link_active');
dropdownList.classList.remove('nav__submenu_visible');
});
}
});
}
body {
height: 500px
}
a {
text-decoration: none;
}
.nav {
height: 66px;
line-height: 66px;
}
.nav__list {
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
.nav__item:not(:last-child) {
margin-right: 20px;
}
.nav__submenu {
position: absolute;
display: none;
background-color: #000;
width: 100%;
top: 66px;
left: 0px;
z-index: 9999;
}
.nav__submenu_visible {
display: block;
}
.nav__container {
display: block;
position: relative;
width: 100%;
margin-left: auto;
margin-right: auto;
padding-left: 15px;
padding-right: 15px;
}
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Заголовок</title>
</head>
<body>
<nav class="nav">
<div class="nav__wrapper">
<ul class="nav__list">
<li class="nav__item">
<a href="/index.html" class="nav__link">link</a>
</li>
<li class="nav__item">
<a href="#" class="nav__link">link</a>
</li>
<li class="nav__item">
<a href="#" class="nav__link">link</a>
</li>
<li class="nav__item nav__item_dropdown">
<a href="/paragraph.html" class="nav__link nav__link_toggle">toggle link</a>
<div class="nav__submenu">
<div class="nav__container">
<ul class="nav__listLevelTwo">
<li class="nav__itemLevelTwo nav__itemLevelTwo_dropdown">
<a href="#" class="nav__linkLevelTwo nav__linkLevelTwo_toggle">1 level two</a>
</li>
</ul>
</div>
</div>
</li>
<li class="nav__item">
<a href="#" class="nav__link">link</a>
</li>
<li class="nav__item">
<a href="#" class="nav__link">link</a>
</li>
<li class="nav__item nav__item_dropdown">
<a href="#" class="nav__link nav__link_toggle">toggle link</a>
<div class="nav__submenu">
<div class="nav__container">
<ul class="nav__listLevelTwo">
<li class="nav__itemLevelTwo nav__itemLevelTwo_dropdown">
<a href="#" class="nav__linkLevelTwo nav__linkLevelTwo_toggle">2 level two</a>
</li>
</ul>
</div>
</div>
</li>
</ul>
</div>
</nav>
</body>
</html>