diff --git a/src/demo-app/sidenav/sidenav-demo.html b/src/demo-app/sidenav/sidenav-demo.html index 10da18a0fa31..f33bdf075062 100644 --- a/src/demo-app/sidenav/sidenav-demo.html +++ b/src/demo-app/sidenav/sidenav-demo.html @@ -48,6 +48,19 @@

Sidenav Already Opened

+

Responsive Sidenav

+ + + + Drawer + + +
+ The sidenav will responsively open and close, resize your window! + +
+
+

Dynamic Alignment Sidenav

diff --git a/src/lib/sidenav/sidenav.ts b/src/lib/sidenav/sidenav.ts index b2b995674b0b..89b3ea8b8878 100644 --- a/src/lib/sidenav/sidenav.ts +++ b/src/lib/sidenav/sidenav.ts @@ -23,6 +23,7 @@ import { OnDestroy, Inject, ChangeDetectorRef, + HostListener } from '@angular/core'; import {animate, state, style, transition, trigger, AnimationEvent} from '@angular/animations'; import {coerceBooleanProperty} from '@angular/cdk/coercion'; @@ -316,6 +317,35 @@ export class MdSidenavContainer implements AfterContentInit { /** The sidenav child with the `end` alignment. */ get end() { return this._end; } + /** + * Width of the container at which it breaks + * e.g., breakpointWidth="500" + */ + @Input() breakpointWidth: number; + + /** Mode of the breakpoint; either true or false */ + @Input() breakpointChangeMode: true | false = true; + + /** + * Responsively toggle the sidenav using the breakpoint. + * Note that this only works when the window is rezied. + * If you resize it some other way, call checkBreakpoint(). + */ + @HostListener('window:resize', ['$event']) + checkBreakpoint() { + if (this._element.nativeElement.offsetWidth < this.breakpointWidth) { + if (this.breakpointChangeMode) + this._sidenavs.forEach(sidenav => sidenav.mode = "over"); + this.close(); + } + if (this._element.nativeElement.offsetWidth > this.breakpointWidth) { + if (this.breakpointChangeMode) + this._sidenavs.forEach(sidenav => sidenav.mode = "side"); + this.open(); + } + this._updateStyles(); + } + /** Event emitted when the sidenav backdrop is clicked. */ @Output() backdropClick = new EventEmitter(); @@ -353,6 +383,7 @@ export class MdSidenavContainer implements AfterContentInit { this._watchSidenavAlign(sidenav); }); }); + this.checkBreakpoint(); } /** Calls `open` of both start and end sidenavs */