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의 대답은 확실히 가장 쉽고 직접적인 대답입니다!
Thomas

답변:


48

Bootstrap의 기본 설정은 메뉴 항목을 클릭 할 때 메뉴를 열어 두는 것입니다. .collapse('hide');축소하려는 jQuery 요소를 호출하여이 동작을 수동으로 재정의 할 수 있습니다 .


8
이것은 잘못되었습니다. 부트 스트랩은 "collapse"클래스를 자동으로 토글합니다. 추가 jquery 코드가 필요하지 않습니다. 그러한 행동이 있다면 html 코드에 문제가 있음을 의미합니다 (제 부분에서는 jquery와 부트 스트랩을 두 번 포함했습니다.
RomOne 2017

@RomOne 정답입니다. 기본적으로 링크를 클릭하면 부트 스트랩 이 메뉴를 닫지 않습니다 . 다른 대답은 사람들 이이 질문에 대한 정답이 아닌 jQuery를 두 번 잘못 포함하는 경우 에만 적용됩니다.
Zim

136

GitHub의 솔루션에서 이것을 공유하기 위해 다음과 같은 인기있는 답변이있었습니다.

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

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

이것은 문서에 연결되어 있으므로 ready ()에서 할 필요가 없습니다 (메뉴에 링크를 동적으로 추가 할 수 있으며 여전히 작동합니다). 메뉴가 이미 확장 된 경우에만 호출됩니다. 어떤 사람들은 메뉴가 열리는 곳에서 이상한 점멸을보고했다가 메뉴에 "in"클래스가 있는지 확인하지 않은 다른 코드로 즉시 닫힙니다.

[UPDATE 2014-11-04] 분명히 하위 메뉴를 사용할 때 위의 문제가 발생할 수 있으므로 위의 내용이 다음과 같이 수정되었습니다.

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

1
완벽하게 작동합니다. 공유해 주셔서 감사합니다!
Rodrigo Chiong

'$ (this) .collapse ('hide ');'설명해 주시겠습니까? 부디. '붕괴'가 어디에서 왔는지 이해가 안
돼요

@ImranNazir, 미안합니다 이것은 질문 이후의 방법이지만 collapse부트 스트랩에 의해 정의되고 jQuery 객체에 첨부 된 메소드입니다 ... 아마도 그들은 여러 목적 (아코디언, navbar 등)으로 이것을 재사용합니다
Kevin Nelson

업데이트 된 코드는 나를 위해 일했지만 위의 답변은 그렇지 않았습니다. 감사!
RandomUs1r

"[UPDATE 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/issues/9013


14
이 솔루션은 모바일보기에 적합하지만 링크를 클릭하면 큰 화면에서 애니메이션 표시 / 숨기기를 표시합니다.
Ayman Al-Absi

22
@ AymanAl-Absi 값 .in끝에 추가 해야합니다 data-target: data-target=".navbar-collapse.in". 이 답변의 주석에서 : stackoverflow.com/a/21797534/89818
caw

이것은 나를 위해 잘 작동하지만 스크롤 스파이를 깨뜨립니다. 왜 그런지 알 수 있습니까?
Craig Harley

1
@caw 답변으로 위의 코드를 업데이트했을 때 나를 위해 일했습니다. 나는 또한 scrollspy 기능을 사용하고 있습니다.
Niraj

이것은 단연 최고의 솔루션입니다. 자바 스크립트도, jQuery도 없습니다. 특정 링크가 메뉴를 열어 두도록하려면이 매개 변수를 추가하지 마십시오. 최고의 답변으로 지적되어야합니다. 감사합니다.
ed1nh0

55

나는이 같은 문제가 있었지만 포함하여 발생하는 bootstrap.jsjquery.js 파일 .

한 번의 클릭으로 두 jquery 인스턴스에서 이벤트가 두 번 처리되었습니다. 하나는 닫히고 하나는 토글을 열었습니다.


3
나는 똑같은 문제가 있었지만 두 번 포함된다는 것을 깨닫지 못했습니다. 게시 해 주셔서 감사합니다!
Brian ONeil 2014

2
인턴도 마찬가지였습니다. 게시 해 주셔서 감사합니다.
Teisman 2015

2
남자! 나도 똑같은 일을했습니다. 인턴으로 돌아간 것 같아요!
Dicer

2
정말 도움이되었습니다! 나는 이것에 대해 며칠 동안 일하고 있었다. 이것은 navbar 템플릿을 사용할 때 매우 일반적 일 수 있습니다. 조심하세요! :)
Matt Butler

2
이것은 우수 답변으로 표시되어야합니다. 나는 제거 bootstrap.js이 문제를 해결 같은 문제가 있었다
katwekibs

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

이것은 탐색 모음에서 드롭 다운을 처리하는 데 도움이됩니다.


이것은 jssor 슬라이드 쇼에서 자바 스크립트와 함께 부트 스트랩을 사용하여 문제가 발생하는 문제를 해결했습니다. 이 코드는 모바일 메뉴를 확장 및 축소 할 때도 멋진 효과를 만듭니다.
Adam West

감사합니다 @Chakradhar, 그것은 내 시간을 절약했습니다.
Omar Bahir

감사합니다. Laravel 5.5 JS에는 기본 js 파일에 B 및 Jquery가 포함되어 있다는 사실을 잊었습니다.
Jack Vial

12

Bootstrap 4, alpha-6 및 Joakim Johansson 의 답변 과 비슷한 문제가 있거나 비슷한 문제가 있습니다. 자바 스크립트가 필요하지 않습니다. data-target = ". navbar-collapse"및 data-toggle = "collapse"를 nav 내부의 div 태그에 넣지 만 링크 / 버튼을 둘러싸는 것이 저에게 효과적이었습니다.

<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 = "collapse"data-target = ". navbar-collapse">
Dessus

이것은 이미 3 년 전에 게시되었습니다. 또한 모바일이 아닌보기에서 애니메이션을 중단합니다.
Bevor

6

이 질문이 Bootstrap 3에 대한 것이라는 것을 알고 있지만 Bootstrap 4에 대한 솔루션을 찾고 있다면 다음과 같이하십시오.

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

BS4 베타를 사용하고 있으며 코드가 완벽하게 작동합니다. 나는 운이없는 다른 모든 제안 된 솔루션을 여기에서 시도했습니다. BS4는 다른 솔루션이 적용되지 않을 정도로 충분히 변경되었습니다.
Bicycle Dave

관련성과 업데이트 된 정보를 동시에 유지하기 위해-이것이 최선의 답변이어야합니다.
Ricky

@Ricky OP는 4가 아닌 부트 스트랩 3을 지정했습니다.
Malavos

: 드롭 다운과 메뉴의 경우 나는이 사용$(".navbar-nav li a:not('.dropdown-toggle')") .on('click', function () { $('.navbar-collapse').collapse('hide'); }
제임스 윌킨스

5

나는 같은 문제가 없었다 내가 사용하고 있었다 jQuery-1.7.1bootstrap 3.2.0. jQuery 버전을 최신 ( jquery-1.11.2) 버전으로 변경했는데 모든 것이 잘 작동합니다.


5

나는했다

$(".navbar-toggle").click(function(event) {
    $(".navbar-collapse").toggle('in');
});

4

메뉴 항목 자체를 변경하기 위해 이전에 게시 된 솔루션은 아래와 같이 메뉴가 작은 장치에있을 때 작동하지만 메뉴가 전체 너비에 있고 확장 되면 부작용 이 있습니다. 이로 인해 가로 스크롤 막대가 메뉴 항목 . 자바 스크립트 솔루션에는 이러한 부작용이 없습니다.

<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 :-)
Chit

@bfontaine 먼저 메뉴 div에 id를 추가해야하며 메뉴를 클릭하면 모든 메뉴가 숨겨집니다. 예 :-회사 소개 메뉴를 클릭하면 나머지 메뉴 탭이 숨겨집니다.
Chit

1
감사합니다,하지만 쓰기를 기쁘게 답)
bfontaine

1

각도 지시문 내에서 .collapse ( 'hide')를 호출하여이 동작을 수동으로 재정의하려는 경우 다음 코드가 있습니다.

자바 스크립트 파일 :

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

최신 부트 스트랩 js 버전을 사용하고 있는지 확인하십시오. 나는 똑같은 문제에 직면했고 bootstrap-3.3.6에서 bootstrap.js 파일을 업그레이드하는 것만으로도 마술이되었습니다.


1

모바일 화면에서 사용할 때만 내비게이션을 전환하려면 다음을 추가 data-toggle="collapse"하고data-target="#navbar" 를 A 요소에 모바일 화면에 작동하지만 바탕 화면에서 클릭 할 때 당신에게 이상한 깜박임을 줄 것이다. Aurelia 또는 Angular 환경에서는 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의 영감에 대한 링크 . 접기 및 햄버거 토글과 함께 부트 스트랩의 navbar navbar-fixed-top을 사용하고 있습니다. 다음은 jsfiddle의 내 버전입니다. jsfiddle Scrollspy navbar . getbootsrap.com의 지침을 사용하여 기본 기능 만 얻었습니다. 나에게 문제는 대부분 모호한 방향과 getbootstrap 사이트에서 권장하는 js였습니다. 가장 좋은 점은이 추가 js (위의 스레드에서 언급 한 내용 중 일부를 포함 함)를 추가하면 다음과 같은 몇 가지 Scrollspy 문제가 해결된다는 것입니다.

  1. 탐색 "섹션"(예 : href = "# foobar")을 클릭하면 축소 / 전환 된 탐색 메뉴가 숨겨집니다 (이 스레드 해결 문제).
  2. 활성 "섹션"이 성공적으로 강조 표시되었습니다 (예 : js가 class = "active"를 성공적으로 생성 함).
  3. 축소 된 탐색에서 발견되는 성가신 세로 스크롤 막대 (작은 화면에서만)가 제거되었습니다.

참고 : 아래에 표시된 js 코드에서 (내 게시물의 두 번째 jsfiddle 링크에서) :

topMenu = $ ( "# myScrollspy"),

... 값 "myScrollspy"는 HTML의 id = ""와 일치해야합니다.

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

물론 그 값을 원하는 값으로 변경할 수 있습니다.


0

버튼에 data-target = ". navbar-collapse"만 있으면됩니다.

<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 = "collapse"data-target = ". navbar-collapse"를 <a />에 추가하거나 제 경우에는 Meteorjs의 React와 함께 <Link />를 추가하여 작동합니다. 감사합니다.
Joe L.

예, 작동 <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 파일을 포함하자마자 모든 것이 작동했습니다.


0

단순 드롭 다운 접기 클래스를 위해 자바 스크립트에서 함수를 만들어보세요.

예:

JS :

$scope.toogleMyClass  = function(){

    //dropdown-element

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

};

이 기능을 onClick간단한 작업에 연결하십시오.


0

비슷한 문제가 있었지만 내 열리지 않을 것입니다. 빠르게 열리거나 닫힐 것입니다 .bootstrap.min.js 전에 jquery-1.11.1.min.js 가로 드되었음을 알았습니다. 그래서 나는 그 두 파일의 순서를 바꾸고 메뉴를 수정했습니다. 이제 완벽하게 실행됩니다. 도움이되기를 바랍니다.


0

문제는 부트 스트랩 또는 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

내 메뉴는 navbar 표준 메뉴가 아니지만 "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 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.