@@ -732,12 +732,29 @@ class VirtualizedList extends React.PureComponent<Props, State> {
732
732
// REACT-NATIVE-WEB patch to preserve during future RN merges: Support inverted wheel scroller.
733
733
// For issue https://github.com/necolas/react-native-web/issues/995
734
734
this . invertedWheelEventHandler = ( ev : any ) => {
735
+ const scrollOffset = this . props . horizontal ? ev . target . scrollLeft : ev . target . scrollTop ;
736
+ const scrollLength = this . props . horizontal ? ev . target . scrollWidth : ev . target . scrollHeight ;
737
+ const clientLength = this . props . horizontal ? ev . target . clientWidth : ev . target . clientHeight ;
738
+ const isEventTargetScrollable = scrollLength > clientLength ;
739
+ const delta = this . props . horizontal
740
+ ? ev . deltaX || ev . wheelDeltaX
741
+ : ev . deltaY || ev . wheelDeltaY ;
742
+ let leftoverDelta = delta ;
743
+ if ( isEventTargetScrollable ) {
744
+ leftoverDelta = delta < 0
745
+ ? Math . min ( delta + scrollOffset , 0 )
746
+ : Math . max ( delta - ( scrollLength - clientLength - scrollOffset ) , 0 ) ;
747
+ }
748
+ const targetDelta = delta - leftoverDelta ;
749
+
735
750
if ( this . props . inverted && this . _scrollRef && this . _scrollRef . getScrollableNode ) {
736
751
const node = ( this . _scrollRef : any ) . getScrollableNode ( ) ;
737
752
if ( this . props . horizontal ) {
738
- node . scrollLeft -= ev . deltaX || ev . wheelDeltaX
753
+ ev . target . scrollLeft += targetDelta ;
754
+ node . scrollLeft -= leftoverDelta ;
739
755
} else {
740
- node . scrollTop -= ev . deltaY || ev . wheelDeltaY
756
+ ev . target . scrollTop += targetDelta ;
757
+ node . scrollTop -= leftoverDelta ;
741
758
}
742
759
ev . preventDefault ( ) ;
743
760
}
0 commit comments