Bootstrap закрывает адаптивное меню «при нажатии»


86

Нажмите "ПРОДУКТЫ". Я поднимаю вверх белый div (как показано в приложении). В адаптивном режиме (мобильный телефон и планшет) я хотел бы автоматически закрыть отзывчивую навигационную панель и отображать только белую полосу.

Я старался:

$('.btn-navbar').click();  

также пробовал:

$('.nav-collapse').toggle();

И это действительно работает. Однако в размере рабочего стола он также называется и делает что-то необычное с меню, где оно сокращается на секунду.

Любые идеи?

введите описание изображения здесь


Не могли бы вы опубликовать HTML-код? Также вы используете Bootstrap для скрытия? Или вы пытаетесь реализовать что-то свое?
Крис Холленбек

Думаю, я просто пытаюсь сделать что-нибудь простое. Я просто хочу закрыть панель навигации, когда нажимаю «ПРОДУКТЫ»
user1040259

Если вы не хотите пытаться самостоятельно сравнивать все эти решения, отредактируйте # 1 из этого ответа - это то, что вам следует сделать.
caw

Я рекомендую прокрутить здесь немного вниз и посмотреть ответ @LukeTillman. Прекрасно работает и без jQuery. :)
das Keks

Ответы:


103

У меня есть для работы с анимацией!

Меню в html:

<div id="nav-main" class="nav-collapse collapse">
     <ul class="nav">
         <li>
             <a href='#somewhere'>Somewhere</a>
         </li>
     </ul>
 </div>

Привязка события щелчка ко всем элементам навигации для свертывания меню (плагин свертывания Bootstrap):

 $(function(){ 
     var navMain = $("#nav-main");
     navMain.on("click", "a", null, function () {
         navMain.collapse('hide');
     });
 });

ИЗМЕНИТЬ Чтобы сделать его более общим, мы можем использовать следующий фрагмент кода

 $(function(){ 
     var navMain = $(".navbar-collapse"); // avoid dependency on #id
     // "a:not([data-toggle])" - to avoid issues caused
     // when you have dropdown inside navbar
     navMain.on("click", "a:not([data-toggle])", null, function () {
         navMain.collapse('hide');
     });
 });

3
Если не все aэлементы: вам просто нужно позвонить$("#nav-main").collapse('hide');
Анкит Джайн

@mollwe У вас есть решение, когда в нем есть раскрывающееся меню? Я сделал jsfiddle, чтобы попробовать, но даже меню не открывается. jsfiddle.net/Y3H92
clankill3r 04

@ clankill3r мне кажется, что ссылка на bootstrap.js отсутствует, и поэтому меню не будет работать. Я обновил ваш jsfiddle: jsfiddle.net/Y3H92/1
mollwe

@mollwe с твоей скрипкой меню вообще не закроется для меня.
clankill3r

1
Приносим извинения за поздний ответ @ clankill3r! Но лучше поздно, чем никогда. jsfiddle.net/mollwe/Y3H92/5
mollwe

136

Вам не нужно добавлять дополнительный javascript к тому, что уже включено в опцию свертывания начальной загрузки. Вместо этого просто включите селекторы data-toggle и data-target в элементы списка меню так же, как вы это делаете с кнопкой переключения навигационной панели. Итак, для пункта меню "Товары" это будет выглядеть так

<li><a href="#Products" data-toggle="collapse" data-target=".navbar-collapse">Products</a></li>

Затем вам нужно будет повторить переключатели данных и целевые данные для каждого элемента меню.

РЕДАКТИРОВАТЬ!!! Чтобы исправить проблемы с переполнением и мерцание в этом исправлении, я добавляю еще код, который исправит это, и по-прежнему не имеет дополнительного javascript. Вот новый код:

<li><a href="#products" class="hidden-xs">Products</a></li>
<li><a href="#products" class="visible-xs" data-toggle="collapse" data-target=".navbar-collapse">Products</a></li>

Вот он работает http://jsfiddle.net/jaketaylor/84mqazgq/

Это сделает ваши переключатели и селекторы целей специфичными для размера экрана и устранит сбои в большом меню. Если у кого-то по-прежнему возникают проблемы с глюками, сообщите мне, и я найду решение. Благодарность

РЕДАКТИРОВАТЬ : в начальной загрузке v4.1.3 я не мог использовать видимые / скрытые классы. Вместо hidden-xsиспользования d-none d-sm-blockи вместо visible-xsиспользования d-block d-sm-none.


14
это вызывает мерцание и странные вещи, когда навигация не отображается как "отзывчивое" меню.
Флориан

5
Это правильная реализация. Никакого специального jQuery не требуется.
larrylampco

Я удалил свой отрицательный голос за этот ответ и свой предыдущий комментарий (также потому, что видео больше не работало). так как мой комментарий о мерцании все еще действителен для исходного ответа, получил несколько голосов и ваше «редактирование» четко отмечено, я не вижу причин удалять его и перезаписывать историю. это было действительным в то время, и вы отреагировали соответственно. люди , читающие ваш ответ будет видеть «редактировать» и знаю , что вы улучшили на этом ...
Florian

Вы предпочитаете дублировать все свои ссылки, чтобы избежать единственной строки прекрасно документированного javascript? getbootstrap.com/javascript/#collapse-methods .
Сандер Гарретсен,

1
Вместо добавления data-toggleи data-targetатрибутов каждого элемента Li вы можете вместо того, чтобы добавить его к родителю ulили divтегам.
Джереми Квик,

40

Я думаю, что вы занимаетесь инженерным делом ..

    $('.navbar-collapse ul li a').click(function(){ 
            $('.navbar-toggle:visible').click();
    });

РЕДАКТИРОВАТЬ: чтобы позаботиться о подменю, убедитесь, что на их якоре переключения есть класс раскрывающегося списка.

    $(function () { 
            $('.navbar-collapse ul li a:not(.dropdown-toggle)').click(function () { 
                    $('.navbar-toggle:visible').click(); 
            }); 
    });

РЕДАКТИРОВАТЬ 2: добавить поддержку касания телефона.

    $(function () {
            $('.navbar-collapse ul li a:not(.dropdown-toggle)').bind('click touchstart', function () {
                    $('.navbar-toggle:visible').click();
            });
    });

3
Должен быть принятый ответ. Остальные будут избыточны и фликер на не реагирующего дисплей.
rybo111

3
Это может быть принятый ответ, но он не учитывает подменю и фактически нарушает их. В некоторых других «чрезмерно спроектированных» решениях это принималось во внимание, несмотря на их недостатки. Об этом позаботится следующее дополнение: $ (function () {$ ('. Navbar-collapse ul li a: not (.dropdown-toggle)'). Click (function () {$ ('. Navbar-toggle: visible '). click ();});});
Эд Бишоп

Большое спасибо за РЕДАКТИРОВАНИЕ!
Hontoni

1
Я думаю, что тачстарт многовато, щелчок работает нормально. как он реагирует на скольжение при "запуске" с кнопки?
Hontoni

37

Мне очень понравилась идея Джейка Тейлора сделать это без дополнительного JavaScript и воспользоваться переключателем коллапса Bootstrap. Я обнаружил, что вы можете исправить проблему «мерцания», которая присутствует, когда меню не в свернутом режиме, data-targetслегка изменив селектор, чтобы включить inкласс. Вот так это выглядит:

<li><a href="#Products" data-toggle="collapse" data-target=".navbar-collapse.in">Products</a></li>

Я не тестировал его с вложенными раскрывающимися списками / меню, поэтому YMMV.


3
Для меня это тоже была лучшая реализация.
Хуцзин

По какой-то причине мой ScrollSpy не работает с этим методом, но отлично работает с методом Джейка Тейлора.
Inkling

На данный момент это самый лучший и простой ответ.
Diaa

Некоторое время пытался заставить работать немерцающий коллапс, но это, безусловно, самое простое и элегантное решение. Спасибо!
McVenco

9

просто чтобы быть полным, в Bootstrap 4.0.0-beta использование .show сработало для меня ...

<li>
  <a href="#Products" data-toggle="collapse" data-target=".navbar-collapse.show">Products</a>
</li>

Лучший ответ для меня, спасибо.
MoxxiManagarm

5

Я предполагаю, что у вас есть такая строка, определяющая область навигации на основе примеров Bootstrap и всего

<div class="nav-collapse collapse" >

Просто добавьте свойства как таковые, как на кнопке МЕНЮ

<div class="nav-collapse collapse" data-toggle="collapse"  data-target=".nav-collapse">

Я тоже добавил <body>, работал. Не могу сказать, что я профилировал это или что-то в этом роде, но мне кажется, это удовольствие ... пока вы не нажмете случайное место в пользовательском интерфейсе, чтобы открыть меню, так что это не так хорошо.

DK


Правильное решение, основанное на встроенной функциональности Bootstrap; никаких дополнительных jQuery или javascript. И самое простое решение из всех. Это должен быть принятый ответ.
Серги Папасейт

4

Это работает, но не анимируется.

$('.btn-navbar').addClass('collapsed');
$('.nav-collapse').removeClass('in').css('height', '0');

8
Немного удивительно, что для этого нет опции конфигурации, так как близкое нажатие было бы лучшим вариантом по умолчанию.
bchesley

3

В HTML я добавил класс СЧ ссылки на в теге каждой ссылки навигации.

$('.nav-link').click(
    function () {
        $('.navbar-collapse').removeClass('in');
    }
);

3

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

<div id="navbar" class="navbar-collapse collapse" data-toggle="collapse"  data-target=".navbar-collapse collapse">

работал у меня при использовании navbar-id в качестве цели данных: <div id = "navbar" class = "collapse navbar-collapse" data-toggle = "collapse" data-target = "# navbar">, но дает уродливую анимацию в то время как в размере рабочего стола
wutzebaer 02

Очень некрасиво, неприемлемо!
Candlejack

2

Чтобы описать решение user1040259, добавьте этот код в свой $ (document) .ready (function () {});

    $('.nav').click( function() {
        $('.btn-navbar').addClass('collapsed');
        $('.nav-collapse').removeClass('in').css('height', '0');
    });

Как они упоминают, это не анимирует движение ... но закрывает панель навигации при выборе элемента


2

Для тех, кто использует AngularJS и Angular UI Router с этим, вот мое решение (с использованием переключателя mollwe). Где ".navbar-main-collapse" - моя "цель данных".

Создать директиву:

module.directive('navbarMainCollapse', ['$rootScope', function ($rootScope) {
    return {
        restrict: 'C',
        link: function (scope, element) {
            //watch for state/route change (Angular UI Router specific)
            $rootScope.$on('$stateChangeSuccess', function () {
                if (!element.hasClass('collapse')) {
                    element.collapse('hide');
                }
            });
        }
    };
}]);

Директива использования:

<div class="collapse navbar-collapse navbar-main-collapse">
    <your menu>

Похоже, вы поместили директиву в класс attr, верно?
Gringo Suave

Внутри функции ссылки должно работать следующее. element.on ('щелчок', функция () {scope.vm.isCollapsed =! scope.vm.isCollapsed;});
Джимми Боб

2

Это должно помочь.

Требуется bootstrap.js.

Пример => http://getbootstrap.com/javascript/#collapse

    $('.nav li a').click(function() {
      $('#nav-main').collapse('hide');
    });

Это делает то же самое, что и при добавлении атрибутов data-toggle = "collapse" и href = "yournavigationID" 'к тегам меню навигации.


Не могли бы вы объяснить ответ поподробнее?
Blunderfest

Разве это не jQuery? Разве это не плохая практика - использовать и jQuery, и Angular?
AlxVallejo

1

Я использую функцию mollwe, хотя добавил 2 улучшения:

a) Избегайте закрытия раскрывающегося списка, если ссылка, по которой была нажата ссылка, свернута (включая другие ссылки)

б) Также скройте раскрывающийся список, если вы щелкаете видимый веб-контент.

jQuery.fn.exists = function() {
                  return this.length > 0;
              }

    $(function() {
                var navMain = $(".navbar-collapse");
                navMain.on("click", "a", null, function() {
                    if ($(this).attr("href") !== "#") {
                        navMain.collapse('hide');
                    }
                });

                $("#content").bind("click", function() {
                     if ($(".navbar-collapse.navbar-ex1-collapse.in").exists()) {
                        navMain.collapse('hide');
                    }
                });

            });

1

Не самый новый поток, но я искал решение той же проблемы и нашел одно (смесь некоторых других).

Я дал NavButton:

<type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> ...

идентификатор / идентификатор, например:

 <button id="navcop" type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">

Не лучшая «Идея» - но: У меня работает! Теперь вы можете проверить видимость вашей кнопки (с помощью jquery), например:

 var target = $('#navcop');
   if(target.is(":visible")){
   $('#navcop').click();
   }

(ПРИМЕЧАНИЕ. Это всего лишь фрагмент кода! Я использовал событие «onclick» на своих навигационных ссылках! (Запуск AJAX Reguest).)

Результат: Если кнопка "видима", она была "нажата" ... Итак: Никаких ошибок, если вы используете "полноэкранный вид" Bootstrap (ширина более 940 пикселей).

Привет Ральф

PS: Он отлично работает с IE9, IE10 и Firefox 25. Не проверял другие - но я не вижу проблемы :-)


1

Это сработало для меня. Я сделал это так, когда я нажимаю кнопку меню, я добавляю или удаляю класс «in», потому что при добавлении или удалении этого класса переключатель работает по умолчанию. 'e.stopPropagation ()' - остановить анимацию по умолчанию с помощью начальной загрузки (я думаю), вы также можете использовать 'toggleClass' вместо добавления или удаления класса.

$ ('# ChangeToggle'). On ('щелчок', функция (e) {

        if ($('.navbar-collapse').hasClass('in')) {
            $('.navbar-collapse').removeClass('in');
            e.stopPropagation();
        } else {
            $('.navbar-collapse').addClass('in');
            $('.navbar-collapse').collapse();
        }

    });

0

Вы осторожно используете

ul.nav {
    display: none;
}

По умолчанию это закроет панель навигации. Пожалуйста, дайте мне знать, что кто-нибудь сочтет это полезным


2
проблема в том, что это скрывает навигацию, когда отображается "нормально", а не в отзывчивом меню.
Флориан

0

Если, например, ваш значок с возможностью переключения виден только для очень маленьких устройств, вы можете сделать что-то вроде этого:

$('[data-toggle="offcanvas"]').click(function () {
    $('#side-menu').toggleClass('hidden-xs');
});

Нажатие [data-toggle = "offcanvas"] добавит .hidden-xs начальной загрузки в мое # боковое меню, которое скроет содержимое бокового меню, но снова станет видимым, если вы увеличите размер окна.


0

если меню html

<div id="nav-main" class="nav-collapse collapse">
     <ul class="nav">
         <li>
             <a href='#somewhere'>Somewhere</a>
         </li>
     </ul>
</div>

на переключателе навигации добавлен класс «in» и удален из переключателя. проверьте, открыто ли адаптивное меню, затем выполните закрытие.

$('.nav-collapse .nav a').on('click', function(){
    if ( $( '.nav-collapse' ).hasClass('in') ) {
        $('.navbar-toggle').click();
    }
});

0

Tuggle Nav Close, ответ, совместимый с браузером IE, без каких-либо ошибок консоли. Если вы используете бутстрап, используйте это

$('.nav li a').on('click', function () {
    if ($("#navbar").hasClass("in")) {
        $('.navbar-collapse.in').show();
    }
    else {
        $('.navbar-collapse.in').hide();
    }
})

-1
$('.navbar-toggle').trigger('click');

Я не понимаю, почему это неправильный ответ? всякий раз, когда вы нажимаете любую ссылку меню в этом событии щелчка, вы можете переключать меню, что я считаю правильным, потому что я не меняю поведение по умолчанию при открытии или закрытии меню.
Aqib

-1

Решение Bootstrap 4 без Javascript

Добавить атрибуты data-toggle="collapse" data-target="#navbarSupportedContent.show" в div<div class="collapse navbar-collapse">

Убедитесь , что вы предоставляете правильный idинdata-target

<div className="collapse navbar-collapse" id="navbarSupportedContent" data-toggle="collapse" data-target="#navbarSupportedContent.show">

.show чтобы избежать мерцания меню при большом разрешении

<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
<nav class="navbar navbar-expand-lg navbar-light bg-light">
  <a class="navbar-brand" href="#">Navbar</a>
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
    <span class="navbar-toggler-icon"></span>
  </button>

  <div class="collapse navbar-collapse" id="navbarSupportedContent" data-toggle="collapse" data-target="#navbarSupportedContent.show">
    <ul class="navbar-nav mr-auto">
      <li class="nav-item active">
        <a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
      </li>
      <li class="nav-item">
        <a class="nav-link" href="#">Link</a>
      </li>
      <li class="nav-item dropdown">
        <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
          Dropdown
        </a>
        <div class="dropdown-menu" aria-labelledby="navbarDropdown">
          <a class="dropdown-item" href="#">Action</a>
          <a class="dropdown-item" href="#">Another action</a>
          <div class="dropdown-divider"></div>
          <a class="dropdown-item" href="#">Something else here</a>
        </div>
      </li>
      <li class="nav-item">
        <a class="nav-link disabled" href="#">Disabled</a>
      </li>
    </ul>
    <form class="form-inline my-2 my-lg-0">
      <input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search">
      <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
    </form>
  </div>
</nav>

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.