@@ -879,17 +879,23 @@ export class Virtualizer<
879
879
)
880
880
}
881
881
882
- getOffsetForAlignment = ( toOffset : number , align : ScrollAlignment ) => {
882
+ getOffsetForAlignment = (
883
+ toOffset : number ,
884
+ align : ScrollAlignment ,
885
+ itemSize = 0 ,
886
+ ) => {
883
887
const size = this . getSize ( )
884
888
const scrollOffset = this . getScrollOffset ( )
885
889
886
890
if ( align === 'auto' ) {
887
- if ( toOffset >= scrollOffset + size ) {
888
- align = 'end'
889
- }
891
+ align = toOffset >= scrollOffset + size ? 'end' : 'start'
890
892
}
891
893
892
- if ( align === 'end' ) {
894
+ if ( align === 'center' ) {
895
+ // When aligning to a particular item (e.g. with scrollToIndex),
896
+ // adjust offset by the size of the item to center on the item
897
+ toOffset += ( itemSize - size ) / 2
898
+ } else if ( align === 'end' ) {
893
899
toOffset -= size
894
900
}
895
901
@@ -928,29 +934,15 @@ export class Virtualizer<
928
934
}
929
935
}
930
936
931
- const centerOffset =
932
- item . start - this . options . scrollPaddingStart + ( item . size - size ) / 2
933
-
934
- switch ( align ) {
935
- case 'center' :
936
- return [ this . getOffsetForAlignment ( centerOffset , align ) , align ] as const
937
- case 'end' :
938
- return [
939
- this . getOffsetForAlignment (
940
- item . end + this . options . scrollPaddingEnd ,
941
- align ,
942
- ) ,
943
- align ,
944
- ] as const
945
- default :
946
- return [
947
- this . getOffsetForAlignment (
948
- item . start - this . options . scrollPaddingStart ,
949
- align ,
950
- ) ,
951
- align ,
952
- ] as const
953
- }
937
+ const toOffset =
938
+ align === 'end'
939
+ ? item . end + this . options . scrollPaddingEnd
940
+ : item . start - this . options . scrollPaddingStart
941
+
942
+ return [
943
+ this . getOffsetForAlignment ( toOffset , align , item . size ) ,
944
+ align ,
945
+ ] as const
954
946
}
955
947
956
948
private isDynamicMode = ( ) => this . elementsCache . size > 0
0 commit comments