diff --git a/src/lib/expansion/expansion-animations.ts b/src/lib/expansion/expansion-animations.ts index 47e243f9d1ee..572e037d5452 100644 --- a/src/lib/expansion/expansion-animations.ts +++ b/src/lib/expansion/expansion-animations.ts @@ -35,7 +35,7 @@ export const matExpansionAnimations: { /** Animation that expands and collapses the panel header height. */ expansionHeaderHeight: trigger('expansionHeight', [ - state('collapsed', style({ + state('collapsed, void', style({ height: '{{collapsedHeight}}', }), { params: {collapsedHeight: '48px'}, @@ -45,7 +45,7 @@ export const matExpansionAnimations: { }), { params: {expandedHeight: '64px'} }), - transition('expanded <=> collapsed', group([ + transition('expanded <=> collapsed, expanded <=> void', group([ query('@indicatorRotate', animateChild(), {optional: true}), animate(EXPANSION_PANEL_ANIMATION_TIMING), ])), @@ -53,8 +53,11 @@ export const matExpansionAnimations: { /** Animation that expands and collapses the panel content. */ bodyExpansion: trigger('bodyExpansion', [ - state('collapsed', style({height: '0px', visibility: 'hidden'})), + // Note: we also have `void` here as a fallback, because Angular will reset the + // state back to void when the element is being removed. See #11765. + state('collapsed, void', style({height: '0px', visibility: 'hidden'})), state('expanded', style({height: '*', visibility: 'visible'})), - transition('expanded <=> collapsed', animate(EXPANSION_PANEL_ANIMATION_TIMING)), + transition('expanded <=> collapsed, expanded <=> void', + animate(EXPANSION_PANEL_ANIMATION_TIMING)), ]) }; diff --git a/src/lib/expansion/expansion-panel.ts b/src/lib/expansion/expansion-panel.ts index e40071b8d406..dbd82221ae87 100644 --- a/src/lib/expansion/expansion-panel.ts +++ b/src/lib/expansion/expansion-panel.ts @@ -163,8 +163,7 @@ export class MatExpansionPanel extends CdkAccordionItem // with doing it via change detection. if (phaseName === 'done' && toState === 'expanded') { classList.add(cssClass); - } - if (phaseName === 'start' && toState === 'collapsed') { + } else if (phaseName === 'start' && (toState === 'collapsed' || toState === 'void')) { classList.remove(cssClass); }