菜单悬停未正确关闭
Menu hover doesn't close properly
我有一个带有下拉菜单的菜单,其中有另一个下拉菜单。如果我将鼠标悬停在第一个下拉菜单上,它会展开。它是通过 css 完成的。但是当我为子菜单尝试 css 时,它不起作用。所以我添加了 javascript 来控制悬停时打开子菜单。这行得通,但直到我将鼠标从第一个下拉列表中移开后,子菜单才会关闭。我希望它在鼠标离开子菜单项时关闭。
为了更好地理解这一点,请看我的jsfiddle。打开菜单并将鼠标悬停在商店项目上,它将展开。然后将鼠标悬停在“更多选项”项目上,它将展开。如果将鼠标向上移动到 Sub 2,则更多选项应该会关闭但不会。我知道我有 javascript 查看 container-sub-menu1 以关闭它并且它正在按编码工作。但是当我尝试使用 sub-menu1 时它不起作用。有人可以展示当鼠标不在子菜单上时如何关闭子菜单吗?
$("#sub-menu1").on("mouseenter", function() {
// make sure it is not shown:
if (!$(this).parent().hasClass("show")) {
$(this).click();
}
});
$("#container-sub-menu1").on("mouseleave", function() {
// make sure it is shown:
if ($(this).hasClass("show")) {
$(this).children('.dropdown-toggle').first().click();
}
});
.dropdown:hover>.dropdown-menu {
display: block;
}
.dropdown:hover>.ul.li.dropdown-submenu {
display: block;
}
.nav-subul {
margin-left: 100px;
}
.dropdown-item {
padding-left: 10px;
}
.dropdown-item::first-line {
padding-top: 0px;
}
.dropdown-submenu {
position: relative;
padding-bottom: -10px;
}
.dropdown-submenu>.dropdown-menu {
position: absolute;
top: -20px;
left: 54px;
}
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" rel="stylesheet" />
<div id="mainmenu-container" class="col-sm-<?php echo $content_width; ?> mainmenu-container">
<nav class="navbar navbar-expand-lg navbar-light bg-custom">
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNavDropdown">
<ul class="navbar-nav">
<li class="nav-item active">
<a class="nav-link" href="#">Home<span class="sr-only">(current)</span></a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Shop
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink" id="container-sub-menu1">
<a class="dropdown-item" href="#">Sub 1</a>
<a class="dropdown-item" href="#">Sub 2</a>
<a class="dropdown-item dropdown-toggle" id="sub-menu1" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
More Options
</a>
<div class="dropdown-submenu" aria-labelledby="navbarDropdownMenuLink">
<ul class="navbar-nav nav-subul">
<li class="nav-item dropdown">
<div class="dropdown dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
<a class="dropdown-item" href="#">Next 1</a>
<a class="dropdown-item" href="#">Next 2</a>
</div>
</li>
</ul>
</div>
</div>
</li>
</ul>
</div>
</nav>
</div>
Jquery 当鼠标不悬停在子菜单上时关闭子菜单:
$("#sub-menu1").on("mouseleave", function () {
// make sure it is not shown:
if (!$(this).parent().hasClass("hide")) {
$(this).click();
}
});
演示:
$("#sub-menu1").on("mouseenter", function() {
// make sure it is not shown:
if (!$(this).parent().hasClass("show")) {
$(this).click();
}
});
$("#sub-menu1").on("mouseleave", function() {
// make sure it is not shown:
if (!$(this).parent().hasClass("hide")) {
$(this).click();
}
});
$("#container-sub-menu1").on("mouseleave", function() {
// make sure it is shown:
if ($(this).hasClass("show")) {
$(this).children('.dropdown-toggle').first().click();
}
});
.dropdown-menu{
top:75% !important;
}
.dropdown:hover>.dropdown-menu {
display: block;
}
.dropdown:hover>.ul.li.dropdown-submenu {
display: block;
}
.nav-subul {
margin-left: 100px;
}
.dropdown-item {
padding-left: 10px;
}
.dropdown-item::first-line {
padding-top: 0px;
}
.dropdown-submenu {
position: relative;
padding-bottom: -10px;
}
.dropdown-submenu>.dropdown-menu {
position: absolute;
top: -20px;
left: 54px;
}
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" rel="stylesheet" />
<div id="mainmenu-container" class="col-sm-<?php echo $content_width; ?> mainmenu-container">
<nav class="navbar navbar-expand-lg navbar-light bg-custom">
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNavDropdown">
<ul class="navbar-nav">
<li class="nav-item active">
<a class="nav-link" href="#">Home<span class="sr-only">(current)</span></a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Shop
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink" id="container-sub-menu1">
<a class="dropdown-item" href="#">Sub 1</a>
<a class="dropdown-item" href="#">Sub 2</a>
<a class="dropdown-item dropdown-toggle" id="sub-menu1" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
More Options
</a>
<div class="dropdown-submenu" aria-labelledby="navbarDropdownMenuLink">
<ul class="navbar-nav nav-subul">
<li class="nav-item dropdown">
<div class="dropdown dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
<a class="dropdown-item" href="#">Next 1</a>
<a class="dropdown-item" href="#">Next 2</a>
</div>
</li>
</ul>
</div>
</div>
</li>
</ul>
</div>
</nav>
</div>
使用css的替代解决方案:
无需 jquery 即可在悬停时显示下拉菜单,您可以简单地使用 css 来显示下拉菜单。
.dropdown-item.dropdown-toggle:hover ~ .dropdown-submenu .navbar-nav .dropdown {
display: block;
}
.dropdown-menu{
top:75% !important;
}
.dropdown:hover>.dropdown-menu {
display: block;
}
.dropdown:hover>.ul.li.dropdown-submenu {
display: block;
}
.nav-subul {
margin-left: 100px;
}
.dropdown-item {
padding-left: 10px;
}
.dropdown-item::first-line {
padding-top: 0px;
}
.dropdown-submenu {
position: relative;
padding-bottom: -10px;
}
.dropdown-submenu>.dropdown-menu {
position: absolute;
top: -20px;
left: 54px;
}
.dropdown-item.dropdown-toggle:hover ~ .dropdown-submenu .navbar-nav .dropdown {
display: block;
}
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" rel="stylesheet" />
<div id="mainmenu-container" class="col-sm-<?php echo $content_width; ?> mainmenu-container">
<nav class="navbar navbar-expand-lg navbar-light bg-custom">
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNavDropdown">
<ul class="navbar-nav">
<li class="nav-item active">
<a class="nav-link" href="#">Home<span class="sr-only">(current)</span></a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Shop
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink" id="container-sub-menu1">
<a class="dropdown-item" href="#">Sub 1</a>
<a class="dropdown-item" href="#">Sub 2</a>
<a class="dropdown-item dropdown-toggle" id="sub-menu1" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
More Options
</a>
<div class="dropdown-submenu" aria-labelledby="navbarDropdownMenuLink">
<ul class="navbar-nav nav-subul">
<li class="nav-item dropdown">
<div class="dropdown dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
<a class="dropdown-item" href="#">Next 1</a>
<a class="dropdown-item" href="#">Next 2</a>
</div>
</li>
</ul>
</div>
</div>
</li>
</ul>
</div>
</nav>
</div>
我有一个带有下拉菜单的菜单,其中有另一个下拉菜单。如果我将鼠标悬停在第一个下拉菜单上,它会展开。它是通过 css 完成的。但是当我为子菜单尝试 css 时,它不起作用。所以我添加了 javascript 来控制悬停时打开子菜单。这行得通,但直到我将鼠标从第一个下拉列表中移开后,子菜单才会关闭。我希望它在鼠标离开子菜单项时关闭。
为了更好地理解这一点,请看我的jsfiddle。打开菜单并将鼠标悬停在商店项目上,它将展开。然后将鼠标悬停在“更多选项”项目上,它将展开。如果将鼠标向上移动到 Sub 2,则更多选项应该会关闭但不会。我知道我有 javascript 查看 container-sub-menu1 以关闭它并且它正在按编码工作。但是当我尝试使用 sub-menu1 时它不起作用。有人可以展示当鼠标不在子菜单上时如何关闭子菜单吗?
$("#sub-menu1").on("mouseenter", function() {
// make sure it is not shown:
if (!$(this).parent().hasClass("show")) {
$(this).click();
}
});
$("#container-sub-menu1").on("mouseleave", function() {
// make sure it is shown:
if ($(this).hasClass("show")) {
$(this).children('.dropdown-toggle').first().click();
}
});
.dropdown:hover>.dropdown-menu {
display: block;
}
.dropdown:hover>.ul.li.dropdown-submenu {
display: block;
}
.nav-subul {
margin-left: 100px;
}
.dropdown-item {
padding-left: 10px;
}
.dropdown-item::first-line {
padding-top: 0px;
}
.dropdown-submenu {
position: relative;
padding-bottom: -10px;
}
.dropdown-submenu>.dropdown-menu {
position: absolute;
top: -20px;
left: 54px;
}
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" rel="stylesheet" />
<div id="mainmenu-container" class="col-sm-<?php echo $content_width; ?> mainmenu-container">
<nav class="navbar navbar-expand-lg navbar-light bg-custom">
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNavDropdown">
<ul class="navbar-nav">
<li class="nav-item active">
<a class="nav-link" href="#">Home<span class="sr-only">(current)</span></a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Shop
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink" id="container-sub-menu1">
<a class="dropdown-item" href="#">Sub 1</a>
<a class="dropdown-item" href="#">Sub 2</a>
<a class="dropdown-item dropdown-toggle" id="sub-menu1" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
More Options
</a>
<div class="dropdown-submenu" aria-labelledby="navbarDropdownMenuLink">
<ul class="navbar-nav nav-subul">
<li class="nav-item dropdown">
<div class="dropdown dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
<a class="dropdown-item" href="#">Next 1</a>
<a class="dropdown-item" href="#">Next 2</a>
</div>
</li>
</ul>
</div>
</div>
</li>
</ul>
</div>
</nav>
</div>
Jquery 当鼠标不悬停在子菜单上时关闭子菜单:
$("#sub-menu1").on("mouseleave", function () {
// make sure it is not shown:
if (!$(this).parent().hasClass("hide")) {
$(this).click();
}
});
演示:
$("#sub-menu1").on("mouseenter", function() {
// make sure it is not shown:
if (!$(this).parent().hasClass("show")) {
$(this).click();
}
});
$("#sub-menu1").on("mouseleave", function() {
// make sure it is not shown:
if (!$(this).parent().hasClass("hide")) {
$(this).click();
}
});
$("#container-sub-menu1").on("mouseleave", function() {
// make sure it is shown:
if ($(this).hasClass("show")) {
$(this).children('.dropdown-toggle').first().click();
}
});
.dropdown-menu{
top:75% !important;
}
.dropdown:hover>.dropdown-menu {
display: block;
}
.dropdown:hover>.ul.li.dropdown-submenu {
display: block;
}
.nav-subul {
margin-left: 100px;
}
.dropdown-item {
padding-left: 10px;
}
.dropdown-item::first-line {
padding-top: 0px;
}
.dropdown-submenu {
position: relative;
padding-bottom: -10px;
}
.dropdown-submenu>.dropdown-menu {
position: absolute;
top: -20px;
left: 54px;
}
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" rel="stylesheet" />
<div id="mainmenu-container" class="col-sm-<?php echo $content_width; ?> mainmenu-container">
<nav class="navbar navbar-expand-lg navbar-light bg-custom">
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNavDropdown">
<ul class="navbar-nav">
<li class="nav-item active">
<a class="nav-link" href="#">Home<span class="sr-only">(current)</span></a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Shop
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink" id="container-sub-menu1">
<a class="dropdown-item" href="#">Sub 1</a>
<a class="dropdown-item" href="#">Sub 2</a>
<a class="dropdown-item dropdown-toggle" id="sub-menu1" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
More Options
</a>
<div class="dropdown-submenu" aria-labelledby="navbarDropdownMenuLink">
<ul class="navbar-nav nav-subul">
<li class="nav-item dropdown">
<div class="dropdown dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
<a class="dropdown-item" href="#">Next 1</a>
<a class="dropdown-item" href="#">Next 2</a>
</div>
</li>
</ul>
</div>
</div>
</li>
</ul>
</div>
</nav>
</div>
使用css的替代解决方案: 无需 jquery 即可在悬停时显示下拉菜单,您可以简单地使用 css 来显示下拉菜单。
.dropdown-item.dropdown-toggle:hover ~ .dropdown-submenu .navbar-nav .dropdown {
display: block;
}
.dropdown-menu{
top:75% !important;
}
.dropdown:hover>.dropdown-menu {
display: block;
}
.dropdown:hover>.ul.li.dropdown-submenu {
display: block;
}
.nav-subul {
margin-left: 100px;
}
.dropdown-item {
padding-left: 10px;
}
.dropdown-item::first-line {
padding-top: 0px;
}
.dropdown-submenu {
position: relative;
padding-bottom: -10px;
}
.dropdown-submenu>.dropdown-menu {
position: absolute;
top: -20px;
left: 54px;
}
.dropdown-item.dropdown-toggle:hover ~ .dropdown-submenu .navbar-nav .dropdown {
display: block;
}
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" rel="stylesheet" />
<div id="mainmenu-container" class="col-sm-<?php echo $content_width; ?> mainmenu-container">
<nav class="navbar navbar-expand-lg navbar-light bg-custom">
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNavDropdown">
<ul class="navbar-nav">
<li class="nav-item active">
<a class="nav-link" href="#">Home<span class="sr-only">(current)</span></a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Shop
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink" id="container-sub-menu1">
<a class="dropdown-item" href="#">Sub 1</a>
<a class="dropdown-item" href="#">Sub 2</a>
<a class="dropdown-item dropdown-toggle" id="sub-menu1" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
More Options
</a>
<div class="dropdown-submenu" aria-labelledby="navbarDropdownMenuLink">
<ul class="navbar-nav nav-subul">
<li class="nav-item dropdown">
<div class="dropdown dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
<a class="dropdown-item" href="#">Next 1</a>
<a class="dropdown-item" href="#">Next 2</a>
</div>
</li>
</ul>
</div>
</div>
</li>
</ul>
</div>
</nav>
</div>