【问题标题】:How to make Twitter Bootstrap menu dropdown on hover rather than click如何在悬停而不是单击时制作 Twitter Bootstrap 菜单下拉菜单
【发布时间】:2012-02-11 06:39:36
【问题描述】:

我想让我的 Bootstrap 菜单在悬停时自动下拉,而不必点击菜单标题。我还想去掉菜单标题旁边的小箭头。

【问题讨论】:

  • 有一个解决方案,所以 mikko 的答案是正确的,但现在有一个专门针对这种情况的插件。 bootstrap-hover-dropdown
  • 查看我新发布的正确插件,它可以防止以下 CSS 和 js 解决方案的问题,并且可以在 iOS 和带有触摸事件的现代桌面浏览器上正常工作。即使是 aria 属性也可以正常工作:github.com/istvan-ujjmeszaros/bootstrap-dropdown-hover
  • 我用引导导航栏制作了一个纯 CSS3 下拉菜单,在 CodePen Pure CSS3 Dropdown 上查看它
  • 如果您真的需要它,请三思而后行? Bootstrap 用于自适应站点。这意味着它们也将用于带有触摸控制的设备。这就是为什么它是这样设计的。触摸屏上没有“悬停”。

标签: css drop-down-menu twitter-bootstrap


【解决方案1】:

Bootstrap 版本 4 和 5 解决方案。 (兼容 IE)

这些是使用 mouseover 和 mouseleave 事件以及一些屏幕宽度检查的完整解决方案。这比纯 CSS 解决方案要好。

Bootstrap v5 - 纯 JS(用于 webpack)

export class BootstrapOpenMenuHover {

/**
 * Constructor.
 */
constructor() {
  this.windowWidth = window.innerWidth;
  this.mobileBreakPoint = 991; // Put your menu break point here, when it switches to a hamburger icon.
  this.dropdownNavItems = document.querySelectorAll(".dropdown-toggle.nav-link");
  this.dropdownMenuItems = document.querySelectorAll(".dropdown-menu");

  this.setEventListeners();
}

/**
 * Set all of our event listeners.
 */
setEventListeners() {
  const _self = this;

  // To be safe set the width once the dom is loaded.
  window.addEventListener('load',  function () {
    _self.windowWidth = window.innerWidth;
  });

  // Keep track of the width in the event of a resize.
  window.addEventListener('resize',  function () {
    _self.windowWidth = window.innerWidth;
  });

  // Bind our hover events.
  if (_self.dropdownNavItems !== null)  {
    for (let i = 0; i < _self.dropdownNavItems.length; i++) {

      // On mouse enter.
      _self.dropdownNavItems[i].addEventListener('mouseenter', function () {
        if (_self.windowWidth >= _self.mobileBreakPoint) {
          this.classList.add('show');
          this.ariaExpanded = true;
          this.dataset.bsToggle = null;

          // Update the .dropdown-menu
          this.nextElementSibling.classList.add('show');
          this.nextElementSibling.dataset.bsPopper = 'none';
        }
      });

      // On mouse leave.
      _self.dropdownNavItems[i].addEventListener('mouseleave', function () {
        if (_self.windowWidth >= _self.mobileBreakPoint) {
          this.classList.remove('show');
          this.ariaExpanded = false;
          this.dataset.bsToggle = 'dropdown';

          // Update the .dropdown-menu
          this.nextElementSibling.classList.remove('show');
          this.nextElementSibling.dataset.bsPopper = null;
        }
      });
    }
  }

  // Bind events to .dropdown-menu items.
  if (_self.dropdownMenuItems !== null) {
    for (let i = 0; i < _self.dropdownMenuItems.length; i++) {
      // On mouse enter.
      _self.dropdownMenuItems[i].addEventListener('mouseenter', function () {
        if (_self.windowWidth >= _self.mobileBreakPoint) {
          this.classList.add('show');
          this.dataset.bsPopper = 'none';

          // Update the .dropdown-toggle
          this.previousElementSibling.classList.add('show');
          this.previousElementSibling.ariaExpanded = true;
          this.previousElementSibling.dataset.bsToggle = null;
        }
      });

      // On mouse leave.
      _self.dropdownMenuItems[i].addEventListener('mouseleave', function () {
        if (_self.windowWidth >= _self.mobileBreakPoint) {
          this.classList.remove('show');
          this.dataset.bsPopper = null;

          // Update the .dropdown-toggle
          this.previousElementSibling.classList.remove('show');
          this.previousElementSibling.ariaExpanded = false;
          this.previousElementSibling.dataset.bsToggle = 'dropdown';
        }
      });
    }
   }
  }
 }

 const bootstrapOpenMenuHover = new BootstrapOpenMenuHover();

Bootstrap v4 解决方案

这将允许您关注顶级导航链接。

在构建时考虑了桌面和移动设备。随意更改 BREAK_POINT 变量以满足您的需要:D。

jQuery

var WINDOW_WIDTH;
var BREAK_POINT = 991;

(function ($) {

    /** Set window width onload */
    WINDOW_WIDTH = $(window).width(); // Returns width of browser viewport
    /** Set window width if the browser is resized */
    $(window).resize(function () {
        WINDOW_WIDTH = $(window).width(); // Returns width of browser viewport
    });

    /** Dropdown menu on mouseenter */
    $(".nav-item.dropdown").on('mouseenter', function () {
        console.log("mouseenter");
        if (WINDOW_WIDTH >= BREAK_POINT) {
            // Open up the dropdown
            $(this).addClass('show'); // add the class show to the li parent
            $(this).children('.nav-link').removeAttr('data-toggle'); // remove the data-toggle attribute so we can click and follow link
            $(this).children('.dropdown-menu').addClass('show'); // add the class show to the dropdown div sibling
        }
    });
    /** Dropdown menu on mouseleave */
    $(".nav-item.dropdown").on('mouseleave', function () {
        console.log("mouseleave");
        if (WINDOW_WIDTH >= BREAK_POINT) {
            // Close the dropdown
            $(this).removeClass('show'); // add the class show to the li parent
            $(this).children('.nav-link').attr('data-toggle', 'dropdown'); // remove the data-toggle attribute so we can click and follow link
            $(this).children('.dropdown-menu').removeClass('show'); // add the class show to the dropdown div sibling
        }
    });
});

CSS

@media(min-width:  768px) {
  .dropdown-menu {
    margin-top: 0; // fixes closing on slow mouse transition
  }
}

【讨论】:

  • Kash 的解决方案适用于 bootstrap 4。这个 JS 是不必要的
  • @rubenwardy 很抱歉,但我发现如果您仍然希望能够关注顶级导航链接,那么这是可行的方法。使用纯 css 解决方案将不允许您关注桌面上的顶级 lvl 导航点击。希望这是有道理的。
【解决方案2】:

这个也可以。


$('.dropdown').on('mouseover',function(){
    $(this).find('.dropdown-menu').show();
});
$('.dropdown').on('mouseleave',function(){
    $(this).find('.dropdown-menu').hide();
});

如果下拉菜单在悬停的元素之间存在间隙,则下拉菜单将立即关闭,如此 GIF 所示

为了防止这种行为,您可以为100 ms 的事件添加超时

let dropdownTimer;
$('.dropdown').on('mouseover', () => {
    clearTimeout(dropdownTimer)
    $(this).find('.dropdown-menu').show();
});
$('.dropdown').on('mouseleave', () =>{
    dropdownTimer = setTimeout(() => {
        $(this).find('.dropdown-menu').hide();
    }, 100)
});

【讨论】:

    【解决方案3】:

    只是想补充一点,如果你有多个下拉菜单(就像我一样),你应该写:

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

    它会正常工作。

    【讨论】:

    • 我的 .dropdown-menu 有 margin: 2px 0 0; 这意味着从上方缓慢的 mouseEnter 过早地隐藏了菜单。 ul.dropdown-menu{ margin-top: 0; }
    【解决方案4】:

    这对我有用:

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

    【讨论】:

    • 但是手机 - 很奇怪。
    • 菜单和下拉菜单之间的边距使这个没用。
    【解决方案5】:

    这是内置于 Bootstrap 3 中的。 只需将其添加到您的 CSS 中:

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

    【讨论】:

      【解决方案6】:

      只需三行代码即可自定义您的 CSS 样式

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

      【讨论】:

        【解决方案7】:

        除了“我的头疼”的答案(很棒):

        ul.nav li.dropdown:hover ul.dropdown-menu{
            display: block;    
        }
        

        有两个挥之不去的问题:

        1. 单击下拉链接将打开下拉菜单。它会一直保持打开状态,除非用户点击其他地方,或者将鼠标悬停在上面,从而创建一个尴尬的 UI。
        2. 下拉链接和下拉菜单之间有 1px 的边距。如果您在下拉菜单和下拉菜单之间缓慢移动,这会导致下拉菜单隐藏。

        (1) 的解决方案是从导航链接中删除“class”和“data-toggle”元素

        <a href="#">
             Dropdown
             <b class="caret"></b>
        </a>
        

        这还使您能够创建指向父页面的链接 - 这在默认实现中是不可能的。您可以将“#”替换为您想要发送给用户的任何页面。

        (2) 的解决方案是删除 .dropdown-menu 选择器上的 margin-top

        .navbar .dropdown-menu {
            margin-top: 0px;
        }
        

        【讨论】:

        • 为了修复故意点击,我刚刚删除了data-toggle="dropdown" 属性,这似乎有效。
        • nav-pill 按钮的解决方案(2):.nav-pills .dropdown-menu { margin-top: 0px; }
        • 解决我上面提到的问题 li.dropdown:hover > ul.dropdown-menu
        • 从导航链接中删除“class”和“data-toggle”属性使其无法在移动设备和平板电脑中正常工作:(
        • 如果您删除了 data-toggle="dropdown" 属性,您将无法使用键盘展开下拉菜单。所以它将不符合 508 标准。如何禁用点击但保留键盘功能?
        【解决方案8】:

        最标准的答案:

        • 支持 aria-expanded 属性
        • 支持非触控设备
        • 支持触控设备
        • 支持所有下拉菜单
        var isTouchDevice = (('ontouchstart' in window) ||
                                        (navigator.MaxTouchPoints > 0) ||
                                        (navigator.msMaxTouchPoints > 0));
        if(!isTouchDevice){
            // open dropdowns on hover on non mobile devices
            $(".dropdown").hover(function(e) {
                $('.dropdown-toggle', this).dropdown("toggle");
                e.stopPropagation();
            });
            // prevent blinkling
            $(".submenu-link").click(function(e) {
                e.stopPropagation();
            });
        }
        

        如果需要,您可以将$(".dropdown")更改为特定区域:

        $("#top-menu .dropdown")
        

        【讨论】:

        • 这将不允许导航栏的 .dropdown-toggle 元素充当普通链接。
        • @hackel 试试这个新方法!
        【解决方案9】:

        引导程序 4,2019 年

        我阅读了很多这些答案,但最终我自己做了,因为这不是我需要的。

        我有 Bootstrap 4,并希望保持点击 + 悬停 功能。此外,我只想在具有额外类“.open-on-hover”的下拉菜单上启用它。

        我还想保留 Bootstrap 的 Jquery,当它靠近页面边缘时,它会定位下拉菜单。所以我们不只是想做“显示:阻止”。我们想要完整的 Bootstrap 工作方式。所以我只是触发点击。

        逻辑是“如果是mouseenter则打开,如果是mouseleave则打开则隐藏”

        /**
         * Open Bootstrap 4 dropdown on hover
         */
        $(document).on('mouseenter mouseleave', '.dropdown.open-on-hover', function(e) 
        {
            let toggler = $(this).find('[data-toggle="dropdown"]').first();
        
            if(e.type === 'mouseenter') {
                $(toggler).trigger('click', 'open');
            } else if ($(this).children('.dropdown-menu.show').length) {
                $(toggler).trigger('click', 'close');
            }
        });
        

        html

        <div class="dropdown open-on-hover">
            <div class="btn" data-toggle="dropdown">
                Hover or click me
            </div>
            <div class="dropdown-menu">
                <a class="dropdown-item">
                    Item 1
                </a>
                <a class="dropdown-item">
                    Item 2
                </a>
            </div>
        </div>
        

        【讨论】:

          【解决方案10】:

          这适用于 Bootstrap V4

          JS:

          <script>
                  $(function() {
                      $('.dropdown-hover').hover(
                          function() { $(this).addClass('show'); $(this).find('[data-toggle="dropdown"]').attr('aria-expanded', true); $(this).find('.dropdown-menu').addClass('show'); },
                          function() { $(this).removeClass('show'); $(this).find('[data-toggle="dropdown"]').attr('aria-expanded',false); $(this).find('.dropdown-menu').removeClass('show'); }
                      );
                  });
              </script>
          

          Vanilla Bootstrap 4 Dropdown HTML 除了添加了 dropdown-hover 类:

          <div class="dropdown dropdown-hover">
          <button class="btn btn-text dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
              ABOUT
          </button>
          <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
              <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>
          

          如果您不想通过使用 .dropdown-hover 类来选择性地启用悬停功能,那么只需将 jquery 选择器从 .dropdown-hover 更改为 .dropdown。

          【讨论】:

            【解决方案11】:

            版本 2 的非常简单的解决方案,只有 CSS。 为移动设备和平板电脑保留相同的友好功能。

            @media (min-width: 980px) {
                .dropdown:hover .dropdown-menu {
                   display: block;
                }
            }
            

            【讨论】:

            • 这不适用于菜单项和下拉菜单之间有间隙的某些主题。当鼠标移入此间隙时,菜单将消失。
            【解决方案12】:

            为那些希望在移动设备上使用默认功能的人添加此功能。可以根据需要设置min-width: ...

            @media only screen and (min-width: 1195px) {
              ul.nav li.dropdown:hover > ul.dropdown-menu {
                display: block;
              }
              ul.nav li.dropdown> ul.dropdown-menu {
                display: none;
              }
            }
            

            设置display: none 以便dropdown-toggle 不会产生问题。如果您保持原样,可能会同时打开两个下拉菜单。

            【讨论】:

              【解决方案13】:

              我已经为 Bootstrap 3 下拉悬停功能发布了一个适当的插件,您甚至可以在其中定义单击 dropdown-toggle 元素时会发生什么(可以禁用单击):

              https://github.com/istvan-ujjmeszaros/bootstrap-dropdown-hover


              既然已经有很多解决方案了,为什么我要做呢?

              我对所有以前存在的解决方案都有疑问。简单的 CSS 并没有使用 .dropdown 上的 .open 类,因此当下拉可见时,下拉切换元素不会有任何反馈。

              js 干扰点击.dropdown-toggle,所以下拉菜单在悬停时显示,然后在点击打开的下拉菜单时将其隐藏,移出鼠标将触发下拉菜单再次显示.一些 js 解决方案破坏了 iOS 兼容性,一些插件无法在支持触摸事件的现代桌面浏览器上运行。

              这就是为什么我制作了Bootstrap Dropdown Hover 插件,它通过只使用标准的 Bootstrap javascript API 来防止所有这些问题。即使是 Aria 属性也可以在这个插件中正常工作。

              【讨论】:

              • 您对github.com/vadikom/smartmenus 有何看法?我无法决定,这两个库似乎都非常好。
              • Smartmenus 看起来很不错,可能更适合用于菜单。我的插件只是对引导下拉菜单的一个小补充,它只是在悬停时打开一个下拉菜单,而 smartmenu 也支持子菜单,并做一些其他花哨的事情。
              • 谢谢。我看到 smartmenu 的代码非常广泛,而且还有很多 CSS。到目前为止,我选择了bootstrap-dropdown-hover,因为它似乎可以完成这项工作并且更紧凑。我正在构建一个带有左侧导航栏的着陆点。
              【解决方案14】:

              我希望这会有所帮助。检查链接https://jsfiddle.net/awb7gfb1/

              <nav>
                  <div id="menubar" class=" collapse navbar-collapse row">
                      <ul id="dropdownNavbar" class="nav navbar-nav">
                          <li class="dropdown">
                              <button type="button" class="btn btn-primary dropbtn"><span class="glyphicon glyphicon-time"></span>
                              Time Card
                              <span class="caret"></span></button>
                              <div class="dropdown-content">
                                  <a id="showTimeCard" href="#">My Time Card</a>
                                  <a href="#">Sub Menu 2</a>
                                  <a href="#">Sub Menu 3</a>
                                  <a href="#">Sub Menu 4</a>
                                  <a href="#">Sub Menu 5</a>
                              </div>
                          </li>
                          <li class="dropdown">
                              <button type="button" class="btn btn-primary dropbtn"><span class="glyphicon glyphicon-stats"></span>
                              Project
                              <span class="caret"></span></button>
                              <div class="dropdown-content">
                                  <a href="#">Sub Menu 1</a>
                                  <a href="#">Sub Menu 2</a>
                                  <a href="#">Sub Menu 3</a>
                              </div>
                          </li>
                          <li class="dropdown">
                              <button type="button" class="btn btn-primary dropbtn"><span class="glyphicon glyphicon-user"></span>
                              HR Links
                              <span class="caret"></span></button>
                              <div class="dropdown-content">
                                  <a href="#">Sub Menu 1</a>
                                  <a href="#">Sub Menu 2</a>
                              </div>
                          </li>
                          <li class="dropdown">
                              <button type="button" class="btn btn-primary dropbtn">
                              <span class="glyphicon glyphicon-screenshot"></span>
                              Leave Tracker
                              <span class="caret"></span></button>
                              <div class="dropdown-content">
                                  <a href="#">Sub Menu 1</a>
                                  <a href="#">Sub Menu 2</a>
                                  <a href="#">Sub Menu 3</a>
                                  <a href="#">Sub Menu 4</a>
                              </div>
                          </li>
                          <li class="dropdown">
                              <button type="button" class="btn btn-primary dropbtn">
                              <span class="glyphicon glyphicon-briefcase"></span>
                              Accounts
                              <span class="caret"></span></button>
                              <div class="dropdown-content">
                                  <a href="#">Sub Menu 1</a>
                                  <a href="#">Sub Menu 2</a>
                                  <a href="#">Sub Menu 3</a>
                                  <a href="#">Sub Menu 4</a>
                                  <a href="#">Sub Menu 5</a>
                              </div>
                          </li>
                          <li class="dropdown">
                              <button type="button" class="btn btn-primary dropbtn">
                              <span class="glyphicon glyphicon-headphones"></span>
                              Service Desk
                              <span class="caret"></span></button>
                              <div class="dropdown-content">
                                  <a href="#">Sub Menu 1</a>
                                  <a href="#">Sub Menu 2</a>
                                  <a href="#">Sub Menu 3</a>
                                  <a href="#">Sub Menu 4</a>
                              </div>
                          </li>
                          <li class="dropdown">
                              <button type="button" class="btn btn-primary dropbtn">
                              <span class="glyphicon glyphicon-file"></span>
                              Reports
                              <span class="caret"></span></button>
                              <div class="dropdown-content">
                                  <a href="#">Sub Menu 1</a>
                                  <a href="#">Sub Menu 2</a>
                                  <a href="#">Sub Menu 3</a>
                                  <a href="#">Sub Menu 4</a>
                                  <a href="#">Sub Menu 5</a>
                              </div>
                          </li>
                          <li class="dropdown">
                              <button type="button" class="btn btn-primary dropbtn">
                              <span class="glyphicon glyphicon-cog"></span>
                              Settings
                              <span class="caret"></span></button>
                              <div class="dropdown-content">
                                  <a href="#">Sub Menu 1</a>
                                  <a href="#">Sub Menu 2</a>
                                  <a href="#">Sub Menu 3</a>
                              </div>
                          </li>
                      </ul>
                  </div>
              </nav>
              

              还有 CSS

              .dropdown {
                  float: left;
                  padding-right: 1px;
              }
              
              .dropbtn{
                  border: 0px;
                  height: 30px;
                  border-radius: 0px 10px;
              }
              li button, .dropbtn {
                  display: inline-block;
                  color: white;
                  text-align: center;
              }
              
              li button:hover, .dropdown:hover .dropbtn {
                  background-color: #12A5F4;
              }
              
              .dropbtn.active {
                  background: #12A5F4;
              }
              
              .dropdown-content {
                  display: none;
                  position: absolute;
                  background-color: #e8f3f4;
                  min-width: 100%;
                  box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.1);
                  z-index: 10;
              }
              
              .navbar-header{
                  overflow: visible;
                  z-index: 1;
              }
              
              .dropdown-content a {
                  color: black;
                  padding: 5px 10px;
                  display: block;
                  text-align: left;
              }
              
              .dropdown-content a:hover {
                  background-color: #d8dee2
              }
              
              .dropdown:hover .dropdown-content {
                  display: block;
              }
              
              #menubar{
                  padding-top: 5px;
                  overflow: visible;
                  z-index: 10;
                  padding-left: 0px;
                  padding-right: 0px;
                  margin: 0px;
              }
              
              #dropdownNavbar{
                  margin: 0px;
              }
              
              .navbar-toggle{
                  background-color: #3382d5;
              }
              .navbar-toggle span{
                  background-color: white;
              }
              

              【讨论】:

                【解决方案15】:

                这里是 JSFiddle -> https://jsfiddle.net/PRkonsult/mn31qf0p/1/

                底部的 JavaScript 位是真正的魔法。

                HTML

                <!--http://getbootstrap.com/components/#navbar-->
                <div class="body-wrap">
                  <div class="container">
                    <nav class="navbar navbar-inverse" role="navigation">
                      <div class="container-fluid">
                        <!-- Brand and toggle get grouped for better mobile display -->
                        <div class="navbar-header">
                          <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
                            <span class="sr-only">Toggle navigation</span>
                            <span class="icon-bar"></span>
                            <span class="icon-bar"></span>
                            <span class="icon-bar"></span>
                          </button>
                          <a class="navbar-brand" href="#">Brand</a>
                        </div>
                
                        <!-- Collect the nav links, forms, and other content for toggling -->
                        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                          <ul class="nav navbar-nav">
                            <li class="active"><a href="#">Link</a></li>
                            <li><a href="#">Link</a></li>
                            <li class="dropdown">
                              <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown <b class="caret"></b></a>
                              <ul class="dropdown-menu">
                                <li><a href="#">Action</a></li>
                                <li><a href="#">Another action</a></li>
                                <li><a href="#">Something else here</a></li>
                                <li class="divider"></li>
                                <li><a href="#">Separated link</a></li>
                                <li class="divider"></li>
                                <li><a href="#">One more separated link</a></li>
                              </ul>
                            </li>
                          </ul>
                
                          <ul class="nav navbar-nav navbar-right">
                            <li><a href="#">Link</a></li>
                            <li class="dropdown">
                              <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown <b class="caret"></b></a>
                              <ul class="dropdown-menu">
                                <li><a href="#">Action</a></li>
                                <li><a href="#">Another action</a></li>
                                <li><a href="#">Something else here</a></li>
                                <li class="divider"></li>
                                <li><a href="#">Separated link</a></li>
                              </ul>
                            </li>
                          </ul>
                        </div>
                        <!-- /.navbar-collapse -->
                      </div>
                      <!-- /.container-fluid -->
                    </nav>
                  </div>
                </div>
                

                CSS

                /* Bootstrap dropdown hover menu */
                
                body {
                  font-family: 'PT Sans', sans-serif;
                  font-size: 13px;
                  font-weight: 400;
                  color: #4f5d6e;
                  position: relative;
                  background: rgb(26, 49, 95);
                  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(26, 49, 95, 1)), color-stop(10%, rgba(26, 49, 95, 1)), color-stop(24%, rgba(29, 108, 141, 1)), color-stop(37%, rgba(41, 136, 151, 1)), color-stop(77%, rgba(39, 45, 100, 1)), color-stop(90%, rgba(26, 49, 95, 1)), color-stop(100%, rgba(26, 49, 95, 1)));
                  filter: progid: DXImageTransform.Microsoft.gradient(startColorstr='#1a315f', endColorstr='#1a315f', GradientType=0);
                }
                
                .body-wrap {
                  min-height: 700px;
                }
                
                .body-wrap {
                  position: relative;
                  z-index: 0;
                }
                
                .body-wrap: before,
                .body-wrap: after {
                  content: '';
                  position: absolute;
                  top: 0;
                  left: 0;
                  right: 0;
                  z-index: -1;
                  height: 260px;
                  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(26, 49, 95, 1)), color-stop(100%, rgba(26, 49, 95, 0)));
                  background: linear-gradient(to bottom, rgba(26, 49, 95, 1) 0%, rgba(26, 49, 95, 0) 100%);
                  filter: progid: DXImageTransform.Microsoft.gradient(startColorstr='#1a315f', endColorstr='#001a315f', GradientType=0);
                }
                
                .body-wrap:after {
                  top: auto;
                  bottom: 0;
                  background: linear-gradient(to bottom, rgba(26, 49, 95, 0) 0%, rgba(26, 49, 95, 1) 100%);
                  filter: progid: DXImageTransform.Microsoft.gradient(startColorstr='#001a315f', endColorstr='#1a315f', GradientType=0);
                }
                
                nav {
                  margin-top: 60px;
                  box-shadow: 5px 4px 5px #000;
                }
                

                然后是重要的 JavaScript 代码:

                $('ul.nav li.dropdown').hover(function() {
                  $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn(500);
                }, function() {
                  $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut(500);
                });
                

                【讨论】:

                  【解决方案16】:

                  使用两个内联链接。使用下拉切换隐藏链接,并在可见链接上添加 onmouseover 事件以单击下拉菜单。

                  <a class="pretty-button"
                     href="#" alt="Notifications"
                     onmouseover="$('#notifications-dropdown').click()">
                  </a>
                  
                  <a style="display:none"
                     id="notifications-dropdown"
                     class="js-nav js-tooltip js-dynamic-tooltip"
                     href="#"
                     alt="Notifications"
                     data-toggle="dropdown">
                     <span class="fa fa-flag fa-2x"></span>
                  </a>
                  

                  【讨论】:

                    【解决方案17】:

                    对于插入符号...我还没有看到任何人指定完全阻止插入符号的简单 CSS。

                    给你:

                    .caret {
                        display: none !important;
                    }
                    

                    【讨论】:

                      【解决方案18】:

                      如果你有一个带有dropdown 类的元素(例如):

                      <ul class="list-unstyled list-inline">
                          <li class="dropdown">
                              <a data-toggle="dropdown" href="#"><i class="fa fa-bars"></i> Dropdown 1</a>
                              <ul class="dropdown-menu">
                                  <li><a href="">Item 1</a></li>
                                  <li><a href="">Item 2</a></li>
                                  <li><a href="">Item 3</a></li>
                                  <li><a href="">Item 4</a></li>
                                  <li><a href="">Item 5</a></li>
                              </ul>
                          </li>
                          <li class="dropdown">
                              <a data-toggle="dropdown" href="#"><i class="fa fa-user"></i> Dropdown 2</a>
                              <ul class="dropdown-menu">
                                  <li><a href="">Item A</a></li>
                                  <li><a href="">Item B</a></li>
                                  <li><a href="">Item C</a></li>
                                  <li><a href="">Item D</a></li>
                                  <li><a href="">Item E</a></li>
                              </ul>
                          </li>
                      </ul>
                      

                      然后,您可以使用 jQuery 代码的 sn-p 让下拉菜单在悬停时自动下拉,而不必单击其标题:

                      <script>
                          $('.dropdown').hover(
                              function() {
                                  $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn();
                              },
                              function() {
                                  $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut();
                              }
                          );
                      
                          $('.dropdown-menu').hover(
                              function() {
                                  $(this).stop(true, true);
                              },
                              function() {
                                  $(this).stop(true, true).delay(200).fadeOut();
                              }
                          );
                      </script>
                      

                      Here is a demo

                      这个答案依赖于@Michael answer,我做了一些更改并添加了一些附加功能以使下拉菜单正常工作

                      【讨论】:

                        【解决方案19】:

                        我们看到,除了My Head Hurts”的回答之外,“Cory Price”还发现了两个问题: p>

                        问题 1: 点击下拉链接将打开下拉菜单。除非用户单击某处,否则它将保持打开状态 否则,或者将鼠标悬停在它上面,创建一个尴尬的 UI。

                        解决方案:从导航链接中删除“class”和“data-toggle”元素

                        解决方案几乎是完美的,但这里的问题是,当涉及到移动设备和平板电脑时,它就行不通了!

                        我正在使用一些 jQuery 代码来解决这个问题..

                        if ($(window).width() > 769) {
                            $('.dropdown-toggle').removeAttr('data-toggle');
                            $('.dropdown-menu').removeAttr('style');
                            $('.dropdown').removeClass('open');
                        }
                        $(window).resize(function () {
                            if ($(window).width() > 769) {
                                $('.dropdown-toggle').removeAttr('data-toggle');
                                $('.dropdown-menu').removeAttr('style');
                                $('.dropdown').removeClass('open');
                            }
                            else {
                                $('.dropdown-toggle').attr("data-toggle", "dropdown");
                            }
                        });
                        

                        注意:这里我们假设折叠到移动设备和平板电脑是从 768px 开始的。

                        【讨论】:

                        • 这不是一个好主意,因为许多触摸设备的视口大小与台式机和笔记本电脑设备相同或更大。最好使用适用于 IOS、Android 和 Windows Mobile 的触摸检测,或者只保留点击。
                        【解决方案20】:

                        所以你有这个代码:

                        <a class="dropdown-toggle" data-toggle="dropdown">Show menu</a>
                        
                        <ul class="dropdown-menu" role="menu">
                            <li>Link 1</li>
                            <li>Link 2</li> 
                            <li>Link 3</li>                                             
                        </ul>
                        

                        通常它适用于点击事件,而您希望它适用于悬停事件。这很简单,只需使用这段 JavaScript/jQuery 代码:

                        $(document).ready(function () {
                            $('.dropdown-toggle').mouseover(function() {
                                $('.dropdown-menu').show();
                            })
                        
                            $('.dropdown-toggle').mouseout(function() {
                                t = setTimeout(function() {
                                    $('.dropdown-menu').hide();
                                }, 100);
                        
                                $('.dropdown-menu').on('mouseenter', function() {
                                    $('.dropdown-menu').show();
                                    clearTimeout(t);
                                }).on('mouseleave', function() {
                                    $('.dropdown-menu').hide();
                                })
                            })
                        })
                        

                        这很好用,解释如下:我们有一个按钮和一个菜单。当我们将鼠标悬停在按钮上时,我们会显示菜单,当我们将鼠标悬停在按钮上时,我们会在 100 毫秒后隐藏菜单。如果您想知道我为什么使用它,是因为您需要时间将光标从按钮拖到菜单上。当您在菜单上时,时间会被重置,您可以在此处停留任意时间。当您退出菜单时,我们会立即隐藏菜单,不会有任何超时。

                        我在很多项目中都使用过这段代码,如果你在使用中遇到任何问题,请随时向我提问。

                        【讨论】:

                          【解决方案21】:

                          最好的方法是通过悬停触发 Bootstrap 的点击事件。这样,它仍应保持对触摸设备友好。

                          $('.dropdown').hover(function(){ 
                            $('.dropdown-toggle', this).trigger('click'); 
                          });
                          

                          【讨论】:

                          • 不想要的结果:mousein、click 和 mouseout 将使菜单保持打开状态。这不是我想要的……
                          • 使用这个,它运行引导函数来打开下拉菜单,这个函数做很多其他的事情,比如 aria-expanded="true"
                          【解决方案22】:

                          我的管理方式如下:

                          $('ul.nav li.dropdown').hover(function(){
                                 $(this).children('ul.dropdown-menu').slideDown(); 
                              }, function(){
                                 $(this).children('ul.dropdown-menu').slideUp(); 
                          });
                          

                          我希望这对某人有所帮助...

                          【讨论】:

                            【解决方案23】:

                            在我看来最好的方法是这样的:

                            ;(function($, window, undefined) {
                                // Outside the scope of the jQuery plugin to
                                // keep track of all dropdowns
                                var $allDropdowns = $();
                            
                                // If instantlyCloseOthers is true, then it will instantly
                                // shut other nav items when a new one is hovered over
                                $.fn.dropdownHover = function(options) {
                            
                                    // The element we really care about
                                    // is the dropdown-toggle's parent
                                    $allDropdowns = $allDropdowns.add(this.parent());
                            
                                    return this.each(function() {
                                        var $this = $(this),
                                            $parent = $this.parent(),
                                            defaults = {
                                                delay: 500,
                                                instantlyCloseOthers: true
                                            },
                                            data = {
                                                delay: $(this).data('delay'),
                                                instantlyCloseOthers: $(this).data('close-others')
                                            },
                                            settings = $.extend(true, {}, defaults, options, data),
                                            timeout;
                            
                                        $parent.hover(function(event) {
                            
                                            // So a neighbor can't open the dropdown
                                            if(!$parent.hasClass('open') && !$this.is(event.target)) {
                                                return true;
                                            }
                            
                                            if(settings.instantlyCloseOthers === true)
                                                $allDropdowns.removeClass('open');
                            
                                            window.clearTimeout(timeout);
                                            $parent.addClass('open');
                                        }, function() {
                                            timeout = window.setTimeout(function() {
                                                $parent.removeClass('open');
                                            }, settings.delay);
                                        });
                            
                                        // This helps with button groups!
                                        $this.hover(function() {
                                            if(settings.instantlyCloseOthers === true)
                                                $allDropdowns.removeClass('open');
                            
                                            window.clearTimeout(timeout);
                                            $parent.addClass('open');
                                        });
                            
                                        // Handle submenus
                                        $parent.find('.dropdown-submenu').each(function(){
                                            var $this = $(this);
                                            var subTimeout;
                                            $this.hover(function() {
                                                window.clearTimeout(subTimeout);
                                                $this.children('.dropdown-menu').show();
                            
                                                // Always close submenu siblings instantly
                                                $this.siblings().children('.dropdown-menu').hide();
                                            }, function() {
                                                var $submenu = $this.children('.dropdown-menu');
                                                subTimeout = window.setTimeout(function() {
                                                    $submenu.hide();
                                                }, settings.delay);
                                            });
                                        });
                                    });
                                };
                            
                                $(document).ready(function() {
                                    // apply dropdownHover to all elements with the data-hover="dropdown" attribute
                                    $('[data-hover="dropdown"]').dropdownHover();
                                });
                            })(jQuery, this);
                            

                            示例标记:

                            <li class="dropdown">
                                <a href="#" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown" data-delay="1000" data-close-others="false">
                                    Account <b class="caret"></b>
                                </a>
                                <ul class="dropdown-menu">
                                    <li><a tabindex="-1" href="#">My Account</a></li>
                                    <li class="divider"></li>
                                    <li><a tabindex="-1" href="#">Change Email</a></li>
                                    <li><a tabindex="-1" href="#">Change Password</a></li>
                                    <li class="divider"></li>
                                    <li><a tabindex="-1" href="#">Logout</a></li>
                                </ul>
                            </li>
                            

                            【讨论】:

                            【解决方案24】:

                            这适用于 WordPress Bootstrap:

                            .navbar .nav > li > .dropdown-menu:after,
                            .navbar .nav > li > .dropdown-menu:before {
                                content: none;
                            }
                            

                            【讨论】:

                              【解决方案25】:

                              jQuery 解决方案很好,但它需要处理点击事件(对于移动设备或平板电脑),因为悬停无法正常工作......也许可以做一些窗口重新大小检测?

                              Andres Ilich 的回答似乎效果很好,但它应该包含在媒体查询中:

                              @media (min-width: 980px) {
                              
                                  .dropdown-menu .sub-menu {
                                      left: 100%;
                                      position: absolute;
                                      top: 0;
                                      visibility: hidden;
                                      margin-top: -1px;
                                  }
                              
                                  .dropdown-menu li:hover .sub-menu {
                                      visibility: visible;
                                  }
                              
                                  .dropdown:hover .dropdown-menu {
                                      display: block;
                                  }
                              
                                  .nav-tabs .dropdown-menu, .nav-pills .dropdown-menu, .navbar .dropdown-menu {
                                      margin-top: 0;
                                  }
                              
                                  .navbar .sub-menu:before {
                                      border-bottom: 7px solid transparent;
                                      border-left: none;
                                      border-right: 7px solid rgba(0, 0, 0, 0.2);
                                      border-top: 7px solid transparent;
                                      left: -7px;
                                      top: 10px;
                                  }
                                  .navbar .sub-menu:after {
                                      border-top: 6px solid transparent;
                                      border-left: none;
                                      border-right: 6px solid #fff;
                                      border-bottom: 6px solid transparent;
                                      left: 10px;
                                      top: 11px;
                                      left: -6px;
                                  }
                              }
                              

                              【讨论】:

                                【解决方案26】:

                                我使用了一些 jQuery:

                                // Add hover effect to menus
                                jQuery('ul.nav li.dropdown').hover(function() {
                                  jQuery(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn();
                                }, function() {
                                  jQuery(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut();
                                });
                                

                                【讨论】:

                                • 像这样。无论如何我都在使用 JQuery 和 Bootstrap 的东西,并且仍然允许在触摸屏设备中使用默认的“点击”功能。
                                • 用过这个。我喜欢它仍然允许点击功能,对于手机来说,但对于桌面来说,悬停是完美的。
                                • 我使用了它,但也将其扩展为可用于不在导航中的下拉菜单。我将类 dropdown-hover 添加到 btn-group div 并使用了这个 jQuery finder $('ul.nav li.dropdown, .dropdown-hover').hover(function() {。谢谢!
                                • 用过这个,又好又小。 css 版本不允许子菜单一直显示,200ms 太快了所以我把它改成了$('ul.nav li.dropdown').hover(function() { $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn(); }, function() { $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut().hover(function() { $(this).stop(true, true); }); }); : When the submenu is hover stop fadeOut
                                • @nuander,这是为 Bootstrap V1/2 ::: 所以这个解决方案不再相关 :::
                                【解决方案27】:

                                这可能是一个愚蠢的想法,但是要删除指向下方的箭头,您可以删除

                                <b class="caret"></b>
                                

                                不过,这对向上指向的人没有任何作用......

                                【讨论】:

                                  【解决方案28】:

                                  我基于支持多个子菜单的最新 (v2.0.2) Bootstrap 框架创建了一个纯悬停下拉菜单,并认为我会将其发布给未来的用户:

                                  body {
                                    padding-top: 60px;
                                    padding-bottom: 40px;
                                  }
                                  
                                  .sidebar-nav {
                                    padding: 9px 0;
                                  }
                                  
                                  .dropdown-menu .sub-menu {
                                    left: 100%;
                                    position: absolute;
                                    top: 0;
                                    visibility: hidden;
                                    margin-top: -1px;
                                  }
                                  
                                  .dropdown-menu li:hover .sub-menu {
                                    visibility: visible;
                                  }
                                  
                                  .dropdown:hover .dropdown-menu {
                                    display: block;
                                  }
                                  
                                  .nav-tabs .dropdown-menu,
                                  .nav-pills .dropdown-menu,
                                  .navbar .dropdown-menu {
                                    margin-top: 0;
                                  }
                                  
                                  .navbar .sub-menu:before {
                                    border-bottom: 7px solid transparent;
                                    border-left: none;
                                    border-right: 7px solid rgba(0, 0, 0, 0.2);
                                    border-top: 7px solid transparent;
                                    left: -7px;
                                    top: 10px;
                                  }
                                  
                                  .navbar .sub-menu:after {
                                    border-top: 6px solid transparent;
                                    border-left: none;
                                    border-right: 6px solid #fff;
                                    border-bottom: 6px solid transparent;
                                    left: 10px;
                                    top: 11px;
                                    left: -6px;
                                  }
                                  <link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.3.2/css/bootstrap.min.css" rel="stylesheet" />
                                  
                                  <div class="navbar navbar-fixed-top">
                                    <div class="navbar-inner">
                                      <div class="container-fluid">
                                        <a data-target=".nav-collapse" data-toggle="collapse" class="btn btn-navbar">
                                          <span class="icon-bar"></span>
                                          <span class="icon-bar"></span>
                                          <span class="icon-bar"></span>
                                        </a>
                                        <a href="#" class="brand">Project name</a>
                                        <div class="nav-collapse">
                                          <ul class="nav">
                                            <li class="active"><a href="#">Home</a></li>
                                            <li><a href="#">Link</a></li>
                                            <li><a href="#">Link</a></li>
                                            <li><a href="#">Link</a></li>
                                            <li class="dropdown">
                                              <a data-toggle="dropdown" class="dropdown-toggle" href="#">Dropdown <b class="caret"></b></a>
                                              <ul class="dropdown-menu">
                                                <li>
                                                  <a href="#">2-level Dropdown <i class="icon-arrow-right"></i></a>
                                                  <ul class="dropdown-menu sub-menu">
                                                    <li><a href="#">Action</a></li>
                                                    <li><a href="#">Another action</a></li>
                                                    <li><a href="#">Something else here</a></li>
                                                    <li class="divider"></li>
                                                    <li class="nav-header">Nav header</li>
                                                    <li><a href="#">Separated link</a></li>
                                                    <li><a href="#">One more separated link</a></li>
                                                  </ul>
                                                </li>
                                                <li><a href="#">Another action</a></li>
                                                <li><a href="#">Something else here</a></li>
                                                <li class="divider"></li>
                                                <li class="nav-header">Nav header</li>
                                                <li><a href="#">Separated link</a></li>
                                                <li><a href="#">One more separated link</a></li>
                                              </ul>
                                            </li>
                                          </ul>
                                          <form action="" class="navbar-search pull-left">
                                            <input type="text" placeholder="Search" class="search-query span2">
                                          </form>
                                          <ul class="nav pull-right">
                                            <li><a href="#">Link</a></li>
                                            <li class="divider-vertical"></li>
                                            <li class="dropdown">
                                              <a class="#" href="#">Menu</a>
                                            </li>
                                          </ul>
                                        </div>
                                        <!-- /.nav-collapse -->
                                      </div>
                                    </div>
                                  </div>
                                  
                                  <hr>
                                  
                                  <ul class="nav nav-pills">
                                    <li class="active"><a href="#">Regular link</a></li>
                                    <li class="dropdown">
                                      <a href="#" data-toggle="dropdown" class="dropdown-toggle">Dropdown <b class="caret"></b></a>
                                      <ul class="dropdown-menu" id="menu1">
                                        <li>
                                          <a href="#">2-level Menu <i class="icon-arrow-right"></i></a>
                                          <ul class="dropdown-menu sub-menu">
                                            <li><a href="#">Action</a></li>
                                            <li><a href="#">Another action</a></li>
                                            <li><a href="#">Something else here</a></li>
                                            <li class="divider"></li>
                                            <li class="nav-header">Nav header</li>
                                            <li><a href="#">Separated link</a></li>
                                            <li><a href="#">One more separated link</a></li>
                                          </ul>
                                        </li>
                                        <li><a href="#">Another action</a></li>
                                        <li><a href="#">Something else here</a></li>
                                        <li class="divider"></li>
                                        <li><a href="#">Separated link</a></li>
                                      </ul>
                                    </li>
                                    <li class="dropdown">
                                      <a href="#">Menu</a>
                                    </li>
                                    <li class="dropdown">
                                      <a href="#">Menu</a>
                                    </li>
                                  </ul>

                                  Demo

                                  【讨论】:

                                  • 在引导程序中不打开悬停事件的下拉菜单是一个设计决策...
                                  • 太好了!我还删除了class="dropdown-toggle" data-toggle="dropdown",这样只有悬停而不是点击会触发菜单。请注意,当您使用响应式样式时,菜单仍会扫入右上角的小按钮,该按钮仍由单击触发。非常感谢!
                                  • 为了避免在较小的设备(例如手机)上自动下拉,并且只允许它的最小宽度为例如768px 做@media (min-width: 768px) {.dropdown-menu li:hover .sub-menu {visibility: visible;}}@media (min-width: 768px) {.dropdown:hover .dropdown-menu {display: block;}}
                                  • 另外,要使与孩子的链接可点击,您必须删除 标记上的“data-toggle='dropdown'”。
                                  • 这里是 Bootstrap 4.x 的解决方案,简单的 7 行 CSS 代码:bootsnipp.com/snippets/Vm7d
                                  【解决方案29】:

                                  <!DOCTYPE html>
                                  <html>
                                  <head>
                                  <style>
                                  .dropbtn {
                                      background-color: #4CAF50;
                                      color: white;
                                      padding: 16px;
                                      font-size: 16px;
                                      border: none;
                                      cursor: pointer;
                                  }
                                  
                                  .dropdown {
                                      position: relative;
                                      display: inline-block;
                                  }
                                  
                                  .dropdown-content {
                                      display: none;
                                      position: absolute;
                                      background-color: #f9f9f9;
                                      min-width: 160px;
                                      box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
                                      z-index: 1;
                                  }
                                  
                                  .dropdown-content a {
                                      color: black;
                                      padding: 12px 16px;
                                      text-decoration: none;
                                      display: block;
                                  }
                                  
                                  .dropdown-content a:hover {background-color: #f1f1f1}
                                  
                                  .dropdown:hover .dropdown-content {
                                      display: block;
                                  }
                                  
                                  .dropdown:hover .dropbtn {
                                      background-color: #3e8e41;
                                  }
                                  </style>
                                  </head>
                                  <body>
                                  
                                  <h2>Hoverable Dropdown</h2>
                                  <p>Move the mouse over the button to open the dropdown menu.</p>
                                  
                                  <div class="dropdown">
                                    <button class="dropbtn">Dropdown</button>
                                    <div class="dropdown-content">
                                      <a href="#">Link 1</a>
                                      <a href="#">Link 2</a>
                                      <a href="#">Link 3</a>
                                    </div>
                                  </div>
                                  
                                  </body>
                                  </html>

                                  【讨论】:

                                    【解决方案30】:
                                     <ul class="nav navbar-nav">
                                            <li class="active"><a href="#">Link</a></li>
                                            <li><a href="#">Link</a></li>
                                            <li class="dropdown">
                                              <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown <b class="caret"></b></a>
                                              <ul class="dropdown-menu">
                                                <li><a href="#">Action</a></li>
                                                <li><a href="#">Another action</a></li>
                                                <li><a href="#">Something else here</a></li>
                                                <li class="divider"></li>
                                                <li><a href="#">Separated link</a></li>
                                                <li class="divider"></li>
                                                <li><a href="#">One more separated link</a></li>
                                              </ul>
                                            </li>
                                          </ul>
                                          <script>
                                            $('ul.nav li.dropdown').hover(function() {
                                            $(this).find('.dropdown-menu').stop(true, 
                                            true).delay(200).fadeIn(500);
                                            }, function() {
                                            $(this).find('.dropdown-menu').stop(true, 
                                            true).delay(200).fadeOut(500);
                                            });
                                          </script>
                                    

                                    【讨论】:

                                      猜你喜欢
                                      • 2018-07-01
                                      • 2012-05-31
                                      • 2019-12-24
                                      • 2013-03-09
                                      • 2012-10-25
                                      • 2020-07-15
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      相关资源
                                      最近更新 更多