So verstecken Sie die zusammenklappbare Bootstrap 4-Navigationsleiste beim Klicken

105

Ich habe diese zusammenklappbare Navigationsleiste mit Bootstrap 4 erstellt, die gut funktioniert, aber ich möchte, dass sie geschlossen wird, wenn der Benutzer auf einen Link klickt. Wie kann man das machen? Vielen Dank

HTML-Navigationsleiste:

<nav class="navbar navbar-toggleable-md fixed-top">

<button id="nav-btn"class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#navbarDiv"  aria-expanded="false" aria-label="Toggle navigation">
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
 </button>

            <div class="container">

                <a class="navbar-brand" href="#"><img src="Images/logo.png" width="60px"></a>

                    <div class="collapse navbar-collapse" id="navbarDiv">

                        <ul class="navbar-nav mr-auto">

                            <li class="nav-item active">

                                <a class="nav-link" href="#home">Home <span class="sr-only">(current)</span></a>

                            </li>

                            <li class="nav-item">

                                <a class="nav-link" href="#about-us">About</a>

                            </li>

                            <li class="nav-item">

                                <a class="nav-link" href="#pricing">Pricing</a>

                            </li>

                        </ul>

                    </div>

            </div>

        </nav>

CSS für .icon-Bar, da Bootstrap 4 die Icon-Bar-Klasse nicht verwendet.

.navbar-toggler .icon-bar {
  margin: 7px;
  display: block;
  width: 22px;
  height: 1px;
  background-color: #cccccc;
  border-radius: 1px;
}
Rudi Thiel
quelle

Antworten:

168

Sie können die collapseKomponente wie folgt zu den Links hinzufügen .

<ul class="navbar-nav mr-auto">
     <li class="nav-item active">
         <a class="nav-link" href="#home" data-toggle="collapse" data-target=".navbar-collapse.show">Home <span class="sr-only">(current)</span></a>
     </li>
     <li class="nav-item">
         <a class="nav-link" href="#about-us" data-toggle="collapse" data-target=".navbar-collapse.show">About</a>
     </li>
     <li class="nav-item">
         <a class="nav-link" href="#pricing" data-toggle="collapse" data-target=".navbar-collapse.show">Pricing</a>
     </li>
 </ul>

Demo mit der 'Data-Toggle'-Methode

Oder (vielleicht besser) verwenden Sie jQuery wie folgt.

$('.navbar-nav>li>a').on('click', function(){
    $('.navbar-collapse').collapse('hide');
});

Demo mit der jQuery-Methode

Update 2019 - Bootstrap 4

Die Navigationsleiste hat sich geändert, aber die Methode "Nach Klick schließen" ist immer noch dieselbe:

https://codeply.com/go/nFDHoEqqJQ (jQuery-Methode)
https://codeply.com/go/PqIBtz3HPL ( data-toggleMethode, siehe Bootstrap Collapse-Komponente )

Zim
quelle
1
Hallo, danke für die Antwort, aber wenn ich das mache, wird die Navigationsleiste nicht ausgeblendet, sondern das div-Element, mit dem es mit scrollspy verknüpft ist. Irgendwelche Vorschläge? Danke
Rudi Thiel
3
Großartig .. und denken Sie daran, Sie können <span class="navbar-toggler-icon"></span>für die
Zim
2
Sie können navbar-inversein der Navigationsleiste verwenden, um alle Textfarben in Weiß (oder transparentes Weiß) zu ändern
Zim
3
@Zim - Sie müssen stattdessen das data-toggleund data-targetauf das übergeordnete Element ( li) setzen, da sonst scrollspy nicht funktioniert. Vielleicht sollten Sie Ihre Antwort bearbeiten. :)
J. Sadi
1
Der Vorschlag von @ J.Sadi hat diese Arbeit für mich gemacht. Ansonsten haben die Linkklicks nichts bewirkt.
Totalhack
44

Ich benutze ANGULAR und da es mir Probleme bereitete, fügte der RouterLink einfach den Datenumschalter und das Ziel in das Li-Tag ein ... oder verwendete eine Abfrage wie "ZimSystem".

<div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav mr-auto">
        <li class="nav-item" data-toggle="collapse" data-target=".navbar-collapse.show">
          <a class="nav-link" routerLink="/inicio" routerLinkActive="active" >Inicio</a>
        </li>
      </ul>
</div>

Jesus38
quelle
4
Danke, du hast den Tag für mich gerettet!. Ich verwende Angular 6 mit Bootstrap 4.1.3. Angewandt data-toggle="collapse" data-target=".navbar-collapse.show"auf li einschließlich Drop - Down - li.
Lernen ...
2
Diese Antwort ist einfach sauber und großartig!
Nation Chirara
17

Sie können $.collapse('hide');mit einem Event-Handler über die Links aufrufen .

$('.nav-link').on('click',function() {
  $('.navbar-collapse').collapse('hide');
});
.navbar-toggler .icon-bar {
  margin: 7px;
  display: block;
  width: 22px;
  height: 1px;
  background-color: #cccccc;
  border-radius: 1px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha.6/js/bootstrap.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" rel="stylesheet"/>
<nav class="navbar navbar-toggleable-md fixed-top">
  <button id="nav-btn" class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#navbarDiv" aria-expanded="false" aria-label="Toggle navigation">
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
 </button>
  <div class="container">
    <a class="navbar-brand" href="#"><img src="Images/logo.png" width="60px"></a>
    <div class="collapse navbar-collapse" id="navbarDiv">
      <ul class="navbar-nav mr-auto">
        <li class="nav-item active">
          <a class="nav-link" href="#home">Home <span class="sr-only">(current)</span></a>
        </li>
        <li class="nav-item">
          <a class="nav-link" href="#about-us">About</a>
        </li>
        <li class="nav-item">
          <a class="nav-link" href="#pricing">Pricing</a>
        </li>
      </ul>
    </div>
  </div>
</nav>

Michael Coker
quelle
9

Beim Ausprobieren der oben genannten Lösungen fehlte mir eine Lösung für Dropdown-Schalter. Also los geht's! Öffnet auch Untermenüelemente.

Vielleicht müssen Sie es ein wenig optimieren, wenn Ihre Umschaltklasse anders ist.

$('.navbar-nav li a').on('click', function(){
    if(!$( this ).hasClass('dropdown-toggle')){
        $('.navbar-collapse').collapse('hide');
    }
});
Hendrik Vlaanderen
quelle
1
Dies ist kürzer und möglicherweise schneller:$(".navbar-nav li a:not('.dropdown-toggle')") .on('click', function () { $('.navbar-collapse').collapse('hide'); }
James Wilkins
5

Dies ist die Lösung, um das Menü zu schließen, wenn Sie auf Anker klicken und diese Zeile im Listenelement anwenden

     data-target="#sidenav-collapse-main" data-toggle="collapse"

Das wahre Beispiel, das für mich funktioniert, ist unten

      <li class="nav-item" data-target="#sidenav-collapse-main" data- 
      toggle="collapse" >
      <a class="nav-link" routerLinkActive="active" routerLink="/admin/users">
        <i class="ni ni-single-02  text-orange"></i> Users
      </a>
      </li>
abubakkar tahir
quelle
2

Ich verwende Angular 5 mit Boostrap 4. Es funktioniert für mich auf diese Weise.

 $(document).on('click', '.navbar-nav>li>a, .navbar-brand, .dropdown-menu>a', function (e) {
      if ( $(e.target).is('a') && $(e.target).attr('class') != 'nav-link dropdown-toggle' ) {
        $('.navbar-collapse').collapse('hide');
      }
    });
   }
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
  <a class="navbar-brand" [routerLink]="['/home']">FbShareTool</a>
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarColor01" aria-controls="navbarColor01" aria-expanded="false" aria-label="Toggle navigation" style="">
    <span class="navbar-toggler-icon"></span>
  </button>

  <div class="collapse navbar-collapse" id="navbarColor01">
    <ul class="navbar-nav mr-auto">
      <li class="nav-item active" *ngIf="_myAuthService.isAuthenticated()">
        <a class="nav-link" [routerLink]="['/dashboard']">Dashboard <span class="sr-only">(current)</span></a>
      </li>
      <li class="nav-item dropdown" *ngIf="_myAuthService.isAuthenticated()">
          <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
            Manage
          </a>
          <div class="dropdown-menu" aria-labelledby="navbarDropdown">
            <a class="dropdown-item" [routerLink]="['/fbgroup']">Facebook Group</a>
            <div class="dropdown-divider"></div>
            <a class="dropdown-item" href="#">Fetch Data</a>
          </div>
      </li>
    </ul>

    <ul class="navbar-nav navbar-right navbar-right-link">
        <li class="nav-item" *ngIf="!_myAuthService.isAuthenticated()" >
            <a class="nav-link" (click)="logIn()">Login</a>
        </li>
        <li class="nav-item" *ngIf="_myAuthService.isAuthenticated()">
           <a class="nav-link">{{ _myAuthService.userDetails.displayName }}</a>
        </li>
        <li class="nav-item" *ngIf="_myAuthService.isAuthenticated() && _myAuthService.userDetails.photoURL">
            <a>
              <img [src]="_myAuthService.userDetails.photoURL" alt="profile-photo" class="img-fluid rounded" width="40px;">
            </a>
        </li>
        <li class="nav-item" *ngIf="_myAuthService.isAuthenticated()">
            <a class="nav-link" (click)="logOut()">Logout</a>
        </li>
    </ul>

  </div>
</nav>

Pedro
quelle
2

Der einfachste Weg, dies zu tun, indem Sie nur eine Angular 2/4-Vorlage ohne Codierung verwenden:

<nav class="navbar navbar-default" aria-expanded="false">
  <div class="container-wrapper">

    <div class="navbar-header">
      <button type="button" class="navbar-toggle collapsed" (click)="isCollapsed = !isCollapsed">
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
    </div>

    <div class="navbar-collapse collapse no-transition" [attr.aria-expanded]="!isCollapsed" [ngClass]="{collapse: isCollapsed}">
      <ul class="nav navbar-nav" (click)="isCollapsed = !isCollapsed">
        <li [routerLinkActive]="['active']" [routerLinkActiveOptions]="{exact: true}"><a routerLink="/">Home</a></li>
        <li [routerLinkActive]="['active']"><a routerLink="/about">About</a></li>
        <li [routerLinkActive]="['active']"><a routerLink="/portfolio">Portfolio</a></li>
        <li [routerLinkActive]="['active']"><a routerLink="/contacts">Contacts</a></li>
      </ul>
    </div>

  </div>
</nav>
Donmutti
quelle
2

Dieser Code simuliert einen Klick auf die Burguer-Schaltfläche, um die Navigationsleiste zu schließen, indem Sie auf einen Link im Menü klicken und den Ausblendeffekt beibehalten. Lösung mit Typoskript für Winkel 7. Vermeiden Sie Probleme mit routerLink.

ToggleNavBar () {
    let element: HTMLElement = document.getElementsByClassName( 'navbar-toggler' )[ 0 ] as HTMLElement;
    if ( element.getAttribute( 'aria-expanded' ) == 'true' ) {
        element.click();
    }
}

<li class="nav-item" [routerLinkActive]="['active']">
    <a class="nav-link" [routerLink]="['link1']" title="link1" (click)="ToggleNavBar()">link1</a>
</li>
edu
quelle
Die mit jQuery vorgeschlagenen Lösungen funktionieren in Angular 7 mit verzögertem Laden nicht richtig.
Edu
0

Sie können ein einfaches Binden beim Klicken und Schließen verwenden, wie folgt: (click)="drawer.close()

<a class="nav-link" [routerLink]="navItem.link" routerLinkActive="selected" (click)="drawer.close()">
Mihai Cristian
quelle