Bootstrap выпадающий с Hover

153

ОК, так что мне нужно довольно просто.

Я установил навигатор с некоторыми раскрывающимися меню в нем (используя class="dropdown-toggle" data-toggle="dropdown"), и он отлично работает.

Дело в том, что он работает "onClick", хотя я бы предпочел, чтобы он работал "onHover".

Есть ли встроенный способ сделать это?

18 ответов

288
Лучший ответ

Самое простое решение - в CSS. Добавьте что-то вроде...

.dropdown:hover .dropdown-menu {
    display: block;
    margin-top: 0; // remove the gap so it doesn't close
 }

Рабочая скрипта

  • 3
    Намного лучше, чем длинные «полнофункциональные» решения. Просто добавьте это, и выпадающий «щелчок» по умолчанию работает при наведении курсора без дополнительных изменений.
  • 43
    Это будет конфликтовать со встроенным складным мобильным меню, поэтому вы должны обернуть его в точку останова @media (min-width: 480px)
Показать ещё 11 комментариев
60

Лучший способ сделать это - просто запустить событие загрузки bootstraps с зависанием. Таким образом, он должен по-прежнему оставаться сенсорным устройством.

$('.dropdown').hover(function(){ 
  $('.dropdown-toggle', this).trigger('click'); 
});
  • 1
    терпит неудачу, если у вас есть более одного выпадающего уровня
  • 1
    Не работает с родительской ссылкой
Показать ещё 3 комментария
53

Вы можете использовать функцию наведения jQuery.

Вам просто нужно добавить класс open, когда мышь входит и удаляет класс, когда мышь покидает раскрывающийся список.

Здесь мой код:

$(function(){
    $('.dropdown').hover(function() {
        $(this).addClass('open');
    },
    function() {
        $(this).removeClass('open');
    });
});
  • 10
    Намного лучше, чем принятый ответ. Это сохраняет всю логику и стиль начальной загрузки без изменений. Хотя я бы посоветовал использовать второй обратный вызов и явно использовать removeClass и addClass, чтобы предотвратить некоторое странное поведение, когда вы нажимаете кнопку (где она будет открываться, когда вы покидаете кнопку, и закрывается, когда вы ее вводите).
  • 0
    Я также думаю, что это лучший ответ. Чтобы заставить его работать с меню Bootstrap 4, мне пришлось использовать show вместо open , а также включить dropdown-menu : $('.dropdown').hover(function() { $(this).addClass('show'); $(this).find('.dropdown-menu').addClass('show');}, function() {$(this).removeClass('show'); $(this).find('.dropdown-menu').removeClass('show');}); (Извините за форматирование.)
Показать ещё 1 комментарий
22

Простым способом, используя jQuery, является следующее:

$(document).ready(function(){
    $('ul.nav li.dropdown').hover(function() {
      $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn(200);
    }, function() {
      $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut(200);
    });  
});
  • 0
    Мне нравится плавный переход, однако он вызывает расширение всех уровней меню, а не только первого уровня. Я не хочу, чтобы меню второго уровня появлялись, пока я не наведу курсор на их родителей.
  • 1
    Чтобы получить только первый уровень, добавьте .first() - $(this).find('.dropdown-menu').first().stop(true, true).delay(200).fadeIn(200); ...
9

Для CSS это сходит с ума, когда вы также нажимаете на него. Это код, который я использую, он также ничего не меняет для мобильного просмотра.

$('.dropdown').mouseenter(function(){
    if(!$('.navbar-toggle').is(':visible')) { // disable for mobile view
        if(!$(this).hasClass('open')) { // Keeps it open when hover it again
            $('.dropdown-toggle', this).trigger('click');
        }
    }
});
  • 0
    Красота! Tx! Альтернативы CSS не будут работать на Bootstrap 3 и выше.
6

Наведите курсор на пункты навигации, чтобы увидеть, что они активируются при наведении. http://cameronspear.com/demos/twitter-bootstrap-hover-dropdown/#

6

В Twitter Bootstrap не реализован, но вы можете использовать этот плагин

Обновление 1:

Вопрос Sames здесь

4

Итак, у вас есть этот код:

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

Обычно он работает в событии click, и вы хотите, чтобы он работал с событием hover. Это очень просто, просто используйте этот код 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 мс. Если вам интересно, почему я это использую, это потому, что вам нужно время перетащить курсор из кнопки в меню. Когда вы находитесь в меню, время reset, и вы можете оставаться там столько раз, сколько хотите. Когда вы выйдете из меню, мы немедленно скроем меню без какого-либо тайм-аута.

Я использовал этот код во многих проектах, если у вас возникли проблемы с его использованием, не стесняйтесь задавать мне вопросы.

  • 0
    Этот код имеет много проблем с начальной загрузкой v3. 1.) Если имеется более одного раскрывающегося списка, все раскрывающиеся списки отображаются при наведении любого из них. 2.) На маленьких экранах зависание показывает выпадающий список странным образом.
3

Попробуйте использовать функцию зависания с анимацией fadein fadeout

$('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);
});
  • 0
    Эта анимация не работает на 3-й глубине, но работает на 2-й глубине. Есть ли у вас какие-либо другие решения для 3-й глубины?
  • 0
    пожалуйста, добавьте JSFiddle для справки
Показать ещё 1 комментарий
3

Это то, что я использую, чтобы вывести его с помощью jQuery

$(document).ready(function () {
    $('.navbar-default .navbar-nav > li.dropdown').hover(function () {
        $('ul.dropdown-menu', this).stop(true, true).slideDown('fast');
        $(this).addClass('open');
    }, function () {
        $('ul.dropdown-menu', this).stop(true, true).slideUp('fast');
        $(this).removeClass('open');
    });
});
  • 0
    Хорошо, но не поддерживает подменю.
2

Обновлен с помощью соответствующего плагина

Я опубликовал правильный плагин для функциональности выпадающего меню, в котором вы даже можете определить, что происходит при нажатии на элемент dropdown-toggle:

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


Почему я это сделал, когда уже есть много решений?

У меня были проблемы со всеми ранее существующими решениями. Простые CSS не используют класс .open на .dropdown, поэтому при выпадающем списке выпадающего элемента не будет обратной связи.

js-модули мешают щелчку на .dropdown-toggle, поэтому выпадающее меню отображается при наведении, затем скрывает его, когда вы нажимаете на раскрывающееся раскрывающееся меню, а перемещение мыши приведет к тому, что выпадающее меню появится снова. Некоторые из js-решений - это торможение совместимости с iOS, некоторые плагины не работают в современных настольных браузерах, поддерживающих сенсорные события.

Вот почему я создал плагин Bootstrap Dropdown Hover, который предотвращает все эти проблемы, используя только стандартный JavaScript-скрипт Bootstrap без каких-либо взломов.

2

Я пробую другие решения, я использую bootstrap 3, но выпадающее меню слишком быстро закрывается, чтобы переместить его

предположил, что вы добавляете class= "dropdown" в li, я добавил тайм-аут

var hoverTimeout;
$('.dropdown').hover(function() {
    clearTimeout(hoverTimeout);
    $(this).addClass('open');
}, function() {
    var $self = $(this);
    hoverTimeout = setTimeout(function() {
        $self.removeClass('open');
    }, 150);
});
2

Это только наводит навигационную панель, когда вы не находитесь на мобильном устройстве, потому что я обнаружил, что зависание навигации плохо работает на мобильных устройствах:

    $( document ).ready(function() {

    $( 'ul.nav li.dropdown' ).hover(function() {
        // you could also use this condition: $( window ).width() >= 768
        if ($('.navbar-toggle').css('display') === 'none' 
            && false === ('ontouchstart' in document)) {

            $( '.dropdown-toggle', this ).trigger( 'click' );
        }
    }, function() {
        if ($('.navbar-toggle').css('display') === 'none'
            && false === ('ontouchstart' in document)) {

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

});
1

Запуск события click с hover имеет небольшую ошибку. Если mouse-in, а затем a click создает обратный эффект. Он opens, когда mouse-out и close, когда mouse-in. Лучшее решение:

$('.dropdown').hover(function() {
    if (!($(this).hasClass('open'))) {
        $('.dropdown-toggle', this).trigger('click');
    }
}, function() {
    if ($(this).hasClass('open')) {
        $('.dropdown-toggle', this).trigger('click');
    }
});
1
    $('.navbar .dropdown').hover(function() {
      $(this).find('.dropdown-menu').first().stop(true, true).slideDown(150);
    }, function() {
      $(this).find('.dropdown-menu').first().stop(true, true).slideUp(105)
    });
1

Это поможет вам создать собственный класс hover для загрузки:

CSS

/* Hover dropdown */
.hover_drop_down.input-group-btn ul.dropdown-menu{margin-top: 0px;}/*To avoid unwanted close*/
.hover_drop_down.btn-group ul.dropdown-menu{margin-top:2px;}/*To avoid unwanted close*/
.hover_drop_down:hover ul.dropdown-menu{
   display: block;
}

Поля устанавливаются так, чтобы избежать нежелательного закрытия, и они являются необязательными.

HTML:

<div class="btn-group hover_drop_down">
  <button type="button" class="btn btn-default" data-toggle="dropdown"></button>
  <ul class="dropdown-menu" role="menu">
    ...
  </ul>
</div>

Не забудьте удалить атрибут кнопки data-toggle = "dropdown" , если вы хотите удалить onclick open, и это также будет работать, когда вход добавляется с выпадающим списком.

0

Раскрывающийся список начальной загрузки Работайте при наведении курсора и оставайтесь близко при щелчке, добавляя свойство display: block; в css и удаление этих атрибутов data-toggle = "dropdown" role = "button" из тега кнопки

.dropdown:hover .dropdown-menu {
  display: block;
}
<!DOCTYPE html>
<html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/js/bootstrap.min.js"></script>
</head>
<body>

<div class="container">                                     
  <div class="dropdown">
    <button class="btn btn-primary dropdown-toggle">Dropdown Example
    <span class="caret"></span></button>
    <ul class="dropdown-menu">
      <li><a href="#">HTML</a></li>
      <li><a href="#">CSS</a></li>
      <li><a href="#">JavaScript</a></li>
    </ul>
  </div>
</div>

</body>
</html>
0

Решение, которое я предлагаю, обнаруживает, если его не сенсорное устройство и что navbar-toggle (меню гамбургера) не видно, и делает пункт родительского меню раскрывать подменю при наведении и следовать его ссылку на клик.

Также делает margin-top 0, потому что разрыв между навигационной панелью и меню в каком-то браузере не позволит вам навести на подпункты

$(function(){
    function is_touch_device() {
        return 'ontouchstart' in window        // works on most browsers 
        || navigator.maxTouchPoints;       // works on IE10/11 and Surface
    };

    if(!is_touch_device() && $('.navbar-toggle:hidden')){
      $('.dropdown-menu', this).css('margin-top',0);
      $('.dropdown').hover(function(){ 
          $('.dropdown-toggle', this).trigger('click').toggleClass("disabled"); 
      });			
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>

<ul id="nav" class="nav nav-pills clearfix right" role="tablist">
    <li><a href="#">menuA</a></li>
    <li><a href="#">menuB</a></li>
    <li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">menuC</a>
        <ul id="products-menu" class="dropdown-menu clearfix" role="menu">
            <li><a href="">A</a></li>
            <li><a href="">B</a></li>
            <li><a href="">C</a></li>
            <li><a href="">D</a></li>
        </ul>
    </li>
    <li><a href="#">menuD</a></li>
    <li><a href="#">menuE</a></li>
</ul>

$(function(){
  $("#nav .dropdown").hover(
    function() {
      $('#products-menu.dropdown-menu', this).stop( true, true ).fadeIn("fast");
      $(this).toggleClass('open');
    },
    function() {
      $('#products-menu.dropdown-menu', this).stop( true, true ).fadeOut("fast");
      $(this).toggleClass('open');
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>

<ul id="nav" class="nav nav-pills clearfix right" role="tablist">
    <li><a href="#">menuA</a></li>
    <li><a href="#">menuB</a></li>
    <li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">menuC</a>
        <ul id="products-menu" class="dropdown-menu clearfix" role="menu">
            <li><a href="">A</a></li>
            <li><a href="">B</a></li>
            <li><a href="">C</a></li>
            <li><a href="">D</a></li>
        </ul>
    </li>
    <li><a href="#">menuD</a></li>
    <li><a href="#">menuE</a></li>
</ul>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню