【问题标题】:Menu hover doesn't close properly菜单悬停未正确关闭
【发布时间】:2019-09-07 11:08:23
【问题描述】:

我有一个带有下拉菜单的菜单,其中包含另一个下拉菜单。如果我将鼠标悬停在第一个下拉列表上,它会展开。它是通过 css 完成的。但是当我尝试子菜单的css时,它不起作用。所以我添加了javascript来控制在悬停时打开子菜单。这行得通,但是直到我将鼠标移出第一个下拉菜单后,子菜单才会关闭。一旦鼠标离开子菜单项,我希望它关闭。

为了更好地理解这一点,请查看我的jsfiddle。打开菜单并将鼠标悬停在 Shop 项目上,它将展开。然后将鼠标悬停在更多选项项目上,它将展开。如果您将鼠标向上移动到 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>

【问题讨论】:

    标签: bootstrap-4 menu hover dropdown


    【解决方案1】:

    当鼠标没有悬停在子菜单上时 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>

    【讨论】:

    • 谢谢。这当然有帮助。我根本不知道 ~ 符号。我曾尝试在 FF 中使用复制路径,但它不起作用。但是在您的示例中,如果您将鼠标悬停在“更多选项”项上以显示子项,然后向下移动鼠标以选择其中之一,则菜单有时会关闭,具体取决于鼠标的移动方式。如果鼠标悬停在其中一个项目上,有没有办法不关闭下拉菜单?
    • @user3052443 现在你尝试菜单不会关闭,这是因为下拉菜单和子项之间的距离。 .dropdown-menu{ top:75% !important;} 我添加了这个css,它会减少下拉菜单和子项之间的距离,现在它不会关闭。
    • @user3052443 正如你所问:如果鼠标悬停在其中一个项目上,有没有办法不关闭下拉菜单?你可以这样做,但你必须使用脚本。它会变得更复杂,你可以简单地使用 css。
    • 如果我的解决方案运行良好,你可以接受@user3052443
    • 感谢您的帮助。我无法让代码做我想做的事,所以我会查看其他菜单,因为它的 css 在我之上。但是您回答了我的主要问题,因此我将其标记为已接受。再次感谢。
    猜你喜欢
    • 2013-02-25
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    相关资源
    最近更新 更多