@@ -693,6 +693,12 @@ export class MatSlider
693693  /** Subscription to changes to the directionality (LTR / RTL) context for the application. */ 
694694  private  _dirChangeSubscription : Subscription ; 
695695
696+   /** Observer used to monitor size changes in the slider. */ 
697+   private  _resizeObserver : ResizeObserver  |  null ; 
698+ 
699+   /** Timeout used to debounce resize listeners. */ 
700+   private  _resizeTimer : number ; 
701+ 
696702  constructor ( 
697703    readonly  _ngZone : NgZone , 
698704    readonly  _cdr : ChangeDetectorRef , 
@@ -727,6 +733,7 @@ export class MatSlider
727733      this . _foundation . init ( ) ; 
728734      this . _foundation . layout ( ) ; 
729735      this . _initialized  =  true ; 
736+       this . _observeHostResize ( ) ; 
730737    } 
731738    // The MDC foundation requires access to the view and content children of the MatSlider. In 
732739    // order to access the view and content children of MatSlider we need to wait until change 
@@ -746,6 +753,9 @@ export class MatSlider
746753      this . _foundation . destroy ( ) ; 
747754    } 
748755    this . _dirChangeSubscription . unsubscribe ( ) ; 
756+     this . _resizeObserver ?. disconnect ( ) ; 
757+     this . _resizeObserver  =  null ; 
758+     clearTimeout ( this . _resizeTimer ) ; 
749759    this . _removeUISyncEventListener ( ) ; 
750760  } 
751761
@@ -919,6 +929,31 @@ export class MatSlider
919929  _isRippleDisabled ( ) : boolean  { 
920930    return  this . disabled  ||  this . disableRipple  ||  ! ! this . _globalRippleOptions ?. disabled ; 
921931  } 
932+ 
933+   /** Starts observing and updating the slider if the host changes its size. */ 
934+   private  _observeHostResize ( )  { 
935+     if  ( typeof  ResizeObserver  ===  'undefined'  ||  ! ResizeObserver )  { 
936+       return ; 
937+     } 
938+ 
939+     // MDC only updates the slider when the window is resized which 
940+     // doesn't capture changes of the container itself. We use a resize 
941+     // observer to ensure that the layout is correct (see #24590). 
942+     this . _ngZone . runOutsideAngular ( ( )  =>  { 
943+       // The callback will fire as soon as an element is observed and 
944+       // we only want to know after the initial layout. 
945+       let  hasResized  =  false ; 
946+       this . _resizeObserver  =  new  ResizeObserver ( ( )  =>  { 
947+         if  ( hasResized )  { 
948+           // Debounce the layouts since they can happen frequently. 
949+           clearTimeout ( this . _resizeTimer ) ; 
950+           this . _resizeTimer  =  setTimeout ( this . _layout ,  50 ) ; 
951+         } 
952+         hasResized  =  true ; 
953+       } ) ; 
954+       this . _resizeObserver . observe ( this . _elementRef . nativeElement ) ; 
955+     } ) ; 
956+   } 
922957} 
923958
924959/** The MDCSliderAdapter implementation. */ 
0 commit comments