diff --git a/src/components/sidenav/_sidenav.scss b/src/components/sidenav/_sidenav.scss index 2a9a5d9f640..21ef811efe2 100644 --- a/src/components/sidenav/_sidenav.scss +++ b/src/components/sidenav/_sidenav.scss @@ -10,6 +10,10 @@ material-sidenav { transition: transform 0.3s ease-in-out; @extend .material-sidenav-left; + + &.closed { + display: none; + } } .material-sidenav-left { @@ -45,18 +49,6 @@ material-sidenav { } } -/* - * When sidenav is closed on small screen, show no box shadow - */ -@media (max-width: $layout-breakpoint-md) { - material-sidenav { - &:not(.open).material-sidenav-left, - &:not(.open).material-sidenav-right { - box-shadow: none; - } - } -} - @media (max-width: $sidenav-default-width + 2 * $sidenav-min-room) { material-sidenav { max-width: 75%; diff --git a/src/components/sidenav/sidenav.js b/src/components/sidenav/sidenav.js index 81c98bdb61a..e2d4a51889b 100644 --- a/src/components/sidenav/sidenav.js +++ b/src/components/sidenav/sidenav.js @@ -6,7 +6,8 @@ * A Sidenav QP component. */ angular.module('material.components.sidenav', [ - 'material.services.registry' + 'material.services.registry', + 'material.animations' ]) .factory('$materialSidenav', [ '$materialComponentRegistry', @@ -14,6 +15,8 @@ angular.module('material.components.sidenav', [ ]) .directive('materialSidenav', [ '$timeout', + '$materialEffects', + '$$rAF', materialSidenavDirective ]) .controller('$materialSidenavController', [ @@ -172,63 +175,83 @@ function materialSidenavService($materialComponentRegistry) { * }); * */ -function materialSidenavDirective($timeout) { +function materialSidenavDirective($timeout, $materialEffects, $$rAF) { return { restrict: 'E', scope: {}, controller: '$materialSidenavController', - link: function($scope, $element, $attr, sidenavCtrl) { - var backdrop = angular.element(''); + compile: compile + }; - $scope.$watch('isOpen', onShowHideSide); + function compile(element, attr) { + element.addClass('closed'); - /** - * Toggle the SideNav view and attach/detach listeners - * @param isOpen - */ - function onShowHideSide(isOpen) { - var parent = $element.parent(); - - $element.toggleClass('open', !!isOpen); - - if (isOpen) { - parent.append(backdrop); - backdrop.on('click', close); - parent.on('keydown', onKeyDown); - } else { - backdrop.remove(); - backdrop.off('click', close); - parent.off('keydown', onKeyDown); - } - } + return postLink; + } + function postLink(scope, element, attr, sidenavCtrl) { + var backdrop = angular.element(''); - /** - * Auto-close sideNav when the `escape` key is pressed. - * @param evt - */ - function onKeyDown(evt) { - if(evt.which === Constant.KEY_CODE.ESCAPE){ - close(); + scope.$watch('isOpen', onShowHideSide); + element.on($materialEffects.TRANSITIONEND_EVENT, onTransitionEnd); - evt.preventDefault(); - evt.stopPropagation(); - } + /** + * Toggle the SideNav view and attach/detach listeners + * @param isOpen + */ + function onShowHideSide(isOpen) { + var parent = element.parent(); + + if (isOpen) { + element.removeClass('closed'); + + parent.append(backdrop); + backdrop.on('click', close); + parent.on('keydown', onKeyDown); + + } else { + backdrop.remove(); + backdrop.off('click', close); + parent.off('keydown', onKeyDown); } - /** - * With backdrop `clicks` or `escape` key-press, immediately - * apply the CSS close transition... Then notify the controller - * to close() and perform its own actions. - */ - function close() { + $$rAF(function() { + element.toggleClass('open', !!scope.isOpen); + }); + } - onShowHideSide( false ); + function onTransitionEnd(ev) { + if (ev.target === element[0] && !scope.isOpen) { + element.addClass('closed'); + } + } - $timeout(function(){ - sidenavCtrl.close(); - }); + /** + * Auto-close sideNav when the `escape` key is pressed. + * @param evt + */ + function onKeyDown(evt) { + if(evt.which === Constant.KEY_CODE.ESCAPE){ + close(); + + evt.preventDefault(); + evt.stopPropagation(); } + } + /** + * With backdrop `clicks` or `escape` key-press, immediately + * apply the CSS close transition... Then notify the controller + * to close() and perform its own actions. + */ + function close() { + + onShowHideSide( false ); + + $timeout(function(){ + sidenavCtrl.close(); + }); } - }; + + } + }