javascript - 子菜单关闭功能半工作,Javascript
问题描述
我在处理此功能错误时遇到问题。我想要做的是当用户点击框外的任何地方时,框应该关闭。它只需点击几下,然后就停止了。起初控制台没有错误,但是当我第一次单击时,它显示无法读取 null 的属性样式。我的困惑是它只需点击几下,然后就停止了。请有任何提示!
window.addEventListener("mouseup", function (event) {
let box = document.querySelector(".sub-menu.open");
if (event.target != box && event.target.parentNode != box) {
box.style.display = "none";
}
});
<ul class="nav__links">
<div class="desktop__nav">
<li class="parent">
<a href="#">Product</a>
<img
class="menu-arrow"
src="./images/icon-arrow-light.svg"
alt="arrow"
/>
<ul class="sub-menu">
<li>Overview</li>
<li>Pricing</li>
<li>Marketplace</li>
<li>Features</li>
<li>Integrations</li>
</ul>
</li>
<li class="parent">
<a href="#">Company</a>
<img
class="menu-arrow"
src="./images/icon-arrow-light.svg"
alt="arrow"
/>
<ul class="sub-menu">
<li>About</li>
<li>Team</li>
<li>Blog</li>
<li>Careers</li>
</ul>
</li>
<li class="parent">
<a href="#">Connect</a>
<img
class="menu-arrow"
src="./images/icon-arrow-light.svg"
alt="arrow"
/>
<ul class="sub-menu">
<li>Contact</li>
<li>Newsletter</li>
<li>LinkedIn</li>
</ul>
</li>
</div>
.sub-menu {
display: none;
}
.sub-menu.open {
@include mobile {
display: flex;
flex-direction: column;
background-color: $footer-text;
width: 60vw;
margin: 0 auto;
color: $darkblue-headingtext;
border-radius: 5px;
position: relative;
left: 5px;
text-align: center;
}
position: absolute;
width: 10vw;
background-color: white;
color: black;
text-align: left;
display: flex;
flex-direction: column;
margin: 6px auto;
padding-left: 0.3rem;
border-radius: 5px;
}
该代码有效,但单击几下后停止
解决方案
回答
不需要JS!把那个讨厌的语言从这里拿出来,用 CSS 替换它,我们可以在下拉父元素上使用 tabindex="0" 来允许我们使用 CSS :focus!有了这个,我们可以轻松可靠地改变基于市中心父母集中状态的样式,要么
opacity: 0; pointer-events: none;
或者
opacity: 1; pointer-events: all;
我希望这是你正在寻找和帮助的!如果您想进一步解释或在 JS 中需要这个,请发表评论。
body {
font-family: sans-serif;
}
.dropdownbutton {
padding: 20px;
background: whitesmoke;
box-shadow: lightgray 0 12px 40px 0;
transition: all 0.3s;
}
.dropdownbutton:hover {
opacity: 1 !important;
background: lightgray;
}
.dropdownbutton span {
transition: 0.4s;
}
.dropdownparent:hover button span {
transform: rotate(180deg);
}
.dropdownparent {
position: relative;
width: fit-content;
transition: all 0.2s;
text-decoration: none;
user-select: none;
cursor: pointer;
border-radius: 4px;
z-index: 1000;
margin: 20px auto;
}
.dropdowncontentparent {
opacity: 0;
pointer-events: none;
position: absolute;
z-index: 1;
right: -13px;
top: 20px;
background: transparent;
padding: 12px;
transition: all 0.3s;
}
.dropdowncontentchild {
box-shadow: rgba(0, 0, 0, 0.15) 0 12px 22px 2px,
rgba(0, 0, 0, 0.055) 0 12px 12px;
border-radius: 4px;
overflow: hidden;
min-width: 200px;
width: max-content;
transition: all 0.3s;
background: var(--nav);
display: flex;
flex-direction: column;
}
.dropdowncontentchild:hover {
box-shadow: rgba(0, 0, 0, 0.3) 0 12px 22px 2px,
rgba(0, 0, 0, 0.075) 0 12px 12px;
}
.dropdowncontentchild a {
text-decoration: none;
padding: 8px;
transition: all 0.3s;
color: black;
}
.dropdowncontentchild a:hover {
background: whitesmoke;
}
.dropdownparent:focus .dropdowncontentparent {
opacity: 1;
pointer-events: all;
top: 30px;
}
.dropdownparent:focus .dropdownbutton {
opacity: 0.6;
background: darkgray;
}
<div class="dropdownparent" tabindex="0">
<a class="dropdownbutton">Dropdown Button</a>
<div class="dropdowncontentparent">
<div class="dropdowncontentchild">
<a href="#">Link 1</a>
<a href="#">Link 2</a>
<a href="#">Link 3</a>
</div>
</div>
</div>
推荐阅读
- rust - 未找到“Self”的关联类型“Element”
- reactjs - 何时使用“react-relay”中的实用程序以及何时使用“relay-environment”
- php - wp查询中的wp查询
- spring-boot - Spring Boot中的资源通过实现WebMvcConfigurer
- javascript - React 状态没有通过 useState 和 select 正确改变
- c++ - 如何在 Qt Creator 中将 PoDoFo 外部库添加到我的 C++ 项目中?
- monetdb - 多个 BAT 上的 MonetDB 交叉产品
- c - GCC 为什么总是非运行优化?
- javascript - 在 java 脚本中使用本地存储注册功能
- mysql - SQL触发器在MySQL数据库中不起作用