window.addEventListener("DOMContentLoaded", function() {
let menu = this.document.querySelector(".header__nav"),
wrapper = this.document.querySelector(".header__wrap"),
menuText = this.document.querySelector(".header__text"),
hamburger = this.document.querySelector(".header__hamburger"),
dropdown = this.document.querySelector(".header__dropdown");
let menuSet = function() {
menu.addEventListener("click", function(e) {
if (e.target == menu || e.target == menuText || e.target == hamburger || e.target == wrapper) {
this.classList.toggle("header__nav_active");
menuText.classList.toggle("header__text_active");
hamburger.classList.toggle("header__hamburger_active");
dropdown.classList.toggle("header__dropdown_active");
}
});
/* document.body.addEventListener("click", (e) => {
if (e.target !== dropdown) {
menu.classList.remove("header__nav_active");
menuText.classList.remove("header__text_active");
hamburger.classList.remove("header__hamburger_active");
dropdown.classList.remove("header__dropdown_active");
}
}); */
};
menuSet();
});
.header__text {
margin-left: 10px;
font-weight: 300;
font-size: 16px;
text-transform: uppercase;
line-height: 20px;
color: #fff;
}
.header__text_active {
color: #336ABB;
}
.header__nav {
width: 230px;
position: relative;
margin-top: 3px;
margin-left: 133.5px;
padding: 18px 20px;
background-color: #336ABB;
border-radius: 10px;
}
.header__nav_active {
background-color: #fff;
color: #336ABB;
}
.header__dropdown {
display: none;
position: absolute;
top: 39px;
left: 0;
width: 169px;
padding-top: 24px;
padding-left: 22px;
padding-bottom: 20px;
background: #fff;
border-radius: 0 10px 10px 10px;
list-style-type: none;
box-shadow: 0 4px 18px 0 rgba(0, 0, 0, 0.25);
}
.header__dropdown_active {
display: block;
}
.header__dropdown li {
margin-bottom: 11px;
color: #336ABB;
font-weight: 300;
font-size: 14px;
}
.header__dropdown li:nth-last-child(1) {
margin-bottom: 0;
}
.header__wrap {
display: flex;
align-items: center;
}
.header__hamburger {
display: flex;
flex-direction: column;
width: 19px;
height: 10px;
}
.header__hamburger span {
display: block;
width: 100%;
height: 2px;
background-color: #fff;
}
.header__hamburger span:nth-child(2) {
margin: 2px 0;
}
.header__hamburger_active span {
background-color: #336ABB;
}
.header__hamburger_active span:nth-child(1) {
transform: translateY(3px) rotate(-45deg);
margin-bottom: -2px;
}
.header__hamburger_active span:nth-child(2) {
display: none;
}
.header__hamburger_active span:nth-child(3) {
transform: translateY(3px) rotate(45deg);
margin-bottom: 6px;
}
.title {
margin-top: 120px;
padding-bottom: 56px;
font-size: 87px;
text-align: center;
}
<div class="header__menu header__menu_m-hidden">
<nav class="header__nav">
<div class="header__wrap">
<div class="header__hamburger">
<span></span>
<span></span>
<span></span>
</div>
<div class="header__text">меню</div>
</div>
<ul class="header__dropdown">
<li>Каталог</li>
<li>Аналитика</li>
</ul>
</nav>
</div>
<div class="title">Lorem ipsum</div>
该网站有一个菜单,根据设计,当您单击它时打开/关闭,当您单击菜单外部时关闭。
- 部分代码有效。但如果不指定每个嵌套元素的“e.target”,则仅当单击父“菜单”时才会触发该事件,而不会在这些元素上触发该事件。我怎样才能以不同的方式做,这样我就不必一一检查所有子元素?
- 单击页面上的任何位置(下拉列表本身和嵌套在其中的“li”除外)时如何关闭菜单?
只要检查一下家长就可以了。
这可以按照我的例子来完成......
还有建议 - 你不应该挂那么多像
active.一个就足够了 - 在父母身上。其余属性可以相对于“活动”父级来定义。 ;)