88
99import {
1010 AfterContentInit ,
11+ ChangeDetectionStrategy ,
12+ ChangeDetectorRef ,
1113 Component ,
14+ ContentChild ,
1215 ContentChildren ,
1316 ElementRef ,
17+ EventEmitter ,
18+ forwardRef ,
19+ Inject ,
1420 Input ,
21+ NgZone ,
22+ OnDestroy ,
1523 Optional ,
1624 Output ,
1725 QueryList ,
18- ChangeDetectionStrategy ,
19- EventEmitter ,
2026 Renderer2 ,
2127 ViewEncapsulation ,
22- NgZone ,
23- OnDestroy ,
24- Inject ,
25- ChangeDetectorRef , ContentChild , forwardRef ,
2628} from '@angular/core' ;
27- import { animate , state , style , transition , trigger , AnimationEvent } from '@angular/animations' ;
28- import { Directionality , coerceBooleanProperty } from '../core' ;
29- import { FocusTrapFactory , FocusTrap } from '../core/a11y/focus-trap' ;
29+ import { animate , AnimationEvent , state , style , transition , trigger } from '@angular/animations' ;
30+ import { coerceBooleanProperty , Directionality } from '../core' ;
31+ import { FocusTrap , FocusTrapFactory } from '../core/a11y/focus-trap' ;
3032import { ESCAPE } from '../core/keyboard/keycodes' ;
31- import { first , takeUntil , startWith } from '../core/rxjs/index' ;
33+ import { first , startWith , takeUntil } from '../core/rxjs/index' ;
3234import { DOCUMENT } from '@angular/platform-browser' ;
3335import { merge } from 'rxjs/observable/merge' ;
3436import { Subscription } from 'rxjs/Subscription' ;
@@ -63,7 +65,11 @@ export class MdDrawerToggleResult {
6365 encapsulation : ViewEncapsulation . None ,
6466} )
6567export class MdDrawerContent implements AfterContentInit {
66- /** Margins to be applied to the content. */
68+ /**
69+ * Margins to be applied to the content. These are used to push / shrink the drawer content when a
70+ * drawer is open. We use margin rather than transform even for push mode because transform breaks
71+ * fixed position elements inside of the transformed element.
72+ */
6773 _margins : { left : number , right : number } = { left : 0 , right : 0 } ;
6874
6975 constructor (
@@ -72,7 +78,7 @@ export class MdDrawerContent implements AfterContentInit {
7278 }
7379
7480 ngAfterContentInit ( ) {
75- this . _container . _contentMargins . subscribe ( ( margins ) => {
81+ this . _container . _contentMargins . subscribe ( margins => {
7682 this . _margins = margins ;
7783 this . _changeDetectorRef . markForCheck ( ) ;
7884 } ) ;
@@ -194,6 +200,10 @@ export class MdDrawer implements AfterContentInit, OnDestroy {
194200 /** @deprecated */
195201 @Output ( 'align-changed' ) onAlignChanged = new EventEmitter < void > ( ) ;
196202
203+ /**
204+ * An observable that emits when the drawer mode changes. This is used by the drawer container to
205+ * to know when to when the mode changes so it can adapt the margins on the content.
206+ */
197207 _modeChanged = new Subject ( ) ;
198208
199209 get isFocusTrapEnabled ( ) {
@@ -532,6 +542,13 @@ export class MdDrawerContainer implements AfterContentInit, OnDestroy {
532542 * sparingly, because it causes a reflow.
533543 */
534544 private _updateContentMargins ( ) {
545+ // 1. For drawers in `over` mode, they don't affect the content.
546+ // 2. For drawers in `side` mode they should shrink the content. We do this by adding to the
547+ // left margin (for left drawer) or right margin (for right the drawer).
548+ // 3. For drawers in `push` mode the should shift the content without resizing it. We do this by
549+ // adding to the left or right margin and simultaneously subtracting the same amount of
550+ // margin from the other side.
551+
535552 let left = 0 ;
536553 let right = 0 ;
537554
0 commit comments