嵌套下拉菜单
nested dropdown menu
我正在尝试在我的导航中制作一个嵌套菜单 header。在 Reports 下应该有两个菜单项 Global Shop 和 Ndustrios。然后,如果我将鼠标悬停在其中任何一个上,应该会显示更多项目。目前,报告下发生的是悬停时显示在其下方的所有选项。所以它显示:全球商店、库存、销售订单等。但 Ndustrios 没有出现。
这是我尝试过的:
#nav_ul {
list-style-type: none;
margin: 0;
padding: 0;
overflow: hidden;
background-color: #1D3567;
text-align: center;
}
li {
display: inline-block;
}
li a,
.dropbtn {
display: inline-block;
color: white;
text-align: center;
padding: 24px 16px;
text-decoration: none;
}
.dropdown {
display: inline-block;
}
.dropdown-content {
display: none;
position: absolute;
background-color: #1D3567;
min-width: 160px;
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
z-index: 1;
}
.dropdown-content a {
color: White;
padding: 12px 16px;
text-decoration: none;
display: block;
text-align: left;
}
.dropdown:hover .dropdown-content {
display: block;
}
.dropdown-content ul {
display: none;
position: absolute;
left: 100%;
top: 75;
}
.dropdown-content:hover ul {
display: block;
}
<nav>
<ul id="nav_ul">
<li class="dropdown">
<a href="#Reports">Reports</a>
<div class="dropdown-content">
<a href="#GS">Global Shop</a>
<div class="dropdown-content">
<a href="Inventory.html">Inventory</a>
<a href="sales.html">Sales Orders</a>
<a href="quotes.html">Quotes</a>
<a href="workOrder.html">Work Orders</a>
<a href="prtUsed.html">Part Where Used</a>
</div>
<a href="#ND">Ndustrios</a>
</div>
</li>
</ul>
<nav>
您需要对 HTML 进行一些重组,并在 li 中使用另一个列表来包含更多链接。但是,您仍然会遇到一个非常严重的问题。如果您不再悬停子菜单项并且列表变短,那么您将不再悬停任何内容。例如:将鼠标悬停在报告上,然后是全球商店,然后尝试将鼠标悬停在 Ndustrios 上。你不能这样做,因为一旦你离开下拉子<li>
,列表就会缩小,让你一无所有。你有两个选择。 1. 将 Ndustrios 放在下拉菜单上方或 2. 使下拉菜单出现在点击而不是悬停时
#nav_ul {
list-style-type: none;
margin: 0;
padding: 0;
overflow: hidden;
background-color: #1D3567;
text-align: center;
}
li a,
.dropbtn {
display: inline-block;
color: white;
text-align: center;
padding: 24px 16px;
text-decoration: none;
}
.dropdown {
display: inline-block;
}
.dropdown-content {
display: none;
position: absolute;
background-color: #1D3567;
min-width: 160px;
z-index: 1;
list-style: none;
}
.dropdown-content a {
color: White;
padding: 12px 16px;
text-decoration: none;
display: block;
text-align: left;
}
.dropdown-sub-list{
display: none;
list-style: none;
margin: 0;
}
.dropdown:hover > .dropdown-content {
display: block;
}
.dropdown-sub:hover > .dropdown-sub-list {
display: block;
}
<nav>
<ul id="nav_ul">
<li class="dropdown">
<a href="#Reports">Reports</a>
<ul class="dropdown-content">
<li class="dropdown-sub">
<a href="#GS">Global Shop</a>
<ul class="dropdown-sub-list">
<li><a href="Inventory.html">Inventory</a></li>
<li><a href="sales.html">Sales Orders</a></li>
<li><a href="quotes.html">Quotes</a></li>
<li><a href="workOrder.html">Work Orders</a></li>
<li><a href="prtUsed.html">Part Where Used</a></li>
</ul>
</li>
<li><a href="#ND">Ndustrios</a></li>
</ul>
</li>
</ul>
</nav>
如果您对在下拉菜单中使用下拉菜单死心塌地,这里有一个悬停单击下拉组合的简单示例。如果您愿意使用此方法,也可以使顶级下拉菜单可点击。
const dropdownBtns = document.querySelectorAll(".dropdown-button");
const dropdownItem = document.querySelectorAll(".dropdown-item");
const subDropdown = document.querySelectorAll(".sub-dropdown");
const handleClick = (event) => {
const targetBtn = event.target;
const ariaExpanded = targetBtn.getAttribute("aria-expanded");
const ariaControls = targetBtn.getAttribute("aria-controls");
const controlledAria = document.getElementById(ariaControls);
if(ariaExpanded === "false") {
controlledAria.classList.add("active");
controlledAria.setAttribute("aria-hidden", "false");
targetBtn.setAttribute("aria-expanded", "true");
} else if (ariaExpanded === "true") {
controlledAria.classList.remove("active");
controlledAria.setAttribute("aria-hidden", "true");
targetBtn.setAttribute("aria-expanded", "false");
}
}
const handleLeave = () => {
dropdownBtns.forEach(button => button.setAttribute("aria-expanded", "false"));
subDropdown.forEach(ul => {
ul.classList.remove("active");
ul.setAttribute("aria-hidden", "true");
})
}
dropdownItem.forEach(item => item.addEventListener("mouseleave", handleLeave));
dropdownBtns.forEach(button => button.addEventListener("click", handleClick));
ul {
list-style: none;
padding: 0;
}
button {
background: transparent;
border: none;
width: 100%;
font-family: inherit;
font-size: inherit;
cursor: pointer;
}
a, button {
display: block;
padding: 10px;
border-bottom: 1px solid #ccc;
text-align: center;
}
a {
text-decoration: none;
color: inherit;
}
.dropdown {
display: none;
}
.dropdown-item:hover .dropdown {
display: block;
}
.sub-dropdown {
display: none;
}
.sub-dropdown.active {
display: block;
}
<ul>
<li class="dropdown-item">
<a href="#">hover item</a>
<ul class="dropdown">
<li>
<button class="dropdown-button" aria-controls="dropdown1" aria-expanded="false">click item</button>
<ul id="dropdown1" class="sub-dropdown" aria-hidden="true">
<li><a href="#">sub link</a></li>
<li><a href="#">sub link</a></li>
<li><a href="#">sub link</a></li>
<li><a href="#">sub link</a></li>
<li><a href="#">sub link</a></li>
</ul>
</li>
<li><a href="#">standard link</a></li>
</ul>
</li>
<ul>
我找到了以下代码并对其进行了修改以反映我的需要。嵌套下拉菜单完美运行
.parent {display: block;position: relative;float: left;line-height:30px;background-color: #1D3567;}
.parent a{margin: 10px;color: #FFFFFF;text-decoration: none;}
.parent:hover > ul {display:block;position:absolute;}
.child {display: none;}
.child li {background-color: #1D3567;line-height: 30px;border-bottom:#CCC 1px solid;border-right:#CCC 1px solid; width:100%;}
.child li a{color: #FFFFFF;}
ul{list-style-type: none;margin: 0;padding: 0px; min-width:15em;}
ul ul ul{left: 100%;top: 0;margin-left:1px;}
li:hover {background-color: #95B4CA;}
.parent li:hover {background-color: #95B4CA;}
<ul id="nav_ul">
<li class="parent"><a href="#">Home</a></li>
<li class="parent"><a href="URL">Outlook Web</a></li>
<li class="parent"><a href="#">Production</a>
<ul class="child">
<li class="parent"><a href="URL">South</a></li>
<li class="parent"><a href="URL">Enclosure Systems</a></li>
<li class="parent"><a href="URL">South</a></li>
<li class="parent"><a href="http:">Factory Andon</a></li>
<li class="parent"><a href="http:">Web Docs</a></li>
</ul>
</li>
<li class="parent"><a href="#">IT</a>
<ul class="child">
<li><a href="http://kb">Knowledge Base</a></li>
<li><a href="http:/">Submit a Ticket</a></li>
<li class="parent"><a href="http:">Archived Links</a></li>
</ul>
</li>
<li class="parent"><a href="#">Office Directories</a>
<ul class="child">
<li><a href="http://">Hennig</a></li>
<li><a href="http:/">AME</a></li>
</ul>
</li>
<li class="parent"><a href="ht">Hennig Parts</a></li>
<li class="parent"><a href="">Factory Andon</a></li>
<li class="parent"><a href="https:">Business Cards</a></li>
<li class="parent"><a href="#">Reports</a>
<ul class="child">
<li class="parent"><a href="#">Global Shop<span class="expand">»</span></a>
<ul class="child">
<li><a href="inventory">Inventory Report</a></li>
<li><a href="sales.">Sales Report</a></li>
<li><a href="quotes">Quotes Report</a></li>
<li><a href="workOrder">Work Order Report</a></li>
<li><a href="prtUsed">Part Where Used Report</a></li>
</ul>
</li>
<li class="parent"><a href="#">Ndustrios<span class="expand">»</span></a>
</li>
</ul>
</li>
我正在尝试在我的导航中制作一个嵌套菜单 header。在 Reports 下应该有两个菜单项 Global Shop 和 Ndustrios。然后,如果我将鼠标悬停在其中任何一个上,应该会显示更多项目。目前,报告下发生的是悬停时显示在其下方的所有选项。所以它显示:全球商店、库存、销售订单等。但 Ndustrios 没有出现。
这是我尝试过的:
#nav_ul {
list-style-type: none;
margin: 0;
padding: 0;
overflow: hidden;
background-color: #1D3567;
text-align: center;
}
li {
display: inline-block;
}
li a,
.dropbtn {
display: inline-block;
color: white;
text-align: center;
padding: 24px 16px;
text-decoration: none;
}
.dropdown {
display: inline-block;
}
.dropdown-content {
display: none;
position: absolute;
background-color: #1D3567;
min-width: 160px;
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
z-index: 1;
}
.dropdown-content a {
color: White;
padding: 12px 16px;
text-decoration: none;
display: block;
text-align: left;
}
.dropdown:hover .dropdown-content {
display: block;
}
.dropdown-content ul {
display: none;
position: absolute;
left: 100%;
top: 75;
}
.dropdown-content:hover ul {
display: block;
}
<nav>
<ul id="nav_ul">
<li class="dropdown">
<a href="#Reports">Reports</a>
<div class="dropdown-content">
<a href="#GS">Global Shop</a>
<div class="dropdown-content">
<a href="Inventory.html">Inventory</a>
<a href="sales.html">Sales Orders</a>
<a href="quotes.html">Quotes</a>
<a href="workOrder.html">Work Orders</a>
<a href="prtUsed.html">Part Where Used</a>
</div>
<a href="#ND">Ndustrios</a>
</div>
</li>
</ul>
<nav>
您需要对 HTML 进行一些重组,并在 li 中使用另一个列表来包含更多链接。但是,您仍然会遇到一个非常严重的问题。如果您不再悬停子菜单项并且列表变短,那么您将不再悬停任何内容。例如:将鼠标悬停在报告上,然后是全球商店,然后尝试将鼠标悬停在 Ndustrios 上。你不能这样做,因为一旦你离开下拉子<li>
,列表就会缩小,让你一无所有。你有两个选择。 1. 将 Ndustrios 放在下拉菜单上方或 2. 使下拉菜单出现在点击而不是悬停时
#nav_ul {
list-style-type: none;
margin: 0;
padding: 0;
overflow: hidden;
background-color: #1D3567;
text-align: center;
}
li a,
.dropbtn {
display: inline-block;
color: white;
text-align: center;
padding: 24px 16px;
text-decoration: none;
}
.dropdown {
display: inline-block;
}
.dropdown-content {
display: none;
position: absolute;
background-color: #1D3567;
min-width: 160px;
z-index: 1;
list-style: none;
}
.dropdown-content a {
color: White;
padding: 12px 16px;
text-decoration: none;
display: block;
text-align: left;
}
.dropdown-sub-list{
display: none;
list-style: none;
margin: 0;
}
.dropdown:hover > .dropdown-content {
display: block;
}
.dropdown-sub:hover > .dropdown-sub-list {
display: block;
}
<nav>
<ul id="nav_ul">
<li class="dropdown">
<a href="#Reports">Reports</a>
<ul class="dropdown-content">
<li class="dropdown-sub">
<a href="#GS">Global Shop</a>
<ul class="dropdown-sub-list">
<li><a href="Inventory.html">Inventory</a></li>
<li><a href="sales.html">Sales Orders</a></li>
<li><a href="quotes.html">Quotes</a></li>
<li><a href="workOrder.html">Work Orders</a></li>
<li><a href="prtUsed.html">Part Where Used</a></li>
</ul>
</li>
<li><a href="#ND">Ndustrios</a></li>
</ul>
</li>
</ul>
</nav>
如果您对在下拉菜单中使用下拉菜单死心塌地,这里有一个悬停单击下拉组合的简单示例。如果您愿意使用此方法,也可以使顶级下拉菜单可点击。
const dropdownBtns = document.querySelectorAll(".dropdown-button");
const dropdownItem = document.querySelectorAll(".dropdown-item");
const subDropdown = document.querySelectorAll(".sub-dropdown");
const handleClick = (event) => {
const targetBtn = event.target;
const ariaExpanded = targetBtn.getAttribute("aria-expanded");
const ariaControls = targetBtn.getAttribute("aria-controls");
const controlledAria = document.getElementById(ariaControls);
if(ariaExpanded === "false") {
controlledAria.classList.add("active");
controlledAria.setAttribute("aria-hidden", "false");
targetBtn.setAttribute("aria-expanded", "true");
} else if (ariaExpanded === "true") {
controlledAria.classList.remove("active");
controlledAria.setAttribute("aria-hidden", "true");
targetBtn.setAttribute("aria-expanded", "false");
}
}
const handleLeave = () => {
dropdownBtns.forEach(button => button.setAttribute("aria-expanded", "false"));
subDropdown.forEach(ul => {
ul.classList.remove("active");
ul.setAttribute("aria-hidden", "true");
})
}
dropdownItem.forEach(item => item.addEventListener("mouseleave", handleLeave));
dropdownBtns.forEach(button => button.addEventListener("click", handleClick));
ul {
list-style: none;
padding: 0;
}
button {
background: transparent;
border: none;
width: 100%;
font-family: inherit;
font-size: inherit;
cursor: pointer;
}
a, button {
display: block;
padding: 10px;
border-bottom: 1px solid #ccc;
text-align: center;
}
a {
text-decoration: none;
color: inherit;
}
.dropdown {
display: none;
}
.dropdown-item:hover .dropdown {
display: block;
}
.sub-dropdown {
display: none;
}
.sub-dropdown.active {
display: block;
}
<ul>
<li class="dropdown-item">
<a href="#">hover item</a>
<ul class="dropdown">
<li>
<button class="dropdown-button" aria-controls="dropdown1" aria-expanded="false">click item</button>
<ul id="dropdown1" class="sub-dropdown" aria-hidden="true">
<li><a href="#">sub link</a></li>
<li><a href="#">sub link</a></li>
<li><a href="#">sub link</a></li>
<li><a href="#">sub link</a></li>
<li><a href="#">sub link</a></li>
</ul>
</li>
<li><a href="#">standard link</a></li>
</ul>
</li>
<ul>
我找到了以下代码并对其进行了修改以反映我的需要。嵌套下拉菜单完美运行
.parent {display: block;position: relative;float: left;line-height:30px;background-color: #1D3567;}
.parent a{margin: 10px;color: #FFFFFF;text-decoration: none;}
.parent:hover > ul {display:block;position:absolute;}
.child {display: none;}
.child li {background-color: #1D3567;line-height: 30px;border-bottom:#CCC 1px solid;border-right:#CCC 1px solid; width:100%;}
.child li a{color: #FFFFFF;}
ul{list-style-type: none;margin: 0;padding: 0px; min-width:15em;}
ul ul ul{left: 100%;top: 0;margin-left:1px;}
li:hover {background-color: #95B4CA;}
.parent li:hover {background-color: #95B4CA;}
<ul id="nav_ul">
<li class="parent"><a href="#">Home</a></li>
<li class="parent"><a href="URL">Outlook Web</a></li>
<li class="parent"><a href="#">Production</a>
<ul class="child">
<li class="parent"><a href="URL">South</a></li>
<li class="parent"><a href="URL">Enclosure Systems</a></li>
<li class="parent"><a href="URL">South</a></li>
<li class="parent"><a href="http:">Factory Andon</a></li>
<li class="parent"><a href="http:">Web Docs</a></li>
</ul>
</li>
<li class="parent"><a href="#">IT</a>
<ul class="child">
<li><a href="http://kb">Knowledge Base</a></li>
<li><a href="http:/">Submit a Ticket</a></li>
<li class="parent"><a href="http:">Archived Links</a></li>
</ul>
</li>
<li class="parent"><a href="#">Office Directories</a>
<ul class="child">
<li><a href="http://">Hennig</a></li>
<li><a href="http:/">AME</a></li>
</ul>
</li>
<li class="parent"><a href="ht">Hennig Parts</a></li>
<li class="parent"><a href="">Factory Andon</a></li>
<li class="parent"><a href="https:">Business Cards</a></li>
<li class="parent"><a href="#">Reports</a>
<ul class="child">
<li class="parent"><a href="#">Global Shop<span class="expand">»</span></a>
<ul class="child">
<li><a href="inventory">Inventory Report</a></li>
<li><a href="sales.">Sales Report</a></li>
<li><a href="quotes">Quotes Report</a></li>
<li><a href="workOrder">Work Order Report</a></li>
<li><a href="prtUsed">Part Where Used Report</a></li>
</ul>
</li>
<li class="parent"><a href="#">Ndustrios<span class="expand">»</span></a>
</li>
</ul>
</li>