Skip to content

Commit

Permalink
feat(useScrollLock): check for in TouchListener
Browse files Browse the repository at this point in the history
  • Loading branch information
robinscholz committed Oct 27, 2022
1 parent 89be00a commit bc7f77d
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 5 deletions.
2 changes: 1 addition & 1 deletion packages/core/useScrollLock/demo.vue
Expand Up @@ -10,7 +10,7 @@ const toggleLock = useToggle(isLocked)
</script>

<template>
<div class="flex flex-wrap">
<div class="flex flex-wrap gap-4">
<div ref="el" class="w-300px h-300px m-auto overflow-scroll bg-gray-500/5 rounded">
<div class="w-500px h-400px relative">
<div position="absolute left-0 top-0" bg="gray-500/5" p="x-2 y-1">
Expand Down
27 changes: 23 additions & 4 deletions packages/core/useScrollLock/index.ts
Expand Up @@ -4,11 +4,30 @@ import { isIOS, resolveRef, resolveUnref, tryOnScopeDispose } from '@vueuse/shar

import { useEventListener } from '../useEventListener'

function preventDefault(rawEvent: TouchEvent, ele: Element): boolean {
function checkOverflowScroll(ele: Element): boolean {
const _style = window.getComputedStyle(ele)
if (_style.overflowX === 'scroll' || _style.overflowY === 'scroll') {
return true
}
else {
const _parent = ele.parentNode as Element

if (_parent.tagName === 'BODY')
return false

if (checkOverflowScroll(_parent))
return true
else return false
}
}

function preventDefault(rawEvent: TouchEvent): boolean {
const e = rawEvent || window.event

// Do not prevent if the event is fired from a child.
if (ele !== e.target)
const _target = e.target as Element

// Do not prevent if element or parentNodes have overflow: scroll set.
if (checkOverflowScroll(_target))
return false

// Do not prevent if the event has more than one touch (usually meaning this is a multi touch gesture like pinch to zoom).
Expand Down Expand Up @@ -54,7 +73,7 @@ export function useScrollLock(
stopTouchMoveListener = useEventListener(
ele,
'touchmove',
(e) => { preventDefault(e as TouchEvent, ele) },
(e) => { preventDefault(e as TouchEvent) },
{ passive: false },
)
}
Expand Down

0 comments on commit bc7f77d

Please sign in to comment.