diff --git a/src/demo-app/sidenav/sidenav-demo.html b/src/demo-app/sidenav/sidenav-demo.html
index 728a85dacd4..5918c181348 100644
--- a/src/demo-app/sidenav/sidenav-demo.html
+++ b/src/demo-app/sidenav/sidenav-demo.html
@@ -4,7 +4,7 @@
Header
-
+
Start Side Sidenav
@@ -41,6 +41,7 @@
Sidenav
+ Has backdrop
Fixed mode
Sidenav covers header/footer
diff --git a/src/demo-app/sidenav/sidenav-demo.ts b/src/demo-app/sidenav/sidenav-demo.ts
index 0af65025eb7..4e1ad35c4e8 100644
--- a/src/demo-app/sidenav/sidenav-demo.ts
+++ b/src/demo-app/sidenav/sidenav-demo.ts
@@ -25,6 +25,7 @@ export class SidenavDemo {
showHeader = false;
showFooter = false;
modeIndex = 0;
+ hasBackdrop: boolean;
get mode() { return ['side', 'over', 'push'][this.modeIndex]; }
get fixedTop() { return this.fixed && this.showHeader && !this.coverHeader ? 64 : 0; }
get fixedBottom() { return this.fixed && this.showFooter && !this.coverHeader ? 64 : 0; }
diff --git a/src/lib/sidenav/drawer.scss b/src/lib/sidenav/drawer.scss
index 271478fd331..1b28845dacb 100644
--- a/src/lib/sidenav/drawer.scss
+++ b/src/lib/sidenav/drawer.scss
@@ -45,6 +45,12 @@ $mat-drawer-over-drawer-z-index: 4;
overflow: hidden;
}
}
+
+ // When the consumer explicitly enabled the backdrop,
+ // we have to pull the side drawers above it.
+ &.mat-drawer-container-explicit-backdrop .mat-drawer-side {
+ z-index: $mat-drawer-backdrop-z-index;
+ }
}
.mat-drawer-backdrop {
diff --git a/src/lib/sidenav/drawer.spec.ts b/src/lib/sidenav/drawer.spec.ts
index 67ac8d3fe57..753ed646d64 100644
--- a/src/lib/sidenav/drawer.spec.ts
+++ b/src/lib/sidenav/drawer.spec.ts
@@ -643,6 +643,35 @@ describe('MatDrawerContainer', () => {
expect(fixture.nativeElement.querySelector('.mat-drawer-backdrop')).toBeFalsy();
}));
+ it('should be able to explicitly enable the backdrop in `side` mode', fakeAsync(() => {
+ const fixture = TestBed.createComponent(BasicTestApp);
+ const root = fixture.nativeElement;
+
+ fixture.componentInstance.drawer.mode = 'side';
+ fixture.detectChanges();
+ fixture.componentInstance.drawer.open();
+ fixture.detectChanges();
+ tick();
+ fixture.detectChanges();
+
+ let backdrop = root.querySelector('.mat-drawer-backdrop.mat-drawer-shown');
+
+ expect(backdrop).toBeFalsy();
+
+ fixture.componentInstance.hasBackdrop = true;
+ fixture.detectChanges();
+ backdrop = root.querySelector('.mat-drawer-backdrop.mat-drawer-shown');
+
+ expect(backdrop).toBeTruthy();
+ expect(fixture.componentInstance.drawer.opened).toBe(true);
+
+ backdrop.click();
+ fixture.detectChanges();
+ tick();
+
+ expect(fixture.componentInstance.drawer.opened).toBe(false);
+ }));
+
});
@@ -666,7 +695,7 @@ class DrawerContainerTwoDrawerTestApp {
@Component({
template: `
- = new EventEmitter();
@@ -663,8 +668,8 @@ export class MatDrawerContainer implements AfterContentInit, OnDestroy {
/** Whether the container is being pushed to the side by one of the drawers. */
private _isPushed() {
- return (this._isDrawerOpen(this._start) && this._start!.mode != 'over') ||
- (this._isDrawerOpen(this._end) && this._end!.mode != 'over');
+ return (this._isDrawerOpen(this._start) && this._start.mode != 'over') ||
+ (this._isDrawerOpen(this._end) && this._end.mode != 'over');
}
_onBackdropClicked() {
@@ -675,16 +680,20 @@ export class MatDrawerContainer implements AfterContentInit, OnDestroy {
_closeModalDrawer() {
// Close all open drawers where closing is not disabled and the mode is not `side`.
[this._start, this._end]
- .filter(drawer => drawer && !drawer.disableClose && drawer.mode !== 'side')
+ .filter(drawer => drawer && !drawer.disableClose && this._canHaveBackdrop(drawer))
.forEach(drawer => drawer!.close());
}
_isShowingBackdrop(): boolean {
- return (this._isDrawerOpen(this._start) && this._start!.mode != 'side')
- || (this._isDrawerOpen(this._end) && this._end!.mode != 'side');
+ return (this._isDrawerOpen(this._start) && this._canHaveBackdrop(this._start)) ||
+ (this._isDrawerOpen(this._end) && this._canHaveBackdrop(this._end));
}
- private _isDrawerOpen(drawer: MatDrawer | null): boolean {
+ private _canHaveBackdrop(drawer: MatDrawer): boolean {
+ return drawer.mode !== 'side' || !!this._backdropOverride;
+ }
+
+ private _isDrawerOpen(drawer: MatDrawer | null): drawer is MatDrawer {
return drawer != null && drawer.opened;
}
diff --git a/src/lib/sidenav/sidenav.ts b/src/lib/sidenav/sidenav.ts
index c04cc8a7ca1..e1b026078e0 100644
--- a/src/lib/sidenav/sidenav.ts
+++ b/src/lib/sidenav/sidenav.ts
@@ -106,6 +106,7 @@ export class MatSidenav extends MatDrawer {
styleUrls: ['drawer.css'],
host: {
'class': 'mat-drawer-container mat-sidenav-container',
+ '[class.mat-drawer-container-explicit-backdrop]': '_backdropOverride',
},
changeDetection: ChangeDetectionStrategy.OnPush,
encapsulation: ViewEncapsulation.None,