Раскрывающиеся списки Bootstrap 3: при наведении и щелчке

почти все ссылки на моем navbar являются выпадающими. Я хотел бы, чтобы они появлялись при наведении для больших экранов, но при щелчке для меньших экранов. Это возможно? В поисках ответа я наткнулся на следующее:--1-->меню начальной загрузки: выпадающее меню при наведении только для рабочего стола. Это не работает для меня, потому что я не хочу, чтобы весь раскрывающийся список был невидимым на мобильном телефоне; я бы хотел, чтобы он был виден только при щелчке, а не при наведении.

8 ответов


редактировать Ответ от @ouwen-huang в порядке, но так как jQuery является зависимостью для bootstrap.js, вы также можете сделать это способом jQuery, просто добавив все события, которые вы хотите прикрепить к кавычкам, разделенным пробелом:

$('.dropdown').on('mouseenter mouseleave click tap', function() {
  $(this).toggleClass("open");
});

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

<li class="dropdown">
    <a id="drop1" href="#" role="button" class="dropdown-toggle" data-toggle="dropdown">Dropdown <span class="caret"></span></a>
    <ul class="dropdown-menu" role="menu" aria-labelledby="drop1">
        <li role="presentation"><a role="menuitem" tabindex="-1" href="http://twitter.com/fat">Action</a></li>
        <li role="presentation"><a role="menuitem" tabindex="-1" href="http://twitter.com/fat">Another action</a></li>
        <li role="presentation"><a role="menuitem" tabindex="-1" href="http://twitter.com/fat">Something else here</a></li>
        <li role="presentation" class="divider"></li>
        <li role="presentation"><a role="menuitem" tabindex="-1" href="http://twitter.com/fat">Separated link</a></li>
    </ul>
</li>

дело в том, что если вы находитесь на устройстве с поддержкой мыши, таком как рабочий стол, у которого нет касания возможность, затем запускаются события mouseenter/mouseleave и меню активируется без щелчка мыши. Если пользователь не находится на устройстве, которое запускает событие mouseenter / mouseleave, события click или tap запускаются, когда пользователь нажимает ссылку, а обработчик click или tap обрабатывает раскрывающийся переключатель.

отредактировано для точности.


другие 2 решения работают, но не сохраняют стиль начальной загрузки. Более простое решение-просто добавить класс "open".

$('.dropdown').on('mouseenter mouseleave click tap', function() {
  $(this).toggleClass("open");
});

для этого можно использовать события javascript.

используя библиотеку mobile check, вы можете сказать

var domObject = document.querySelector('.myClassOrIDWhateverFloatsYourBoat');
if(mobile checked is true){
    domObject.addEventListener('hover', function(){
        $('.dropdown-toggle').dropdown();  // http://getbootstrap.com/javascript/
    })
}else{
   domObject.addEventListener('click', function(){
        $('.dropdown-toggle').dropdown();  // http://getbootstrap.com/javascript/
    })
}

попробовав много плагинов и решений, размещенных в StackOverflow, я придумал довольно простой код, который:

  • показывает выпадающий список при наведении на родной класс Bootstrap (так что он хорошо сотрудничает с кнопкой мыши)
  • делает кнопку Ссылка работать, когда href установлен
  • сохраняет оригинальное поведение на мобильных устройствах

простая версия

$('ul.nav li.dropdown').hover(function() {
    if (!$('.navbar-toggle').is(':visible')) {
        $(this).toggleClass('open', true);
    }
}, function() {
    if (!$('.navbar-toggle').is(':visible')) {
        $(this).toggleClass('open', false);
    }
});
$('ul.nav li.dropdown a').click(function(){
    if (!$('.navbar-toggle').is(':visible') && $(this).attr('href') != '#') {
        $(this).toggleClass('open', false);
        window.location = $(this).attr('href')
    }
});

$('.navbar-toggle').is(':visible') проверяет, находимся ли мы в настоящее время в mobile вид, $(this).toggleClass('open', true) добавляет или удаляет open класс css, используемый bootstrap, и window.location = $(this).attr('href') отправляет пользователей в место в href ссылки.


чтобы добавить переходы jQuery, мы должны немного изменить скрипт.

модифицированная версия

visible = false;

function toggleDropdown(dropdown, delay, fade, state) {
    if (state === undefined) visible = !visible
    else visible = state

    dropdown.children('.dropdown-menu').stop(true, true).delay(delay)[visible ? 'fadeIn' : 'fadeOut'](fade, function() {
        dropdown.toggleClass('open', visible);
        dropdown.children('.dropdown-toggle').attr('aria-expanded', visible);
        $(this).css('display', '');
    });
}

$('ul.nav li.dropdown').hover(function() {
    if ($('.navbar-toggle').is(':visible')) return;
    toggleDropdown($(this), 50, 100, true)
}, function() {
    if ($('.navbar-toggle').is(':visible')) return;
    toggleDropdown($(this), 400, 200, false)
});

$('ul.nav li.dropdown a').click(function(){
    if ($('.navbar-toggle').is(':visible')) return;
    if ($(this).attr('href') != '#') {
        toggleDropdown($(this).parent(), 50, 100, false)
        window.location = $(this).attr('href')
    }
    else {
        toggleDropdown($(this).parent(), 50, 100)
    }
});

visible переменная делает все хорошо работать при повторном наведении во время работы анимации.


хороший способ достичь этого-включить наведение только тогда, когда меню не свернуто.

$('.dropdown').on('mouseenter mouseleave click tap', function(event) {
  if (!$('.navbar-toggle').is(':visible')) {
    $(this).toggleClass("open");
  }
});

// toggle dropdown on mouse hover, click and tap events
$('.dropdown').on('mouseenter mouseleave click tap touchstart', function(event) {
    if (!$('.navbar-toggle').is(':visible')) {
        $(this).dropdown('toggle');
    }
});

вот немного измененная версия ответа @jme11 на основе Bootstrap 3 документация для выпадающих списков Javascript. преимущество использования этого метода заключается в том, что он позволяет раскрывающемуся списку функционировать точно так, как предполагалось, без необходимости изменять какие-либо классы и, следовательно, чище IMO.

Пример Codepen


это просто и хорошо работает, но на мобильном телефоне, если вы открываете подменю и нажимаете на пункт меню, чтобы закрыть, он не закрывается

$('.dropdown').on('mouseenter mouseleave click tap', function() {
  $(this).toggleClass("open");
});

для Bootstrap 4 работает следующий код.

$('.dropdown').on('mouseenter mouseleave click tap', function() {
    $(this).toggleClass("show");
});