gpt4 book ai didi

javascript - 简单的子菜单导航不起作用?

转载 作者:太空宇宙 更新时间:2023-11-04 08:13:08 24 4
gpt4 key购买 nike

创建带有子菜单的简单导航。每次我将鼠标悬停在 ul 上时,它都会显示 display: block,否则子菜单始终为 display:none

现在:悬停功能不起作用。

这是我试图显示 ul 的地方。 我的选择器错了吗?不确定。

    nav > li:hover > ul {
display: block;
}

有什么问题吗?另外,我的 CSS 是否干净,是否可以更短一些?

完整的html

<!DOCTYPE html>
<html>
<head>
<title>
nav
</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<header>
<nav>
<div class="main-nav">
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Contact</a></li>
</div>
<ul class="items">
<li><a href="#">items</a></li>
<li><a href="#">items</a></li>
<ul class="sub-items">
<li><a href="#">subs</a></li>
<li><a href="#">subs</a></li>
<li><a href="#">subs 3</a></li>
</ul>
<div class="items-after-sub-list">
<li><a href="#">items</a></li>
<li><a href="#">items</a></li>
</div>

</ul>
</nav>
</header>

</body>
</html>

CSS

    html {
font-size: 1.2rem;
}
* {
padding: 0;
margin: 0;

}


header {
background-color: black;
padding: 1rem;
height: 20px;
}

.main-nav {
display: flex;
}
.main-nav li {
padding-right: 1rem;
}

.main-nav li a {
text-decoration: none;
}

.items {
list-style: none;
position: relative;
right: 15px;
}
nav {
list-style: none;
}

.items li {
line-height: 2.5rem;

}
.items li a {
font-size: 1rem;
text-decoration: none;
background-color: red;
padding: 0.5rem;
}

.items-after-sub-list{
position: relative;
bottom: 143px;
}
.sub-items {
position: relative;
left: 72px;
bottom: 48px;
list-style: none;
}

.sub-items li a {
color: black;
background-color: green;

}
li a {
transition: background 1s;
}
nav a:hover {
background-color: silver;
}

nav > li:hover > ul {
display: block;
}

最佳答案

您的选择器 nav > li:hover > ul确实是错误的,原因有二:

  • 首先,这是错误的,因为您没有任何 <ul> <li> 中的元素元素。您有一个子菜单,但它是另一个子菜单的直接子菜单 <ul>元素。

  • 其次,它是错误的,因为它永远不会等同于有效标记。 <li>元素必须有一个<ul> , <ol><menu> parent 。使用 <div>作为 parent 是 obsolete .

除此之外,你的结构也是错误的; “联系人”在 div.main-nav 中,因此没有 JavaScript 就无法访问下拉菜单(因为 CSS 有 no parent selector )。

我不推荐使用 JavaScript,而是通过稍微改变您的 HTML 结构来推荐一种纯 CSS 解决方案。每个“级别”都应作为父级的子级包含在 HTML 中。在我的示例中,我表示元素具有 .more 的子元素。类。

首先,您需要隐藏所有子菜单项,同时显示“根”元素(这可以通过子选择器 > 实现):

#collapse li {
display: none;
}

#collapse > li {
display: block;
}

然后你可以使用下面的来显示下一级的 child :

#collapse li.more:hover > ul > li {
display: block;
}

由于子选择器的双重使用,这只会选择下一个级别。话虽如此,因为#collapse之间没有子选择器和 li.more ,它将命中每个 li.more #collapse 下的元素,允许无限递归。

这可以在下面的最小示例中看到:

#collapse .more {
list-style: none;
cursor: pointer;
text-indent: -1em;
}

#collapse .more:before {
content: "+";
padding-right: 5px;
}

#collapse .more ul {
text-indent: 0em;
cursor: initial;
}

#collapse li {
display: none;
}

#collapse > li {
display: block;
}

#collapse li.more:hover > ul > li {
display: block;
}
<ul id="collapse">
<li>Top-level without children</li>
<li class="more">Top-level with children
<ul>
<li>Sub-level without children</li>
<li class="more">Sub-level with children
<ul>
<li>Child 1</li>
<li>Child 2</li>
</ul>
</li>
</ul>
</li>
</ul>

将鼠标悬停在 .more 上元素显示直接子元素,直接子元素。

希望对您有所帮助! :)

关于javascript - 简单的子菜单导航不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46107571/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com