-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
61 lines (48 loc) · 1.52 KB
/
index.js
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
const inBrowser = typeof window !== 'undefined'
const supportTouch = inBrowser && 'ontouchstart' in window
function createBounceFixer() {
if (!supportTouch) {
return {
enable() {},
disable() {},
}
}
let startY
function handleTouchstart(event) {
startY = event.touches[0].clientY
}
function handleTouchmove(event) {
let el = event.target
while (el !== document.body && el !== document.documentElement) {
const { overflowY } = window.getComputedStyle(el)
const isScroller = overflowY === 'auto' || overflowY === 'scroll'
const allowScroll = isScroller && el.scrollHeight > el.clientHeight
if (allowScroll) {
const currentY = event.touches[0].clientY
const isReachTop = startY <= currentY && el.scrollTop == 0
const offsetBottom = Math.abs(el.scrollHeight - el.scrollTop - el.clientHeight)
const isReachBottom = startY >= currentY && offsetBottom <= 1
if (isReachTop || isReachBottom) {
if (event.cancelable) {
event.preventDefault()
}
}
return
}
el = el.parentNode
}
}
function enable() {
window.addEventListener('touchstart', handleTouchstart, { passive: false })
window.addEventListener('touchmove', handleTouchmove, { passive: false })
}
function disable() {
window.removeEventListener('touchstart', handleTouchstart)
window.removeEventListener('touchmove', handleTouchmove)
}
return {
enable,
disable,
}
}
export { createBounceFixer }