Search code examples
angularbootstrap-4ngx-bootstrap

Show different navbar items on collapse (ngx-bootstrap)


With ngx-bootstrap, is it possible to show different navbar bootstrap items depending on whether the navbar is collapsed or not?

I tried to do this by making a div for collapsed and !collapsed. Unfortunately, both show when !collapsed.

StackBlitz: https://stackblitz.com/edit/angular-startup-proj-ddztm4

<nav class="navbar navbar-expand-sm 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-label="Toggle navigation"
          [attr.aria-expanded]="!isCollapsed"
          (click)="isCollapsed = !isCollapsed">
      <span class="navbar-toggler-icon"></span>
  </button>

  <!-- show only when not collapsed -->
  <div class="collapse navbar-collapse navbarSupportedContent"
       [ngClass]="{'hide': isCollapsed}">
    <ul class="navbar-nav mr-auto">
      <li class="nav-item active">
        <a class="nav-link"
           href="#">Link One - full screen</a>
      </li>
      <li class="nav-item">
        <a class="nav-link"
           href="#">Link Two - full screen</a>
      </li>
    </ul>
  </div>

  <!-- show only when collapsed -->
  <div class="collapse navbar-collapse navbarSupportedContent"
  [ngClass]="{'show': !isCollapsed}">
    <ul class="navbar-nav mr-auto">
      <li class="nav-item active">
        <a class="nav-link"
            href="#">Link Two - collapsed</a>
      </li>
      <li class="nav-item">
        <a class="nav-link text-success"
            href="#">Link Three - collapsed</a>
      </li>
    </ul>
  </div>
</nav>

TS:

 isCollapsed = true;

Solution

  • It's possible if you add [style.display]="isCollapsed?'inherit':'none'" into <ul class="navbar-nav mr-auto":

    <!-- show only when not collapsed -->
    <div class="collapse navbar-collapse navbarSupportedContent"
    [ngClass]="{'hide': isCollapsed}">
      <ul class="navbar-nav mr-auto">
      <!-- rest of code .... -->
    </div>
    <!-- show only when collapsed -->
    <div class="collapse navbar-collapse navbarSupportedContent"
    [ngClass]="{'show': !isCollapsed}">
      <ul class="navbar-nav mr-auto" [style.display]="isCollapsed?'inherit':'none'">
      <!-- rest of code .... -->
    </div>
    

    Update:

    To make it responsive you can use @media queries(example in w3school):

    @media (max-width: 576px){
       ul.collapse{
          display:none !important;
       }
    }
    
    @media (min-width: 576px){
       ul.full{
          display:none !important;
       }
    }
    

    in css then add the following ul classes:

    <!-- show only when not collapsed -->
    `<ul class="navbar-nav mr-auto collapse">`
    
    <!-- show only when collapsed -->
    <ul class="navbar-nav mr-auto full" [style.display]="isCollapsed?'inherit':'none'">
    

    Example on Stackblitz Fork