Згорнене меню Bootstrap 3 не закривається при натисканні


122

У мене є більш-менш стандартна навігація з завантажувальної програми 3

<body data-spy="scroll" data-target=".navbar-collapse">
    <!-- ---------- Navigation ---------- -->
    <div class="navbar navbar-fixed-top" role="navigation">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="sr-only">Toggle navigation</span>
                </button>
                <a class="navbar-brand" href="index.html"> <img src="#"></a>
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav navbar-right">
                    <li class="active"><a href="#home">Home</a></li>
                    <li><a href="#one">One</a></li>
                    <li><a href="#two">Two</a></li>
                    <li><a href="#three">Three</a></li>
                    <li><a href="#four">Four</a></li>
                </ul>
            </div>
        </div>
    </div>

На менших пристроях він нормально руйнується. Натискання на кнопку меню розширює меню, але якщо я натискаю (або торкаюся цього питання) посилання на меню, меню залишається відкритим. Що мені робити, щоб знову його закрити?


5
відповідь user3669917, безумовно, найпростіша і найпростіша відповідь вперед!
— Томас

Відповіді:


48

Налаштування Bootstrap за замовчуванням - це тримати меню відкритим при натисканні на пункт меню. Ви можете вручну змінити цю поведінку, натиснувши .collapse('hide');на елемент jQuery, який потрібно згортати.


8
Це неправильно, завантажувальний перемикач автоматично переключає клас "згортання". Вам не потрібен додатковий код jquery. Якщо у вас така поведінка, це означає, що у вашому html-коді щось не так (зі свого боку, я два рази включав jquery та bootstrap, див. Відповідь @raisercostin).
— RomOne

@RomOne Ця відповідь правильна. Bootstrap зовсім НЕ закриває меню після заслання клацнув за замовчуванням. Інша відповідь застосовується лише в тому випадку, якщо люди неправильно включають jQuery двічі, що не є правильною відповіддю на це питання.
— Зім

136

Просто, щоб поділитися цим рішенням на GitHub, ця популярна відповідь:

https://github.com/twbs/bootstrap/isissue/9013#issuecomment-39698247

$(document).on('click','.navbar-collapse.in',function(e) {
    if( $(e.target).is('a') ) {
        $(this).collapse('hide');
    }
});

Це підключено до документа, тому вам не доведеться робити це готовим чином () (ви можете динамічно додавати посилання до свого меню, і воно все ще буде працювати), і воно викликається лише у випадку, якщо меню вже розширено. Деякі люди повідомили про дивне миготіння, де меню відкривається, а потім одразу закривається іншим кодом, який не підтвердив, що в меню було клас "in".

[ОНОВЛЕННЯ 2014-11-04] Очевидно, що під час використання підменю вищезазначене може спричинити проблеми, тому вищезгадане змінено на:

$(document).on('click','.navbar-collapse.in',function(e) {
    if( $(e.target).is('a:not(".dropdown-toggle")') ) {
        $(this).collapse('hide');
    }
});

1
Працює бездоганно. Дякую, що поділились!
— Родріго Чьонг

Чи можете ви пояснити '$ (це) .collapse (' приховати ');' будь ласка. я не розумію, звідки походить "крах"
— timebandit

@ImranNazir, вибачте, це спосіб після запитання, але collapseце метод, визначений bootstrap і приєднаний до об’єкта jQuery ... імовірно, вони повторно використовують це для декількох цілей (акордеон, навибар
— Кевін Нельсон

Оновлений код працював на мене, відповідей вище цього не було. Дякую!
— RandomUs1r

"[ОНОВЛЕННЯ 2014-11-04]" спрацювало. Що стосується іншого рішення, де рекомендується видалити дублікат посилання на bootstrap.js та jquery, що не є необхідним рішенням. Я знайшов це рішення, щоб виправити проблему з меншим часом талії на налагодження та з більш чітким поведінкою. Дякую!. Я сподіваюся, що це допомагає вам, як і мені.
— Nour Lababidi

122

Змініть це:

<li><a href="#one">One</a></li>

до цього:

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

Ця проста зміна спрацювала для мене.

Посилання: https://github.com/twbs/bootstrap/isissue/9013


14
Це рішення добре для мобільного перегляду, але воно показує анімацію показу / приховування на великих екранах після натискання посилання.
— Айман Аль-Абсі,

22
@ AymanAl-ABSI Ви повинні додати .inв кінець data-targetзначення: data-target=".navbar-collapse.in". З коментаря у цій відповіді: stackoverflow.com/a/21797534/89818
— caw

це чудово працює для мене, але він порушує скруппі, будь-яка ідея, чому це може бути?
— Крейг Харлі

1
Працював для мене, коли був оновлений вище код з відповіддю @caw. Я також використовую функцію scrollspy.
— Нірай

Це, безумовно, найкраще рішення. Ні JavaScript, ні jQuery. Якщо ви хочете, щоб певне посилання зберігало меню відкритим, просто не додайте ці параметри. Слід вказати як найкращу відповідь. Дякую.
— ed1nh0

55

У мене була така ж проблема, але викликана включенням двічі bootstrap.js та jquery.jsфайлів.

Одним клацанням миші подія двічі оброблялася обома екземплярами jquery. Один закрився, а один відкрив перемикач.


3
У мене була та сама проблема, але я не розумів, що їх включають двічі. Дякуємо, що опублікували це!
— Брайан ONeil

2
Так само зробив наш стажер. Дякуємо, що опублікували це.
— Тейсман

2
Людина! Я зробив те саме - я думаю, я повернувся до стажування!
— Приємніше

2
Так корисно! Я працював над цим цілими днями. Це може бути дуже часто при використанні шаблону навбар. Будьте уважні люди! :)
— Метт Батлер

2
Це слід відзначити як найкращу відповідь. У мене була та сама проблема з видаленням bootstrap.js, що вирішив проблему
— katwekibs

17
$(".navbar-nav li a").click(function(event) {
    if (!$(this).parent().hasClass('dropdown'))
        $(".navbar-collapse").collapse('hide');
});

Це допоможе в обробці спаду в навігаційній смузі


Це вирішило мою проблему, коли використання завантажувальної програми з javascript від слайд-шоу jssor створювало проблеми. Цей код також створює класний ефект при розширенні та згортанні мобільного меню.
— Адам Вест

Дякую @Chakradhar, це врятувало мені час.
— Омар Бахір

Дякую, забув, що Laravel 5.5 JS включає B і Jquery в основний файл js.
— Джек Віал

12

У мене виникли / були подібні проблеми з Bootstrap 4, alpha-6, і відповідь Йоакима Йохансона вище почала мене в правильному напрямку. Не потрібно JavaScript. Введення даних-target = ". Navbar-крах" і data-toggle = "згортання" в тег div всередині nav, але оточуючи посилання / кнопки, працювало для мене.

<div class="navbar-nav" data-target=".navbar-collapse" data-toggle="collapse">
   <a class="nav-item nav-link" href="#">Menu Item 1</a>
   ...
</div>


Ваша посада мені дуже допомогла. Це вирішило це для мене <body data-toggle = "згортання" data-target = ". Navbar-kolaps">
— Дес

Це було вже розміщено 3 роки тому. Крім того, він порушує анімацію в немобільному перегляді.
— Бевор

6

Я знаю, що це питання для Bootstrap 3, але якщо ви шукаєте рішення для Bootstrap 4 , просто зробіть це:

$(document).on('click','.navbar-collapse.show',function(e) {
  $(this).collapse('hide');
});

Я використовую бета-версію BS4, і ваш код відмінно працює. Я спробував усі інші запропоновані рішення тут не пощастило. BS4, очевидно, досить змінився, що інші рішення просто не застосовуються.
— Велосипед Дейв

Для релевантності та збереження рівноправності з оновленою інформацією - Це має бути найкращою відповіддю.
— Рікі

@ Ricky OP вказав Bootstrap 3, а не 4.
— Malavos

Для меню зі спаданнями я використав це:$(".navbar-nav li a:not('.dropdown-toggle')") .on('click', function () { $('.navbar-collapse').collapse('hide'); }
— Джеймс Вілкінс

5

У мене була така ж проблема, якою я користувався jQuery-1.7.1і bootstrap 3.2.0. Я змінив свою версію jQuery на останню ( jquery-1.11.2) версію, і все працює добре.



4

Хоча рішення, розміщене раніше про зміну самого пункту меню, як нижче, працює, коли меню знаходиться на невеликому пристрої, воно має побічний ефект, коли меню на повну ширину і розширене, це може призвести до того, що горизонтальна смуга прокрутки ковзатиме по вашому пункти меню . Рішення javascript не мають цього побічного ефекту.

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

(вибачте, що відповів так, хотів додати коментар до цієї відповіді, але, схоже, у мене недостатньо кредиту, щоб зробити зауваження)


2
 $(function(){ 
    var navMain = $("#your id");
    navMain.on("click", "a", null, function () {
      navMain.collapse('hide');
    });
});

перевірити нову версію Matthias S :-)
— Чіт

@bfontaine По-перше, ви повинні додати ідентифікатор у свій меню div, а коли ви натиснете на своє меню, то після цього все меню буде приховано. Наприклад: - Якщо ви натиснете на меню про нас, тоді вкладка меню відпочинку буде прихована.
— Чіт

1
дякую, але напишіть це у своїй відповіді;)
— bfontaine

1

Якщо ви хочете вручну змінити цю поведінку, зателефонувавши .collapse ('сховай') у директиву кутового, ось код:

файл JavaScript:

angular
  .module('yourAppModule')
  .directive('btnAutoCollapse', directive);

function directive() {
  var dir = {
    restrict: 'A',
    scope: {},
    link: link
  };
  return dir;

  function link(scope, element, attrs) {    
    element.on('click', function(event) {              
      $(".navbar-collapse.in").collapse('hide');
    });
  }
}

Html:

<li class="navbar-btn">
     <a href="#" ng-hide="username" **btn-auto-collapse**>Sign in</a>
</li>

1

Будь ласка, переконайтеся, що ви використовуєте останню версію bootstrap js. Я зіткнувся з тією ж проблемою і просто оновлення файлу bootstrap.js з bootstrap-3.3.6 зробило магію.


1

Якщо ви хочете, щоб ваша навігація перемикалася лише під час використання на екрані мобільного телефону, просто додайте data-toggle="collapse"іdata-target="#navbar" елементи будуть працювати на екрані мобільного пристрою, але дадуть вам дивне мерехтіння при натисканні на екран робочого столу. Рішення jQuery не працюють добре, якщо ви перебуваєте в середовищі Аурелія або Кут.

Найкращим рішенням для мене було створення спеціального атрибута, який слухає відповідний медіа-запит і додає в data-toggle="collapse"атрибут за бажанням:

<a href="#" ... collapse-toggle-if-less768 data-target="#navbar"> ...

Спеціальний атрибут з Aurelia виглядає приблизно так:

import {autoinject} from 'aurelia-framework';

@autoinject
export class CollapseToggleIfLess768CustomAttribute {
  element: Element;

  constructor(element: Element) {
    this.element = element;
    var mql = window.matchMedia("(min-width: 768px)");
    mql.addListener((mediaQueryList: MediaQueryList) => this.handleMediaChange(mediaQueryList));
    this.handleMediaChange(mql);
  }

  handleMediaChange(mediaQueryList: MediaQueryList) {
    if (mediaQueryList.matches) {
      var dataToggle = this.element.attributes.getNamedItem("data-toggle");
      if (dataToggle) {
        this.element.attributes.removeNamedItem("data-toggle");
      }
    } else {
      var dataToggle = this.element.attributes.getNamedItem("data-toggle");
      if (!dataToggle) {
        var dataToggle = document.createAttribute("data-toggle");
        dataToggle.value = "collapse";
        this.element.attributes.setNamedItem(dataToggle);
      }
    }
  }
}


0

Я виявив, що після довгої боротьби, спроб та помилок найкраще рішення для мене на jsfiddle. Посилання на натхнення на jsfiddle.net . Я використовую навигаційний пристрій завантажувача bootstrap з фіксованим верхом із згортанням та перемиканням гамбургерів. Ось моя версія на jsfiddle: jsfiddle Scrollspy navbar . Я отримував лише основні функціональні можливості, використовуючи інструкції на getbootsrap.com. Для мене проблема здебільшого полягала в туманних напрямках і js, рекомендованих сайтом getbootstrap. Найкращою мірою було те, що додавання цього додаткового біта js (який включає частину того, що згадується у вищезазначених потоках) вирішило для мене кілька проблем Scrollspy, зокрема:

  1. Згорнене / переключене меню nav ховається, коли натискається навігаційний розділ (наприклад, href = "# foobar") (проблема, що стосується цієї теми).
  2. Активний "розділ" було успішно виділено (тобто. Js успішно створено class = "active")
  3. Роздратована вертикальна смуга прокрутки, виявлена ​​на згорнутому навігаційному каналі (лише на невеликих екранах), була усунена.

ПРИМІТКА. У коді js, показаному нижче (із другого посилання jsfiddle в моєму дописі):

topMenu = $ ("# myScrollspy"),

... значення "myScrollspy" повинне відповідати ідентифікатору id = "" у вашому HTML-коді так ...

<nav id="myScrollspy" class="navbar navbar-default navbar-fixed-top">

Звичайно, ви можете змінити це значення на будь-яке значення, яке вам подобається.


0

Все, що вам потрібно, це дані-target = ". Navbar-згортання" у кнопці, нічого іншого.

<button class="navbar-toggle" type="button" data-toggle="collapse" data-target=".navbar-collapse">
    <span class="sr-only">Toggle navigation</span>
    <span class="icon-bar"></span>
    <span class="icon-bar"></span>
    <span class="icon-bar"></span>
</button>

+1: Це також працює, додавши data-toggle = "згортання" data-target = ". Navbar-згортання" в <a /> або в моєму випадку <Link /> в Meteorjs з React, Дякую.
— Джо Л.

так, він працює, <a/>але він не працював <NavLink/>, він руйнується, але, <NavLink/>вже не працює, ідеї чому?
— Піраміда

0

Це код, який працював для мене:

jQuery('document').ready(function()
{   
   $(".navbar-header button").click(function(event) {
   if ($(".navbar-collapse").hasClass('in'))
   {  $(".navbar-collapse").slideUp();  }
});})

0

У мене була така ж проблема: переконайтеся, що bootstrap.js включений у вашу html-сторінку. У моєму випадку меню відкрилося, але не закрилося. Як тільки я включив файл js bootstrap, все просто працювало.


0

Простий Спробуйте зробити функцію в javascript для класу згортання, що випадає.

Приклад:

JS :

$scope.toogleMyClass  = function(){

    //dropdown-element

    $timeout(function(){
        $scope.preLoader = false;
        $(document).ready(function() {
            $("#dropdown-element").toggleClass('show');
        });
    },100);

};

Підключіть цю функцію до onClickпростих робіт для мене.


0

У мене була подібна проблема, але моя не залишилася б відкритою, вона відкриється / закриється швидко, я виявив, що у мене завантажувався jquery-1.11.1.min.js перед bootstrap.min.js. Тож я змінив порядок цих 2 файлів і виправив своє меню. Зараз працює бездоганно. Сподіваюся, це допомагає


0

Проблема може полягати в тому, що ви використовуєте застарілі версії bootstrap або jquery, АБО ви називаєте більше однієї версії під час розмітки.

Просто зберігайте останні версії, вам потрібна лише одна посилання. Вирішує проблему.


0

ви можете просто переконатися, що ви завантажуєте jQuery і Bootstrap.min.js ATF. Ваша навігація - це перше, що потрібно відобразити на сторінці, тому якщо у вас є сценарії в нижній частині HTML, ви втрачаєте будь-яку функціональність JavaScript.


0

У мене була та сама проблема лише для мобільних пристроїв, але для програми Angular, і це я зробив:

app.component.html

<nav class="navbar navbar-default navbar-fixed-top">
  <div class="container">
    <div class="col-md-12">
      <div class="navbar-header page-scroll">
      <button id ="navButton" style="color:red"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" routerLink="/"><img id="navbrand" class="site-logo"  src="assets/img/yayaka_logo.png"/></a>
    </div>
    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
      <ul class="nav navbar-nav navbar-right">
        <li class="hidden">
          <a href="#page-top"></a>
        </li>
        <li class="dropdown" appDropdown>
          <a class="dropdown-toggle" style="cursor: pointer;">
            ΤΙ ΕΙΝΑΙ ΤΟ yayaka<span class="caret"></span>
          </a>
          <ul class="dropdown-menu">
            <li><a (click) = "closeMenu()" href="/#about">About</a></li>
            <li><a (click) = "closeMenu()" href="/#services">Services</a></li>
          </ul>
        </li>
        <li class="page-scroll">
          <a (click) = "closeMenu()" routerLink="/profiles"><strong>Profiles</strong></a>
        </li>
      </ul>
    </div>
  </div>
  </div>
</nav>

app.component.ts

 closeMenu() {
    var isMobile = /iPhone|iPad|iPod|BlackBerry|Opera Mini|IEMobile|Android/i.test(navigator.userAgent);
    if (isMobile) {
      document.getElementById('navButton').click();
    }
  }

Сподіваюся, це допомагає :)


-2

Моє меню не стандартне, але мені вдалося автоматично згортати шахту, використовуючи функцію "onclick" та ".click ()".

<div class="main-header">
    <div class="container">
        <div id="menu-wrapper">
            <div class="row">

                <div class="logo-wrapper col-lg-4 col-md-6 col-sm-7 hidden-xs">

                </div> <!-- /.logo-wrapper -->

                <div class="logo-wrapper2 visible-xs col-xs-9">

                </div> <!-- /.smaller logo-wrapper -->

                <div class="col-lg-8 col-md-6 col-sm-5 col-xs-3 main-menu text-center">
                    <ul class="menu-first hidden-md hidden-sm hidden-xs">
                        <li class="active"><a href="#">item1</a></li> |
                        <li><a href="#our-team">item2</a></li> |
                        <li><a href="#services">item3</a></li> |
                        <li><a href="#elia">item4</a></li> |
                        <li><a href="#portfolio">item5</a></li> |
                        <li><a href="#contact">item6</a></li>
                    </ul>
                    <a href="#" class="toggle-menu visible-md visible-sm visible-xs"><i class="fa fa-bars"></i></a>
                </div> <!-- /.main-menu -->
            </div> <!-- /.row -->
        </div> <!-- /#menu-wrapper -->
        <div class="menu-responsive hidden-lg">
            <ul>
                <li class="active" onclick = $(".toggle-menu").click();><a href="#">item1</a></li>
                <li><a href="#our-team" onclick = $(".toggle-menu").click();>item2</a></li>
                <li><a href="#services" onclick = $(".toggle-menu").click();>item3</a></li>
                <li><a href="#elia" onclick = $(".toggle-menu").click();>item4</a></li>
                <li><a href="#portfolio" onclick = $(".toggle-menu").click();>item5</a></li>
                <li><a href="#contact" onclick = $(".toggle-menu").click();>item6</a></li>
            </ul>
        </div> <!-- /.menu-responsive -->
    </div> <!-- /.container -->
</div> <!-- /.main-header 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.