@@ -30,24 +30,40 @@ export function scrollIntoView(scrollView: HTMLElement, element: HTMLElement) {
30
30
let x = scrollView . scrollLeft ;
31
31
let y = scrollView . scrollTop ;
32
32
33
- // Account for top/left border offsetting the scroll top/Left
34
- let { borderTopWidth, borderLeftWidth} = getComputedStyle ( scrollView ) ;
35
- let borderAdjustedX = scrollView . scrollLeft + parseInt ( borderLeftWidth , 10 ) ;
36
- let borderAdjustedY = scrollView . scrollTop + parseInt ( borderTopWidth , 10 ) ;
33
+ // Account for top/left border offsetting the scroll top/Left + scroll padding
34
+ let {
35
+ borderTopWidth,
36
+ borderLeftWidth,
37
+ scrollPaddingTop,
38
+ scrollPaddingRight,
39
+ scrollPaddingBottom,
40
+ scrollPaddingLeft
41
+ } = getComputedStyle ( scrollView ) ;
42
+
43
+ let borderAdjustedX = x + parseInt ( borderLeftWidth , 10 ) ;
44
+ let borderAdjustedY = y + parseInt ( borderTopWidth , 10 ) ;
37
45
// Ignore end/bottom border via clientHeight/Width instead of offsetHeight/Width
38
46
let maxX = borderAdjustedX + scrollView . clientWidth ;
39
47
let maxY = borderAdjustedY + scrollView . clientHeight ;
40
48
41
- if ( offsetX <= x ) {
42
- x = offsetX - parseInt ( borderLeftWidth , 10 ) ;
43
- } else if ( offsetX + width > maxX ) {
44
- x += offsetX + width - maxX ;
49
+ // Get scroll padding values as pixels - defaults to 0 if no scroll padding
50
+ // is used.
51
+ let scrollPaddingTopNumber = parseInt ( scrollPaddingTop , 10 ) || 0 ;
52
+ let scrollPaddingBottomNumber = parseInt ( scrollPaddingBottom , 10 ) || 0 ;
53
+ let scrollPaddingRightNumber = parseInt ( scrollPaddingRight , 10 ) || 0 ;
54
+ let scrollPaddingLeftNumber = parseInt ( scrollPaddingLeft , 10 ) || 0 ;
55
+
56
+ if ( offsetX <= x + scrollPaddingLeftNumber ) {
57
+ x = offsetX - parseInt ( borderLeftWidth , 10 ) - scrollPaddingLeftNumber ;
58
+ } else if ( offsetX + width > maxX - scrollPaddingRightNumber ) {
59
+ x += offsetX + width - maxX + scrollPaddingRightNumber ;
45
60
}
46
- if ( offsetY <= borderAdjustedY ) {
47
- y = offsetY - parseInt ( borderTopWidth , 10 ) ;
48
- } else if ( offsetY + height > maxY ) {
49
- y += offsetY + height - maxY ;
61
+ if ( offsetY <= borderAdjustedY + scrollPaddingTopNumber ) {
62
+ y = offsetY - parseInt ( borderTopWidth , 10 ) - scrollPaddingTopNumber ;
63
+ } else if ( offsetY + height > maxY - scrollPaddingBottomNumber ) {
64
+ y += offsetY + height - maxY + scrollPaddingBottomNumber ;
50
65
}
66
+
51
67
scrollView . scrollLeft = x ;
52
68
scrollView . scrollTop = y ;
53
69
}
0 commit comments