diff --git a/core/src/components/refresher/refresher.tsx b/core/src/components/refresher/refresher.tsx index 347c9bdf14..fb4497ac23 100644 --- a/core/src/components/refresher/refresher.tsx +++ b/core/src/components/refresher/refresher.tsx @@ -692,6 +692,16 @@ export class Refresher implements ComponentInterface { // and close the refresher // set that the refresh is actively cancelling this.cancel(); + } else if (this.state === RefresherState.Inactive) { + /** + * The pull to refresh gesture was aborted + * so we should immediately restore any overflow styles + * that have been modified. Do not call this.cancel + * because the styles will only be reset after a timeout. + * If the gesture is aborted then scrolling should be + * available right away. + */ + this.restoreOverflowStyle(); } } @@ -716,7 +726,12 @@ export class Refresher implements ComponentInterface { this.state = RefresherState.Inactive; this.progress = 0; this.didStart = false; - this.setCss(0, '0ms', false, ''); + + /** + * Reset any overflow styles so the + * user can scroll again. + */ + this.setCss(0, '0ms', false, '', true); }, 600); // reset the styles on the scroll element @@ -725,7 +740,13 @@ export class Refresher implements ComponentInterface { this.setCss(0, this.closeDuration, true, delay); } - private setCss(y: number, duration: string, overflowVisible: boolean, delay: string) { + private setCss( + y: number, + duration: string, + overflowVisible: boolean, + delay: string, + shouldRestoreOverflowStyle = false + ) { if (this.nativeRefresher) { return; } @@ -738,11 +759,18 @@ export class Refresher implements ComponentInterface { scrollStyle.transform = backgroundStyle.transform = y > 0 ? `translateY(${y}px) translateZ(0px)` : ''; scrollStyle.transitionDuration = backgroundStyle.transitionDuration = duration; scrollStyle.transitionDelay = backgroundStyle.transitionDelay = delay; - if (overflowVisible) { - scrollStyle.overflow = 'hidden'; - } else { - this.restoreOverflowStyle(); - } + scrollStyle.overflow = overflowVisible ? 'hidden' : ''; + } + + /** + * Reset the overflow styles only once + * the pull to refresh effect has been closed. + * This ensures that the gesture is done + * and the refresh operation has either + * been aborted or has completed. + */ + if (shouldRestoreOverflowStyle) { + this.restoreOverflowStyle(); } }); }