@@ -92,6 +92,8 @@ const StickyScrollBar: React.ForwardRefRenderFunction<unknown, StickyScrollBarPr
92
92
} ;
93
93
94
94
const checkScrollBarVisible = ( ) => {
95
+ raf . cancel ( rafRef . current ) ;
96
+
95
97
rafRef . current = raf ( ( ) => {
96
98
if ( ! scrollBodyRef . current ) {
97
99
return ;
@@ -144,13 +146,27 @@ const StickyScrollBar: React.ForwardRefRenderFunction<unknown, StickyScrollBarPr
144
146
} ;
145
147
} , [ scrollBarWidth , isActive ] ) ;
146
148
149
+ // Loop for scroll event check
147
150
React . useEffect ( ( ) => {
148
- const onScrollListener = addEventListener ( container , 'scroll' , checkScrollBarVisible , false ) ;
149
- const onResizeListener = addEventListener ( window , 'resize' , checkScrollBarVisible , false ) ;
151
+ if ( ! scrollBodyRef . current ) return ;
152
+
153
+ const scrollParents : HTMLElement [ ] = [ ] ;
154
+ let parent : HTMLElement = scrollBodyRef . current ;
155
+ while ( parent ) {
156
+ scrollParents . push ( parent ) ;
157
+ parent = parent . parentElement ;
158
+ }
159
+
160
+ scrollParents . forEach ( p => p . addEventListener ( 'scroll' , checkScrollBarVisible , false ) ) ;
161
+ window . addEventListener ( 'resize' , checkScrollBarVisible , false ) ;
162
+ window . addEventListener ( 'scroll' , checkScrollBarVisible , false ) ;
163
+ container . addEventListener ( 'scroll' , checkScrollBarVisible , false ) ;
150
164
151
165
return ( ) => {
152
- onScrollListener . remove ( ) ;
153
- onResizeListener . remove ( ) ;
166
+ scrollParents . forEach ( p => p . removeEventListener ( 'scroll' , checkScrollBarVisible ) ) ;
167
+ window . removeEventListener ( 'resize' , checkScrollBarVisible ) ;
168
+ window . removeEventListener ( 'scroll' , checkScrollBarVisible ) ;
169
+ container . removeEventListener ( 'scroll' , checkScrollBarVisible ) ;
154
170
} ;
155
171
} , [ container ] ) ;
156
172
0 commit comments