Pregunta Cómo hacer que el menú desplegable de Twitter Bootstrap se desplace en lugar de hacer clic


Me gustaría tener mi menú Bootstrap automáticamente desplegable al pasar el mouse, en lugar de tener que hacer clic en el título del menú. También me gustaría perder las pequeñas flechas junto a los títulos del menú.


1037
2018-01-16 09:36


origen


Respuestas:


Creé un menú desplegable puro al pasar el ratón basado en el último framework de Bootstrap (v2.0.2) que tiene soporte para múltiples submenús y pensé que lo publicaría para futuros usuarios:

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>

Manifestación


528
2018-04-13 14:46



Para hacer que el menú caiga automáticamente al pasar el mouse, esto puede lograrse usando CSS básico. Debe configurar el selector para la opción de menú oculto y luego configurarlo para que se muestre como bloque cuando el li etiqueta está sobrevolada. Tomando el ejemplo de la página de arranque de Twitter, el selector sería el siguiente:

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

Sin embargo, si está utilizando las funciones de respuesta de Bootstrap, no querrá esta funcionalidad en una barra de navegación comprimida (en pantallas más pequeñas). Para evitar esto, ajuste el código anterior en una consulta de medios:

@media (min-width: 979px) {
  ul.nav li.dropdown:hover > ul.dropdown-menu {
    display: block;
  }
}

Para ocultar la flecha (símbolo de intercalación), esto se hace de diferentes maneras, dependiendo de si está utilizando Twitter Bootstrap versión 2 o inferior o versión 3:

Bootstrap 3

Para eliminar el símbolo de intercalación en la versión 3, solo tiene que eliminar el código HTML <b class="caret"></b> desde el .dropdown-toggle elemento de anclaje:

<a class="dropdown-toggle" data-toggle="dropdown" href="#">
    Dropdown
    <b class="caret"></b>    <-- remove this line
</a>

Bootstrap 2 y más bajo

Para eliminar el símbolo de intercalación en la versión 2 necesita un poco más de información sobre CSS y le sugiero que mire cómo :after el pseudo elemento funciona con más detalle. Para que pueda comenzar a comprender, apuntar y eliminar las flechas en el ejemplo de arranque de Twitter, debería usar el siguiente selector y código CSS:

a.menu:after, .dropdown-toggle:after {
    content: none;
}

Trabajará a su favor si profundiza en cómo funcionan y no solo utiliza las respuestas que le he dado.

Gracias a @CocaAkat por señalar que nos faltaba el combinador de elementos ">" para evitar que se mostraran submenús en el control deslizante principal


874
2018-01-16 10:26



Además de la respuesta de "My Head Hurts" (que fue genial):

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

Hay 2 problemas persistentes:

  1. Al hacer clic en el enlace desplegable, se abrirá el menú desplegable. Y permanecerá abierto a menos que el usuario haga clic en otro lugar, o se desplace sobre él, creando una IU incómoda.
  2. Hay un margen de 1px entre el enlace desplegable y el menú desplegable. Esto hace que el menú desplegable se oculte si se mueve lentamente entre el menú desplegable y el menú desplegable.

La solución a (1) es eliminar los elementos "class" y "data-toggle" del enlace de navegación

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

Esto también le da la posibilidad de crear un enlace a su página primaria, lo que no fue posible con la implementación predeterminada. Simplemente puede reemplazar el "#" con la página que desee enviar al usuario.

La solución a (2) es eliminar el margen superior en el selector .downdown-menu

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

221
2018-02-24 18:00



He usado un poco de 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();
});

119
2018-05-22 17:49



Aquí hay muchas soluciones realmente buenas. Pero pensé que seguiría adelante y pondría la mía aquí como otra alternativa. Es solo un simple fragmento de jQuery que lo hace de la misma forma que lo haría el bootstrap si soportara desplazarse por desplegables en lugar de simplemente hacer clic. Solo he probado esto con la versión 3, así que no sé si funcionaría con la versión 2. Guárdalo como un fragmento en tu editor y escríbelo con solo presionar una tecla.

<script>
    $(function() {
        $(".dropdown").hover(
            function(){ $(this).addClass('open') },
            function(){ $(this).removeClass('open') }
        );
    });
</script>

Básicamente, solo dice que cuando coloque el cursor sobre la clase desplegable, agregará la clase abierta a ella. Entonces solo funciona. Cuando dejas de pasar el cursor sobre el li parental con la clase desplegable o el hijo ul / li's, elimina la clase abierta. Obviamente, esta es solo una de muchas soluciones, y puede agregarla para que funcione únicamente en instancias específicas de .downdown. O agregue una transición a padre o hijo.


64
2018-01-31 17:28



Simplemente personalice su estilo CSS en tres líneas de código

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

60
2018-04-05 06:24



Si tienes un elemento con un dropdown clase como esta (por ejemplo):

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

Luego puede hacer que el menú desplegable se despliegue automáticamente al pasar el mouse sobre el mouse, en lugar de tener que hacer clic en su título, usando este fragmento de código jQuery:

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

Aquí hay una demostración

Esta respuesta se basó en @Michael respuesta, Realicé algunos cambios y agregué algunas adiciones para que el menú desplegable funcione correctamente


20
2017-09-27 21:13



[Actualizar] El plugin está en GitHub y estoy trabajando en algunas mejoras (como el uso solo con datos-atributos (no es necesario JS). He dejado el código a continuación, pero no es lo mismo que lo que está en GitHub.

Me gustó la versión puramente CSS, pero es agradable tener un retraso antes de que se cierre, ya que generalmente es una mejor experiencia de usuario (es decir, no se castiga con un deslizamiento de mouse que va 1 px fuera del menú desplegable, etc.) y como se menciona en los comentarios , hay ese 1px de margen con el que tiene que lidiar o, a veces, el navegador se cierra inesperadamente cuando se mueve al menú desplegable del botón original, etc.

Creé un pequeño plugin rápido que he usado en un par de sitios y funcionó muy bien. Cada elemento de navegación se maneja de forma independiente, por lo que tienen sus propios temporizadores de retardo, etc.

JS

// 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(),
            defaults = {
                delay: 500,
                instantlyCloseOthers: true
            },
            data = {
                delay: $(this).data('delay'),
                instantlyCloseOthers: $(this).data('close-others')
            },
            options = $.extend(true, {}, defaults, options, data),
            timeout;

        $this.hover(function() {
            if(options.instantlyCloseOthers === true)
                $allDropdowns.removeClass('open');

            window.clearTimeout(timeout);
            $(this).addClass('open');
        }, function() {
            timeout = window.setTimeout(function() {
                $this.removeClass('open');
            }, options.delay);
        });
    });
};  

los delay parámetro es bastante auto explicativo, y el instantlyCloseOthers cerrará instantáneamente todas las demás listas desplegables que se abren cuando pasas el cursor sobre una nueva.

No es CSS puro, pero con suerte ayudará a otra persona a esta hora tardía (es decir, este es un hilo viejo).

Si lo desea, puede ver los diferentes procesos que pasé (en una discusión sobre #concrete5 IRC) para hacer que funcione a través de los diferentes pasos en esta esencia: https://gist.github.com/3876924

El enfoque del patrón de complementos es mucho más limpio para admitir temporizadores individuales, etc.

Ver el entrada en el blog para más.


19
2017-10-12 03:02



Esto funcionó para mí:

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

15
2017-10-06 11:47



Mejor aún con jQuery:

jQuery('ul.nav li.dropdown').hover(function() {
  jQuery(this).find('.dropdown-menu').stop(true, true).show();
  jQuery(this).addClass('open');
}, function() {
  jQuery(this).find('.dropdown-menu').stop(true, true).hide();
  jQuery(this).removeClass('open');
});

9
2017-08-17 01:51