forked from quasarframework/quasar
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscroll.js
More file actions
101 lines (82 loc) · 2.04 KB
/
scroll.js
File metadata and controls
101 lines (82 loc) · 2.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import { css } from './dom'
export function getScrollTarget (el) {
return el.closest('.scroll') || window
}
export function getScrollHeight (el) {
return (el === window ? document.body : el).scrollHeight
}
export function getScrollPosition (scrollTarget) {
if (scrollTarget === window) {
return window.pageYOffset || window.scrollY || document.body.scrollTop || 0
}
return scrollTarget.scrollTop
}
export function animScrollTo (el, to, duration) {
if (duration <= 0) {
return
}
const pos = getScrollPosition(el)
window.requestAnimationFrame(() => {
setScroll(el, pos + (to - pos) / duration * 16)
if (el.scrollTop !== to) {
animScrollTo(el, to, duration - 16)
}
})
}
function setScroll (scrollTarget, offset) {
if (scrollTarget === window) {
document.documentElement.scrollTop = offset
document.body.scrollTop = offset
return
}
scrollTarget.scrollTop = offset
}
export function setScrollPosition (scrollTarget, offset, duration) {
if (duration) {
animScrollTo(scrollTarget, offset, duration)
return
}
setScroll(scrollTarget, offset)
}
let size
export function getScrollbarWidth () {
if (size !== undefined) {
return size
}
const
inner = document.createElement('p'),
outer = document.createElement('div')
css(inner, {
width: '100%',
height: '200px'
})
css(outer, {
position: 'absolute',
top: '0px',
left: '0px',
visibility: 'hidden',
width: '200px',
height: '150px',
overflow: 'hidden'
})
outer.appendChild(inner)
document.body.appendChild(outer)
let w1 = inner.offsetWidth
outer.style.overflow = 'scroll'
let w2 = inner.offsetWidth
if (w1 === w2) {
w2 = outer.clientWidth
}
document.body.removeChild(outer)
size = w1 - w2
return size
}
export function hasScrollbar (el) {
if (!el || el.nodeType !== Node.ELEMENT_NODE) {
return false
}
return (
el.classList.contains('scroll') ||
['auto', 'scroll'].includes(window.getComputedStyle(el)['overflow-y'])
) && el.scrollHeight > el.clientHeight
}