1
1
import handleSelector from '../handleSelector' ;
2
2
3
+ function isElScrollable ( element ) {
4
+ const excludedTags = [ 'SCRIPT' , 'STYLE' , 'SVG' , 'HEAD' ] ;
5
+
6
+ const isOverflow = / s c r o l l | a u t o / . test ( getComputedStyle ( element ) . overflow ) ;
7
+ const isScrollable =
8
+ element . scrollHeight > element . clientHeight ||
9
+ element . scrollWidth > element . clientWidth ;
10
+ const isExcluded =
11
+ element . tagName . includes ( '-' ) || excludedTags . includes ( element . tagName ) ;
12
+
13
+ return isOverflow && isScrollable && ! isExcluded ;
14
+ }
15
+
16
+ function findScrollableElement (
17
+ element = document . documentElement ,
18
+ dir = 'down' ,
19
+ maxDepth = 5
20
+ ) {
21
+ if ( maxDepth === 0 ) return null ;
22
+
23
+ const isScrollable = isElScrollable ( element ) ;
24
+ if ( isScrollable ) return element ;
25
+
26
+ if ( dir === 'up' ) {
27
+ const parentEl = element . parentElement ;
28
+ if ( ! parentEl ) return null ;
29
+
30
+ const scrollableElement = findScrollableElement (
31
+ parentEl ,
32
+ dir ,
33
+ maxDepth - 1
34
+ ) ;
35
+ if ( scrollableElement ) return scrollableElement ;
36
+ } else {
37
+ for ( let index = 0 ; index < element . childElementCount ; index += 1 ) {
38
+ const currentChild = element . children . item ( index ) ;
39
+ const scrollableElement = findScrollableElement (
40
+ currentChild ,
41
+ dir ,
42
+ maxDepth - 1
43
+ ) ;
44
+
45
+ if ( scrollableElement ) return scrollableElement ;
46
+ }
47
+ }
48
+
49
+ return null ;
50
+ }
51
+
3
52
function elementScroll ( block ) {
4
53
function incScrollPos ( element , data , vertical = true ) {
5
54
let currentPos = vertical ? element . scrollTop : element . scrollLeft ;
@@ -22,7 +71,12 @@ function elementScroll(block) {
22
71
if ( data . scrollIntoView ) {
23
72
element . scrollIntoView ( { behavior, block : 'center' } ) ;
24
73
} else {
25
- element . scroll ( {
74
+ const scrollableEl =
75
+ findScrollableElement ( element , 'up' , 3 ) ||
76
+ findScrollableElement ( element , 'down' , 3 ) ||
77
+ element ;
78
+
79
+ scrollableEl . scroll ( {
26
80
behavior,
27
81
top : data . incY ? incScrollPos ( element , data ) : data . scrollY ,
28
82
left : data . incX ? incScrollPos ( element , data , false ) : data . scrollX ,
0 commit comments