Angular 2 Material 2 Sidenav Toolbar collapse like Navigation Drawer

16,305

Solution 1

This problem is little unusual. Since the button from toolbar is controlling the open and close state, I had to add an EventListener to pass the state of sidenav whenever the button is clicked.

Based on the event flag, I added some ngStyle that will maintain the width of sidenav. Note that, the sidenav is always open now [add property opened="true"], since it's always visible. I also ended up using the emitted flag from toolbar to use for 'Sidenav' title. You can remove it if you need to show the partial 'Sid'.

Also, since the sidenav is always open, I added custom css to animate the change of width.

Plunker demo

toolbar.component.ts:

export class ToolbarComponent implements OnInit {

  shortnav = true;

  @Input() sidenav;

  @Output()
  change: EventEmitter<booelan> = new EventEmitter<boolean>();

  constructor() { 
    console.log(this.sidenav);
  }

  ngOnInit() {
  }

  toggle(){
    this.shortnav = !this.shortnav;
    console.log("shortnav: " + this.shortnav)
    this.change.emit(this.shortnav);
  }

}

toolbar.component.html:

<button md-button class="toolbar-menu-button"
          (click)="toggle(); isCollapsed = !isCollapsed">

sidenav.component.ts:

export class SidenavOverviewExample {

  showSidenavTitle = false;
  sidenavWidth = 2.75;

  changeWidth(showShortNav){
    if(showShortNav){
      this.sidenavWidth = 2.5;
      this.showSidenavTitle = false;
    }
    else{
      this.sidenavWidth = 13;
      this.showSidenavTitle = true;
    }
  }
}

sidenav.component.html:

<md-sidenav-container fullscreen>
    <md-sidenav #sidenav mode="side"   
                color="primary" 
                opened="true"
                [ngStyle]="{ 'width.em': sidenavWidth }"
                class="animate-sidenav">
     <md-toolbar color="primary">
       <span *ngIf="showSidenavTitle">Sidenav</span>
     </md-toolbar>
        <button md-button class="sidenav-link" (click)="sidenav.close()">
          <md-icon>home</md-icon><span class="title"> HOME</span>
          </button>
          <button md-button class="sidenav-link" (click)="sidenav.close()">
            <md-icon>home</md-icon><span class="title"> HOME</span>
          </button>
      </md-sidenav>

      <app-toolbar [sidenav]="sidenav" (change)="changeWidth($event)"></app-toolbar>

 </md-sidenav-container>

sidenav.component.css:

.mat-sidenav-transition .mat-sidenav{
  /* custom animation to grow and shrink width */
  -webkit-transition: width .3s !important; /* For Safari 3.1 to 6.0 */
  transition: width .3s !important;
}

Hope this helps you :)

Solution 2

enter image description here

This can be achieved using a simple css hack. We can call methods increase() and decrease() that changes the width of sidenav based on some event like mouseenter and mouseleave or in your case onClick of "toolbar-menu-button"

<md-sidenav #sidenav mode="side" class="example-sidenav" [ngStyle]="{ 'width.em': sidenavWidth }" opened="true" (mouseover)="increase()"   (mouseleave)="decrease()">

This will incerese the width of sidenav when we point on sidenav and decrease the width when we point the mouse pointer at some other place.

  increase(){
    this.sidenavWidth = 15;
  }
  decrease(){
    this.sidenavWidth = 4;
  }

Have a look at this demo :- https://mini-sidenav.firebaseapp.com/

and the github repo :- https://github.com/Ravi-Rajpurohit/mini-md-sidenav

I hope this helps :-)

Share:
16,305
Pako
Author by

Pako

Updated on June 18, 2022

Comments

  • Pako
    Pako almost 2 years

    I have a sidenav and a nested toolbar
    toolbar.html

    <md-sidenav-container fullscreen>
        <md-sidenav #sidenav mode="side" color="primary">
         <md-toolbar color="primary"><span>Sidenav</span></md-toolbar>
            <button md-button class="sidenav-link" (click)="sidenav.close()">
              <md-icon>home</md-icon><span class="title"> HOME</span>
              </button>
              <button md-button class="sidenav-link" (click)="sidenav.close()">
                <md-icon>home</md-icon><span class="title"> HOME</span>
              </button>
          </md-sidenav>
          <app-toolbar [sidenav]="sidenav"></app-toolbar>
    </md-sidenav-container>
    

    sidenav.html

    <md-toolbar color="primary">
      <button md-button class="toolbar-menu-button"
              (click)="sidenav.toggle(); isCollapsed = !isCollapsed">
        <md-icon [@iconChange]="isCollapsed">menu</md-icon>
      </button>
      <span class="toolbar-spacer"></span>
      <button md-button class="toolbar-link" >DASHBOARD</button>
      <span class="toolbar-spacer"></span>
    </md-toolbar>
    

    https://plnkr.co/edit/up19ZNJyMt6uatqdI9uv?p=preview

    I would like to close the sidenav up to the home icon like Navigation Drawer

    close sidenav sidenav close

    open sidenav sidenav open