Bootstrap schließen reaktionsschnelles Menü "on click"

86

Wenn Sie auf "PRODUKTE" klicken, schiebe ich ein weißes Div nach oben (siehe Anhang). Im reaktionsschnellen Modus (Handy und Tablet) möchte ich die reaktionsfähige Navigationsleiste automatisch schließen und nur den weißen Balken anzeigen.

Ich habe es versucht:

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

auch versucht:

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

Und es funktioniert. In der Desktop-Größe wird es jedoch auch aufgerufen und macht etwas Ungewöhnliches im Menü, wo es für eine Sekunde schrumpft.

Irgendwelche Ideen?

Geben Sie hier die Bildbeschreibung ein

user1040259
quelle
Könnten Sie etwas HTML posten? Verwenden Sie Bootstrap auch für die Ausblendfunktion? Oder versuchen Sie etwas Eigenes zu implementieren?
Kris Hollenbeck
Ich versuche nur, etwas Einfaches zu tun, denke ich. Ich möchte nur die Navigationsleiste schließen, wenn ich auf "PRODUKTE"
klicke
Wenn Sie nicht versuchen möchten, alle diese Lösungen hier selbst zu vergleichen, sollten Sie die Nummer 1 dieser Antwort bearbeiten .
Caw
Ich empfehle, hier ein bisschen nach unten zu scrollen und die Antwort von @LukeTillman zu lesen. Funktioniert perfekt und ohne jQuery. :)
das Keks

Antworten:

101

Ich muss mit Animation arbeiten!

Menü in HTML:

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

Bindungsklickereignis für alle Elemente in der Navigation zum Reduzieren-Menü (Bootstrap-Kollaps-Plugin):

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

BEARBEITEN Um es allgemeiner zu gestalten, können wir das folgende Code-Snippet verwenden

 $(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');
     });
 });
Mollwe
quelle
3
Wenn nicht alle aElemente: Sie müssen nur anrufen$("#nav-main").collapse('hide');
Ankit Jain
@mollwe Haben Sie eine Lösung für ein Dropdown-Menü? Ich habe eine jsfiddle gemacht, um es zu versuchen, aber selbst das Menü lässt sich nicht öffnen. jsfiddle.net/Y3H92
clankill3r
@ clankill3r Es scheint mir, dass ein Verweis auf bootstrap.js fehlt und daher das Menü nicht funktioniert. Ich habe Ihre jsfiddle aktualisiert: jsfiddle.net/Y3H92/1
mollwe
@mollwe mit deiner Geige wird das Menü für mich überhaupt nicht geschlossen.
Clankill3r
1
Entschuldigung für die späte Antwort @ clankill3r! Aber besser spät als nie. jsfiddle.net/mollwe/Y3H92/5
Mollwe
135

Sie müssen kein zusätzliches Javascript zu dem hinzufügen, was bereits in der Option zum Reduzieren von Bootstraps enthalten ist. Fügen Sie stattdessen einfach Datenumschalt- und Datenziel-Selektoren in Ihre Menülistenelemente ein, genau wie Sie es mit Ihrer Navbar-Umschalttaste tun. Für Ihren Menüpunkt Produkte würde dies also so aussehen

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

Dann müssten Sie die Datenumschalt- und Datenzielauswahl für jeden Menüpunkt wiederholen

BEARBEITEN!!! Um Überlaufprobleme zu beheben und bei diesem Fix zu flackern, füge ich weiteren Code hinzu, der dies behebt und immer noch kein zusätzliches Javascript enthält. Hier ist der neue Code:

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

Hier ist es bei der Arbeit http://jsfiddle.net/jaketaylor/84mqazgq/

Dadurch werden Ihre Umschalt- und Zielauswahl für die Bildschirmgröße spezifisch und Störungen im größeren Menü werden vermieden. Wenn jemand immer noch Probleme mit Störungen hat, lassen Sie es mich bitte wissen und ich werde eine Lösung finden. Vielen Dank

BEARBEITEN : Im Bootstrap v4.1.3 konnte ich keine sichtbaren / versteckten Klassen verwenden. Anstelle von hidden-xsGebrauch d-none d-sm-blockund statt visible-xsGebrauch d-block d-sm-none.

Jake Taylor
quelle
14
Das verursacht flackerndes und seltsames Zeug, wenn das Navi nicht als "responsives" Menü angezeigt wird.
Florian
5
Dies ist die richtige Implementierung. Keine benutzerdefinierte jQuery erforderlich.
Larrylampco
Ich habe meine Ablehnung dieser Antwort und meines vorherigen Kommentars entfernt (auch da das Video nicht mehr funktionierte). Da mein Kommentar zum Flackern für die ursprüngliche Antwort immer noch gültig ist, ein paar positive Stimmen erhalten hat und Ihre "Bearbeitung" deutlich markiert ist, sehe ich keinen Grund, sie zu entfernen und den Verlauf neu zu schreiben. es war zu der Zeit gültig und Sie haben entsprechend reagiert. Leute, die Ihre Antwort lesen, werden das "Bearbeiten" sehen und wissen, dass Sie es verbessert haben ...
Florian
Sie bevorzugen es, alle Ihre Links zu duplizieren, um eine einzige Zeile perfekt dokumentierten Javascript zu vermeiden? getbootstrap.com/javascript/#collapse-methods .
Sander Garretsen
1
Anstatt jedem li-Element die Attribute data-toggleund data-targethinzuzufügen, können Sie sie auch dem übergeordneten Element uloder den divTags hinzufügen .
Jeremy Quick
40

Ich denke, Sie sind alle über Engineering ..

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

BEARBEITEN: Um sich um Untermenüs zu kümmern, stellen Sie sicher, dass auf ihrem Umschaltanker die Dropdown-Umschaltklasse vorhanden ist.

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

BEARBEITEN 2: Unterstützung für Telefonberührung hinzufügen.

    $(function () {
            $('.navbar-collapse ul li a:not(.dropdown-toggle)').bind('click touchstart', function () {
                    $('.navbar-toggle:visible').click();
            });
    });
Hontoni
quelle
3
Sollte die akzeptierte Antwort sein. Die anderen sind überarbeitet und flackern auf dem nicht reagierenden Display.
Rybo111
3
Dies könnte die akzeptierte Antwort sein, berücksichtigt jedoch keine Untermenüs und bricht sie tatsächlich. Einige der anderen "überentwickelten" Lösungen haben dies trotz ihrer Mängel berücksichtigt. Der folgende Zusatz würde sich darum kümmern: $ (function () {$ ('. Navbar -apse ul li a: not (.dropdown-toggle)'). Click (function () {$ ('. Navbar-toggle: sichtbar '). click ();});});
Ed Bishop
super, danke für deine BEARBEITUNG!
Hontoni
1
Ich denke, Touchstart ist ein bisschen zu viel, Klick funktioniert gut. Wie reagiert es auf das Gleiten, wenn Sie über die Schaltfläche "starten"?
Hontoni
37

Jake Taylors Idee, es ohne zusätzliches JavaScript zu machen und den Zusammenbruch von Bootstrap zu nutzen, hat mir sehr gut gefallen. Ich habe festgestellt, dass Sie das Problem "Flackern" beheben können, wenn sich das Menü nicht im reduzierten Modus befindet, indem Sie den data-targetSelektor leicht ändern, um die inKlasse einzuschließen. So sieht es aus:

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

Ich habe es nicht mit verschachtelten Dropdowns / Menüs getestet, also YMMV.

Luke Tillman
quelle
3
Dies war auch für mich die beste Implementierung.
Huijing
Aus irgendeinem Grund bricht mein ScrollSpy mit dieser Methode ab, funktioniert aber gut mit Jake Taylors Methode.
Inkling
Die bisher beste und einfachste Antwort.
Diaa
Ich habe eine Weile versucht, einen flimmerfreien Zusammenbruch zum Funktionieren zu bringen, aber dies ist bei weitem die einfachste und eleganteste Lösung. Danke dir!
McVenco
8

Nur um vollständig zu sein, hat in Bootstrap 4.0.0-Beta die Verwendung von .show für mich funktioniert ...

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

Ich gehe davon aus, dass Sie eine Linie wie diese haben, die den Navigationsbereich definiert, basierend auf Bootstrap-Beispielen und allem

<div class="nav-collapse collapse" >

Fügen Sie einfach die Eigenschaften als solche hinzu, wie auf der Schaltfläche MENÜ

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

Ich habe hinzugefügt <body> , gearbeitet. Ich kann nicht sagen, dass ich ein Profil erstellt habe oder so, aber es scheint mir ein Vergnügen zu sein ... bis Sie auf eine zufällige Stelle der Benutzeroberfläche klicken, um das Menü zu öffnen, also nicht so gut.

DK

Douglas 'DK' Knudsen
quelle
Richtige Lösung, die auf der integrierten Funktionalität von Bootstrap basiert; kein zusätzliches jQuery oder Javascript. Und die einfachste Lösung von allen. Dies sollte die akzeptierte Antwort sein.
Sergi Papaseit
4

Dies funktioniert, wird aber nicht animiert.

$('.btn-navbar').addClass('collapsed');
$('.nav-collapse').removeClass('in').css('height', '0');
user1040259
quelle
7
Es ist ein bisschen überraschend, dass es dafür keine Konfigurationsoption gibt, da das Schließen beim Klicken eine bessere Standardeinstellung wäre.
Bchesley
3

Im HTML hat ich eine Klasse von nav-Link zu dem einem Tag jeden Navigationslink.

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

Diese Lösung funktioniert gut auf Desktop und Mobile.

<div id="navbar" class="navbar-collapse collapse" data-toggle="collapse"  data-target=".navbar-collapse collapse">
bp002
quelle
funktionierte für mich bei Verwendung der Navbar-ID als Datenziel: <div id = "navbar" class = "Zusammenbruch navbar-Zusammenbruch" data-toggle = "Zusammenbruch" data-target = "# navbar"> gibt aber eine hässliche Animation während in Desktop-Größe
Wutzebaer
Sehr hässlich, unpassend!
Candlejack
2

Fügen Sie diesen Code zu $ ​​(document) .ready (function () {}) hinzu, um die Lösung von user1040259 zu erläutern.

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

Wie bereits erwähnt, wird dadurch die Bewegung nicht animiert, aber die Navigationsleiste bei der Elementauswahl wird geschlossen

CharlesA
quelle
2

Für diejenigen, die AngularJS und Angular UI Router verwenden, ist hier meine Lösung (mit Mollwe's Toggle). Wobei ".navbar-main -apse" mein "Datenziel" ist.

Direktive erstellen:

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');
                }
            });
        }
    };
}]);

Richtlinie verwenden:

<div class="collapse navbar-collapse navbar-main-collapse">
    <your menu>
Kyle
quelle
Sieht so aus, als hätten Sie die Direktive in die Klasse attr eingefügt, stimmt das?
Gringo Suave
Innerhalb der Link-Funktion sollte Folgendes funktionieren. element.on ('click', function () {scope.vm.isCollapsed =! scope.vm.isCollapsed;});
JimmyBob
2

Dies sollte den Trick tun.

Benötigt bootstrap.js.

Beispiel => http://getbootstrap.com/javascript/#collapse

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

Dies entspricht dem Hinzufügen der Attribute 'data-toggle = "apse "und' href =" yournavigationID "'zu Navigationsmenü-Tags.

Jussi Järviö
quelle
Könnten Sie die Antwort etwas genauer erklären?
Blunderfest
Ist das nicht jQuery? Ist es nicht generell eine schlechte Praxis, sowohl jQuery als auch Angular zu verwenden?
AlxVallejo
1

Ich benutze die Mollwe-Funktion, obwohl ich 2 Verbesserungen hinzugefügt habe:

a) Vermeiden Sie das Schließen der Dropdown-Liste, wenn der angeklickte Link reduziert ist (einschließlich anderer Links).

b) Blenden Sie das Dropdown-Menü auch aus, wenn Sie auf den sichtbaren Webinhalt klicken.

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');
                    }
                });

            });
Arco Voltaico
quelle
1

Nicht der neueste Thread, aber ich suchte nach einer Lösung für das gleiche Problem und fand eine (eine Mischung aus einigen anderen).

Ich gab den NavButton:

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

eine ID / Kennung wie:

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

Nicht die beste "Idee" - aber: Funktioniert für mich! Jetzt können Sie die Sichtbarkeit Ihrer Schaltfläche (mit jquery) wie folgt überprüfen:

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

(HINWEIS: Dies ist nur ein abgeschnittener Code! Ich habe ein "Onclick" -Ereignis für meine Navigationslinks verwendet! (Starten eines AJAX-Reguest.)

Das Ergebnis ist: Wenn die Schaltfläche "sichtbar" ist, wurde sie "angeklickt" ... Also: Kein Fehler, wenn Sie die "Vollbildansicht" von Bootstrap verwenden (Breite über 940px).

Grüße Ralph

PS: Es funktioniert gut mit IE9, IE10 und Firefox 25. Andere wurden nicht überprüft - aber ich kann kein Problem erkennen :-)

Ralph D.
quelle
1

Das hat bei mir funktioniert. Wenn ich auf die Menüschaltfläche klicke, füge ich die Klasse 'in' hinzu oder entferne sie, weil durch Hinzufügen oder Entfernen dieser Klasse der Umschalter standardmäßig funktioniert. 'e.stopPropagation ()' dient zum Stoppen der Standardanimation per Bootstrap (ich denke). Sie können auch die 'toggleClass' anstelle der Klasse add oder remove verwenden.

$ ('# ChangeToggle'). On ('click', Funktion (e) {

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

    });
Goutami
quelle
0

Sie können verwenden

ul.nav {
    display: none;
}

Dadurch wird die Navigationsleiste standardmäßig geschlossen. Bitte lassen Sie mich wissen, dass jemand dies nützlich findet

Kris
quelle
2
Das Problem ist, dass das Navigationsgerät ausgeblendet wird, wenn es "normal" angezeigt wird, nicht im Antwortmenü.
Florian
0

Wenn Ihr umschaltbares Symbol beispielsweise nur für besonders kleine Geräte sichtbar ist, können Sie Folgendes tun:

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

Wenn Sie auf [data-toggle = "offcanvas"] klicken, werden die .hidden-xs von bootstrap zu meinem # Seitenmenü hinzugefügt, wodurch der Inhalt des Seitenmenüs ausgeblendet wird. Wenn Sie das Fenster vergrößern, wird es jedoch wieder sichtbar.

Kingsley Ijomah
quelle
0

wenn Menü HTML ist

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

on nav toggle 'in' Klasse wird hinzugefügt und aus dem Toggle entfernt. Überprüfen Sie, ob das Reaktionsmenü geöffnet ist, und führen Sie dann das Schließen um.

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

Tuggle Nav Close, IE-Browser-kompatible Antwort, ohne Konsolenfehler. Wenn Sie Bootstrap verwenden, verwenden Sie dies

$('.nav li a').on('click', function () {
    if ($("#navbar").hasClass("in")) {
        $('.navbar-collapse.in').show();
    }
    else {
        $('.navbar-collapse.in').hide();
    }
})
Supermodel
quelle
-1
$('.navbar-toggle').trigger('click');
Aqib
quelle
Ich verstehe nicht, warum dies nicht die richtige Antwort ist? Wenn Sie auf einen der Menü-Links in diesem Klick-Ereignis klicken, können Sie das Menü umschalten, was meiner Meinung nach der richtige Weg ist, da ich das Standardverhalten beim Öffnen oder Schließen des Menüs nicht ändere.
Aqib
-1

Bootstrap 4-Lösung ohne Javascript

Fügen Sie dem data-toggle="collapse" data-target="#navbarSupportedContent.show" div Attribute hinzu<div class="collapse navbar-collapse">

Stellen Sie sicher , dass Sie den richtigen idindata-target

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

.show ist zu vermeiden, dass das Menü bei großen Auflösungen flackert

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

kiranvj
quelle