Fix MkPullToRefresh behaviour ()

* Update MkPullToRefresh.vue

* Update MkPullToRefresh.vue

* Update MkPullToRefresh.vue
This commit is contained in:
syuilo 2025-05-04 18:51:30 +09:00 committed by GitHub
parent 3bdb1dd558
commit 14d6734cb1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 33 additions and 20 deletions
packages/frontend/src/components

View File

@ -76,8 +76,8 @@ function unlockDownScroll() {
scrollEl.style.overscrollBehavior = 'contain'; scrollEl.style.overscrollBehavior = 'contain';
} }
function moveStart(event: PointerEvent) { function moveStartByMouse(event: MouseEvent) {
if (event.pointerType === 'mouse' && event.button !== 1) return; if (event.button !== 1) return;
if (isRefreshing.value) return; if (isRefreshing.value) return;
const scrollPos = scrollEl!.scrollTop; const scrollPos = scrollEl!.scrollTop;
@ -88,28 +88,40 @@ function moveStart(event: PointerEvent) {
lockDownScroll(); lockDownScroll();
// pull event.preventDefault(); //
window.document.body.setAttribute('inert', 'true');
isPulling.value = true; isPulling.value = true;
startScreenY = getScreenY(event); startScreenY = getScreenY(event);
pullDistance.value = 0; pullDistance.value = 0;
// PointerEvent使TouchEventMouseEvent使
if (event.pointerType === 'mouse') {
window.addEventListener('mousemove', moving, { passive: true }); window.addEventListener('mousemove', moving, { passive: true });
window.addEventListener('mouseup', () => { window.addEventListener('mouseup', () => {
window.removeEventListener('mousemove', moving); window.removeEventListener('mousemove', moving);
onPullRelease(); onPullRelease();
}, { passive: true, once: true }); }, { passive: true, once: true });
} else { }
function moveStartByTouch(event: TouchEvent) {
if (isRefreshing.value) return;
const scrollPos = scrollEl!.scrollTop;
if (scrollPos !== 0) {
unlockDownScroll();
return;
}
lockDownScroll();
isPulling.value = true;
startScreenY = getScreenY(event);
pullDistance.value = 0;
window.addEventListener('touchmove', moving, { passive: true }); window.addEventListener('touchmove', moving, { passive: true });
window.addEventListener('touchend', () => { window.addEventListener('touchend', () => {
window.removeEventListener('touchmove', moving); window.removeEventListener('touchmove', moving);
onPullRelease(); onPullRelease();
}, { passive: true, once: true }); }, { passive: true, once: true });
} }
}
function moveBySystem(to: number): Promise<void> { function moveBySystem(to: number): Promise<void> {
return new Promise(r => { return new Promise(r => {
@ -148,7 +160,6 @@ async function closeContent() {
} }
function onPullRelease() { function onPullRelease() {
window.document.body.removeAttribute('inert');
startScreenY = null; startScreenY = null;
if (isPulledEnough.value) { if (isPulledEnough.value) {
isPulledEnough.value = false; isPulledEnough.value = false;
@ -208,13 +219,15 @@ onMounted(() => {
if (rootEl.value == null) return; if (rootEl.value == null) return;
scrollEl = getScrollContainer(rootEl.value); scrollEl = getScrollContainer(rootEl.value);
lockDownScroll(); lockDownScroll();
rootEl.value.addEventListener('pointerdown', moveStart, { passive: true }); rootEl.value.addEventListener('mousedown', moveStartByMouse, { passive: false }); // preventDefault
rootEl.value.addEventListener('touchstart', moveStartByTouch, { passive: true });
rootEl.value.addEventListener('touchend', toggleScrollLockOnTouchEnd, { passive: true }); rootEl.value.addEventListener('touchend', toggleScrollLockOnTouchEnd, { passive: true });
}); });
onUnmounted(() => { onUnmounted(() => {
unlockDownScroll(); unlockDownScroll();
if (rootEl.value) rootEl.value.removeEventListener('pointerdown', moveStart); if (rootEl.value) rootEl.value.removeEventListener('mousedown', moveStartByMouse);
if (rootEl.value) rootEl.value.removeEventListener('touchstart', moveStartByTouch);
if (rootEl.value) rootEl.value.removeEventListener('touchend', toggleScrollLockOnTouchEnd); if (rootEl.value) rootEl.value.removeEventListener('touchend', toggleScrollLockOnTouchEnd);
}); });
</script> </script>