8
8
9
9
import {
10
10
AfterContentInit ,
11
+ ChangeDetectionStrategy ,
12
+ ChangeDetectorRef ,
11
13
Component ,
14
+ ContentChild ,
12
15
ContentChildren ,
13
16
ElementRef ,
17
+ EventEmitter ,
18
+ forwardRef ,
19
+ Inject ,
14
20
Input ,
21
+ NgZone ,
22
+ OnDestroy ,
15
23
Optional ,
16
24
Output ,
17
25
QueryList ,
18
- ChangeDetectionStrategy ,
19
- EventEmitter ,
20
26
Renderer2 ,
21
27
ViewEncapsulation ,
22
- NgZone ,
23
- OnDestroy ,
24
- Inject ,
25
- ChangeDetectorRef , ContentChild , forwardRef ,
26
28
} 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' ;
30
32
import { ESCAPE } from '../core/keyboard/keycodes' ;
31
- import { first , takeUntil , startWith } from '../core/rxjs/index' ;
33
+ import { first , startWith , takeUntil } from '../core/rxjs/index' ;
32
34
import { DOCUMENT } from '@angular/platform-browser' ;
33
35
import { merge } from 'rxjs/observable/merge' ;
34
36
import { Subject } from 'rxjs/Subject' ;
@@ -62,7 +64,11 @@ export class MdDrawerToggleResult {
62
64
encapsulation : ViewEncapsulation . None ,
63
65
} )
64
66
export class MdDrawerContent implements AfterContentInit {
65
- /** Margins to be applied to the content. */
67
+ /**
68
+ * Margins to be applied to the content. These are used to push / shrink the drawer content when a
69
+ * drawer is open. We use margin rather than transform even for push mode because transform breaks
70
+ * fixed position elements inside of the transformed element.
71
+ */
66
72
_margins : { left : number , right : number } = { left : 0 , right : 0 } ;
67
73
68
74
constructor (
@@ -71,7 +77,7 @@ export class MdDrawerContent implements AfterContentInit {
71
77
}
72
78
73
79
ngAfterContentInit ( ) {
74
- this . _container . _contentMargins . subscribe ( ( margins ) => {
80
+ this . _container . _contentMargins . subscribe ( margins => {
75
81
this . _margins = margins ;
76
82
this . _changeDetectorRef . markForCheck ( ) ;
77
83
} ) ;
@@ -193,6 +199,10 @@ export class MdDrawer implements AfterContentInit, OnDestroy {
193
199
/** @deprecated */
194
200
@Output ( 'align-changed' ) onAlignChanged = new EventEmitter < void > ( ) ;
195
201
202
+ /**
203
+ * An observable that emits when the drawer mode changes. This is used by the drawer container to
204
+ * to know when to when the mode changes so it can adapt the margins on the content.
205
+ */
196
206
_modeChanged = new Subject ( ) ;
197
207
198
208
get isFocusTrapEnabled ( ) {
@@ -524,6 +534,13 @@ export class MdDrawerContainer implements AfterContentInit {
524
534
* sparingly, because it causes a reflow.
525
535
*/
526
536
private _updateContentMargins ( ) {
537
+ // 1. For drawers in `over` mode, they don't affect the content.
538
+ // 2. For drawers in `side` mode they should shrink the content. We do this by adding to the
539
+ // left margin (for left drawer) or right margin (for right the drawer).
540
+ // 3. For drawers in `push` mode the should shift the content without resizing it. We do this by
541
+ // adding to the left or right margin and simultaneously subtracting the same amount of
542
+ // margin from the other side.
543
+
527
544
let left = 0 ;
528
545
let right = 0 ;
529
546
0 commit comments