我必须用VanillaJS做一个这样的导航栏。
样式和项目是设置的,但是当鼠标移动到内部元素上时,我不能使下拉菜单保持打开状态。移动到按钮外后关闭。
这是期望的结果:gifconst categoriesLink = document.querySelector('.categories__link');
const categoriesList = document.querySelector('.categories__wrapper');
function categoriesVisible() {
categoriesList.style.display = 'block';
}
function categoriesHidden() {
categoriesList.style.display = 'none';
}
categoriesLink.addEventListener('mouseover', categoriesVisible);
categoriesLink.addEventListener('mouseout', categoriesHidden);
.header__nav {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
.nav {
position: relative;
}
.categories__link {
color: #000000;
cursor: pointer;
}
.categories__link:hover {
color: #2F80ED;
}
.categories__wrapper {
display: none;
position: absolute;
top: 30px;
left: -100px;
}
.categories__content {
position: relative;
box-shadow: 0px 0px 4px #BDBDBD;
border-radius: 5px;
background: #FFFFFF;
}
.categories__content::after {
z-index: -10;
content: "";
position: absolute;
width: 0;
height: 0;
top: -5px;
left: 50%;
border: 5px solid transparent;
transform-origin: 0 0;
transform: rotate(45deg);
box-shadow: 0px 0px 4px #BDBDBD;
}
.categories__content::before {
z-index: 10;
content: "";
position: absolute;
width: 0;
height: 0;
top: -5px;
left: 50%;
border: 5px solid #fff;
transform-origin: 0 0;
transform: rotate(45deg);
}
.categories__list {
display: flex;
padding: 14px 30px;
}
.list__link {
line-height: 150%;
color: #000000;
}
.list__link:hover {
color: #2F80ED;
}
<div class="header__nav">
<nav class="nav">
<span class="categories__link">Categories</span>
<div class="categories__wrapper">
<div class="categories__content">
<div class="categories__list">
<ul class="left__list">
<li><a class="list__link" href="" #>Sport</a></li>
<li><a class="list__link" href="" #>World</a></li>
<li><a class="list__link" href="" #>Covid</a></li>
<li><a class="list__link" href="" #>Business</a></li>
</ul>
<ul class="right__list">
<li><a class="list__link" href="" #>Politics</a></li>
<li><a class="list__link" href="" #>Sciense</a></li>
<li><a class="list__link" href="" #>Religion</a></li>
<li><a class="list__link" href="" #>Health</a></li>
</ul>
</div>
</div>
</div>
</nav>
<div class="header__burger">
<span></span>
</div>
</div>
我在Codepen上的代码https://codepen.io/sennarion/pen/dyRKBxK
如果你可以改变css和html,你可以这样做:
首先丢掉javascript。在css中添加以下内容:
.nav__item {
position: relative;
}
.nav__item:hover > .categories__wrapper {
display: block;
}
然后将顶部属性从。categores__wrapper移动到。categores__content,并将。categores__wrapper的顶部设置为0
.categories__wrapper {
display: none;
position: absolute;
top: 0;
left: -100px;
}
.categories__content {
position: relative;
top: 30px;
box-shadow: 0px 0px 4px #BDBDBD;
border-radius: 5px;
background: #FFFFFF;
}
,最后用class="nav__item"这样的:
<nav class="nav">
<div class="nav__item">
<span class="categories__link">Categories</span>
<div class="categories__wrapper">
...
</div>
</div>
</nav>
.header__nav {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
.nav {
position: relative;
}
.nav__item {
position: relative;
}
.nav__item:hover > .categories__wrapper {
display: block;
}
.categories__link {
color: #000000;
cursor: pointer;
}
.categories__link:hover {
color: #2F80ED;
}
.categories__wrapper {
display: none;
position: absolute;
top: 0;
left: -100px;
}
.categories__content {
position: relative;
top: 30px;
box-shadow: 0px 0px 4px #BDBDBD;
border-radius: 5px;
background: #FFFFFF;
}
.categories__content::after {
z-index: -10;
content: "";
position: absolute;
width: 0;
height: 0;
top: -5px;
left: 50%;
border: 5px solid transparent;
transform-origin: 0 0;
transform: rotate(45deg);
box-shadow: 0px 0px 4px #BDBDBD;
}
.categories__content::before {
z-index: 10;
content: "";
position: absolute;
width: 0;
height: 0;
top: -5px;
left: 50%;
border: 5px solid #fff;
transform-origin: 0 0;
transform: rotate(45deg);
}
.categories__list {
display: flex;
padding: 14px 30px;
}
.list__link {
line-height: 150%;
color: #000000;
}
.list__link:hover {
color: #2F80ED;
}
<div class="header__nav">
<nav class="nav">
<div class="nav__item">
<span class="categories__link">Categories</span>
<div class="categories__wrapper">
<div class="categories__content">
<div class="categories__list">
<ul class="left__list">
<li><a class="list__link" href="" #>Sport</a></li>
<li><a class="list__link" href="" #>World</a></li>
<li><a class="list__link" href="" #>Covid</a></li>
<li><a class="list__link" href="" #>Business</a></li>
</ul>
<ul class="right__list">
<li><a class="list__link" href="" #>Politics</a></li>
<li><a class="list__link" href="" #>Sciense</a></li>
<li><a class="list__link" href="" #>Religion</a></li>
<li><a class="list__link" href="" #>Health</a></li>
</ul>
</div>
</div>
</div>
</div>
</nav>
<div class="header__burger">
<span></span>
</div>
</div>