@@ -810,12 +810,29 @@ class VirtualizedList extends React.PureComponent<Props, State> {
810
810
// REACT-NATIVE-WEB patch to preserve during future RN merges: Support inverted wheel scroller.
811
811
// For issue https://github.com/necolas/react-native-web/issues/995
812
812
this . invertedWheelEventHandler = ( ev : any ) => {
813
+ const scrollOffset = this . props . horizontal ? ev . target . scrollLeft : ev . target . scrollTop ;
814
+ const scrollLength = this . props . horizontal ? ev . target . scrollWidth : ev . target . scrollHeight ;
815
+ const clientLength = this . props . horizontal ? ev . target . clientWidth : ev . target . clientHeight ;
816
+ const isEventTargetScrollable = scrollLength > clientLength ;
817
+ const delta = this . props . horizontal
818
+ ? ev . deltaX || ev . wheelDeltaX
819
+ : ev . deltaY || ev . wheelDeltaY ;
820
+ let leftoverDelta = delta ;
821
+ if ( isEventTargetScrollable ) {
822
+ leftoverDelta = delta < 0
823
+ ? Math . min ( delta + scrollOffset , 0 )
824
+ : Math . max ( delta - ( scrollLength - clientLength - scrollOffset ) , 0 ) ;
825
+ }
826
+ const targetDelta = delta - leftoverDelta ;
827
+
813
828
if ( this . props . inverted && this . _scrollRef && this . _scrollRef . getScrollableNode ) {
814
829
const node = ( this . _scrollRef : any ) . getScrollableNode ( ) ;
815
830
if ( this . props . horizontal ) {
816
- node . scrollLeft -= ev . deltaX || ev . wheelDeltaX
831
+ ev . target . scrollLeft += targetDelta ;
832
+ node . scrollLeft -= leftoverDelta ;
817
833
} else {
818
- node . scrollTop -= ev . deltaY || ev . wheelDeltaY
834
+ ev . target . scrollTop += targetDelta ;
835
+ node . scrollTop -= leftoverDelta ;
819
836
}
820
837
ev . preventDefault ( ) ;
821
838
}
0 commit comments