-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathiife.js
70 lines (57 loc) · 1.74 KB
/
iife.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
62
63
64
65
66
67
68
69
70
;(() => {
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 === 0 || 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,
}
}
if (inBrowser) {
window.BounceFixer = { createBounceFixer }
}
})()