一尘不染

如何在Bootstrap v4中实现导航栏下拉悬浮?

css

我对新的引导程序版本有些困惑,因为它们将下拉菜单更改为div:

<nav class="navbar navbar-toggleable-md navbar-light bg-faded">
  <button class="navbar-toggler navbar-toggler-right" 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>
  <a class="navbar-brand" href="#">Navbar</a>
  <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">
        <a class="nav-link" href="#">Features</a>
      </li>
      <li class="nav-item">
        <a class="nav-link" href="#">Pricing</a>
      </li>
      <li class="nav-item dropdown">
        <a class="nav-link dropdown-toggle" href="http://example.com" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
          Dropdown link
        </a>
        <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
          <a class="dropdown-item" href="#">Action</a>
          <a class="dropdown-item" href="#">Another action</a>
          <a class="dropdown-item" href="#">Something else here</a>
        </div>
      </li>
    </ul>
  </div>
</nav>

你们是否有想法在该代码段的“下拉列表”链接中获得一个悬停下拉列表,而不添加其他脚本代码(仅CSS和引导程序中的脚本)?我已经看到了引导css类,并且无法与引导V3中的类相关(我无需在V3中添加jquery即可完成此操作)。


阅读 346

收藏
2020-05-16

共1个答案

一尘不染

简单的仅CSS 解决方案:

.dropdown:hover>.dropdown-menu {
  display: block;
}

当单击时,它仍将类show切换到它(并且不再悬停时将保持打开状态)。


为了解决这个 正确的
方法是使用保留基于指针设备的事件和属性:jQuery的mouseentermouseleave:hover。如果工作顺利,直觉,而不是干扰
与下拉如何工作的触摸设备。尝试一下,让我知道它是否适合您:

完整 的jQuery的解决方案触摸 不变):

v4.1.2之前的解决方案( 已弃用 ):

$('body').on('mouseenter mouseleave','.dropdown',function(e){
  var _d=$(e.target).closest('.dropdown');
  if (e.type === 'mouseenter')_d.addClass('show');
  setTimeout(function(){
    _d.toggleClass('show', _d.is(':hover'));
    $('[data-toggle="dropdown"]', _d).attr('aria-expanded',_d.is(':hover'));
  },300);
});



$('body').on('mouseenter mouseleave','.dropdown',function(e){

  var _d=$(e.target).closest('.dropdown');

  if (e.type === 'mouseenter')_d.addClass('show');

  setTimeout(function(){

    _d.toggleClass('show', _d.is(':hover'));

    $('[data-toggle="dropdown"]', _d).attr('aria-expanded',_d.is(':hover'));

  },300);

});



/* this is not needed, just prevents page reload when a dd link is clicked */

$('.dropdown a').on('click tap', e => e.preventDefault())


<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" rel="stylesheet"/>

<script src="https://code.jquery.com/jquery-3.1.1.slim.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js"></script>

<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/js/bootstrap.min.js"></script>



<nav class="navbar navbar-toggleable-md navbar-light bg-faded">

  <button class="navbar-toggler navbar-toggler-right" 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>

  <a class="navbar-brand" href>Navbar</a>

  <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">

        <a class="nav-link" href>Features</a>

      </li>

      <li class="nav-item">

        <a class="nav-link" href>Pricing</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">

          Dropdown link

        </a>

        <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">

          <a class="dropdown-item" href>Action</a>

          <a class="dropdown-item" href>Another action</a>

          <a class="dropdown-item" href>Something else here</a>

        </div>

      </li>

    </ul>

  </div>

</nav>

V4.1.2
shiplist
推出这种变化来的下拉列表中是如何工作的,使得以上不再起作用的解决方案。
这是在 v4.1.2* 及更高版本中悬停时打开下拉列表的 最新 解决方案: *

function toggleDropdown (e) {
  const _d = $(e.target).closest('.dropdown'),
    _m = $('.dropdown-menu', _d);
  setTimeout(function(){
    const shouldOpen = e.type !== 'click' && _d.is(':hover');
    _m.toggleClass('show', shouldOpen);
    _d.toggleClass('show', shouldOpen);
    $('[data-toggle="dropdown"]', _d).attr('aria-expanded', shouldOpen);
  }, e.type === 'mouseleave' ? 300 : 0);
}

$('body')
  .on('mouseenter mouseleave','.dropdown',toggleDropdown)
  .on('click', '.dropdown-menu a', toggleDropdown);



function toggleDropdown (e) {

  const _d = $(e.target).closest('.dropdown'),

      _m = $('.dropdown-menu', _d);

  setTimeout(function(){

    const shouldOpen = e.type !== 'click' && _d.is(':hover');

    _m.toggleClass('show', shouldOpen);

    _d.toggleClass('show', shouldOpen);

    $('[data-toggle="dropdown"]', _d).attr('aria-expanded', shouldOpen);

  }, e.type === 'mouseleave' ? 300 : 0);

}



$('body')

  .on('mouseenter mouseleave','.dropdown',toggleDropdown)

  .on('click', '.dropdown-menu a', toggleDropdown);



/* not needed, prevents page reload for SO example on menu link clicked */

$('.dropdown a').on('click tap', e => e.preventDefault())


<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet"/>

<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>

<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>



<nav class="navbar navbar-expand-lg navbar-light bg-light">

  <a class="navbar-brand" href="#">Navbar</a>

  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">

    <span class="navbar-toggler-icon"></span>

  </button>



  <div class="collapse navbar-collapse" id="navbarSupportedContent">

    <ul class="navbar-nav mr-auto">

      <li class="nav-item active">

        <a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>

      </li>

      <li class="nav-item">

        <a class="nav-link" href="#">Link</a>

      </li>

      <li class="nav-item dropdown">

        <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">

          Dropdown

        </a>

        <div class="dropdown-menu" aria-labelledby="navbarDropdown">

          <a class="dropdown-item" href="#">Action</a>

          <a class="dropdown-item" href="#">Another action</a>

          <div class="dropdown-divider"></div>

          <a class="dropdown-item" href="#">Something else here</a>

        </div>

      </li>

      <li class="nav-item">

        <a class="nav-link disabled" href="#">Disabled</a>

      </li>

    </ul>

    <form class="form-inline my-2 my-lg-0">

      <input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search">

      <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>

    </form>

  </div>

</nav>

重要说明: 如果使用jQuery解决方案,则删除CSS很重要(否则,.dropdown-toggle单击或单击菜单选项时下拉列表不会关闭)。

2020-05-16