diff --git a/frontend-vue/src/app/components/HeaderNav.vue b/frontend-vue/src/app/components/HeaderNav.vue index 38f91ae..29145f5 100644 --- a/frontend-vue/src/app/components/HeaderNav.vue +++ b/frontend-vue/src/app/components/HeaderNav.vue @@ -36,7 +36,7 @@ - + diff --git a/frontend-vue/src/app/components/ResizableBar.vue b/frontend-vue/src/app/components/ResizableBar.vue index ebc0ed0..99ac616 100644 --- a/frontend-vue/src/app/components/ResizableBar.vue +++ b/frontend-vue/src/app/components/ResizableBar.vue @@ -1,5 +1,5 @@ @@ -26,7 +26,7 @@ const emit = defineEmits<{ let isDragging = false; -function computePercent(e: MouseEvent) { +function computePercent(e: PointerEvent) { const containerRect = props.container?.getBoundingClientRect(); if (!containerRect) return null; if (props.isMobile) { @@ -35,7 +35,7 @@ function computePercent(e: MouseEvent) { return ((e.clientX - containerRect.left) / containerRect.width) * 100; } -function onMove(e: MouseEvent) { +function onMove(e: PointerEvent) { if (!isDragging) return; const next = computePercent(e); if (next == null) return; @@ -52,19 +52,23 @@ function stop() { if (!isDragging) return; isDragging = false; emit("dragging", false); - document.removeEventListener("mousemove", onMove); - document.removeEventListener("mouseup", stop); + document.removeEventListener("pointermove", onMove); + document.removeEventListener("pointerup", stop); + document.removeEventListener("pointercancel", stop); document.body.style.cursor = ""; document.body.style.userSelect = ""; } -function start(e: MouseEvent) { +function start(e: PointerEvent) { if (!props.container) return; + // 确保在触摸设备上能够捕获指针 + (e.target as HTMLElement).setPointerCapture(e.pointerId); e.preventDefault(); isDragging = true; emit("dragging", true); - document.addEventListener("mousemove", onMove); - document.addEventListener("mouseup", stop); + document.addEventListener("pointermove", onMove); + document.addEventListener("pointerup", stop); + document.addEventListener("pointercancel", stop); document.body.style.cursor = props.isMobile ? "row-resize" : "col-resize"; document.body.style.userSelect = "none"; } @@ -83,6 +87,8 @@ onBeforeUnmount(() => stop()); transition: background 0.2s; z-index: 10; flex-shrink: 0; + /* 禁止触摸默认行为(如滚动),确保 pointer 事件正常工作 */ + touch-action: none; } .resizer-bar:hover {