Skip to content
This repository was archived by the owner on Jan 9, 2022. It is now read-only.

Commit 57d92f2

Browse files
committed
fix: fix disabling scrolling on mobile devices
1 parent fc28a29 commit 57d92f2

File tree

4 files changed

+40
-5
lines changed

4 files changed

+40
-5
lines changed

src/composable/scroll.ts

+21-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Ref } from 'vue'
22

3-
import { noScrollableParent } from '../helper/scroll.helper'
3+
import { noScrollableParent, getScrollbarWidth } from '../helper/scroll.helper'
44

55
type ScrollParams = {
66
overlay: Ref<Element | undefined>
@@ -12,6 +12,7 @@ export const useScroll = ({
1212
content,
1313
}: ScrollParams) => {
1414
let disabled = false
15+
let disableType: 'byEvents' | 'byOverflow' = null
1516

1617
const eventListener = (event: WheelEvent) => {
1718
if(event.target === overlay.value
@@ -27,9 +28,19 @@ export const useScroll = ({
2728
return
2829
}
2930

30-
window.addEventListener('wheel', eventListener, {
31-
passive: false,
32-
})
31+
const scrollbarWidth = getScrollbarWidth()
32+
33+
// The mobile has a scroll bar width of 0
34+
if (scrollbarWidth === 0) {
35+
disableType = 'byOverflow'
36+
document.documentElement.classList.add('overflow-y-hidden')
37+
} else {
38+
disableType = 'byEvents'
39+
window.addEventListener('wheel', eventListener, {
40+
passive: false,
41+
})
42+
}
43+
3344
disabled = true
3445
}
3546

@@ -38,7 +49,12 @@ export const useScroll = ({
3849
return
3950
}
4051

41-
window.removeEventListener('wheel', eventListener)
52+
if(disableType === 'byEvents') {
53+
window.removeEventListener('wheel', eventListener)
54+
}else if (disableType === 'byOverflow') {
55+
document.documentElement.classList.remove('overflow-y-hidden')
56+
}
57+
4258
disabled = false
4359
}
4460

src/helper/scroll.helper.ts

+14
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,17 @@ export const noScrollableParent = (event: WheelEvent, content: Element | undefin
5555

5656
return true
5757
}
58+
59+
export const getScrollbarWidth = () => {
60+
const container = document.createElement('div')
61+
container.style.visibility = 'hidden'
62+
container.style.overflow = 'scroll'
63+
const inner = document.createElement('div')
64+
65+
container.appendChild(inner)
66+
document.body.appendChild(container)
67+
const scrollbarWidth = container.offsetWidth - inner.offsetWidth
68+
document.body.removeChild(container)
69+
70+
return scrollbarWidth
71+
}

src/index.ts

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import './scss/main.scss'
2+
13
// standalone component
24
export { default as GDialog } from './components/GDialog.vue'
35

src/scss/main.scss

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
html.overflow-y-hidden {
2+
overflow-y: hidden;
3+
}

0 commit comments

Comments
 (0)