This commit is contained in:
owenchen committed 2026-10-14 18:50:17 +08:00
1 parent 3194f98ac0
commit e740ec77ec
24 files changed
+1561 -65

No files matched your search

@@ -3,7 +3,9 @@
* 悬浮操作按钮:蓝色渐变「+」,可在屏幕内自由拖动,松手后位置写入 Storage 下次启动恢复。
* 只做外观与点击上报;新建/上传等动作语义由页面处理。
* 拖动实现:touch 事件(真机/App)+ mouse 事件(H5 桌面调试)双轨;
* 位移小于阈值视为轻点(emit click),超过阈值才算拖动(touch 后屏蔽 mouse 兼容事件防双触发)。
* 位移小于阈值视为轻点、超过才算拖动。点击上报走原生 click(onTap)而非 touchend/mouseup
* 手动 emit:保留浏览器用户激活链,否则轻点里同步拉起文件选择器等 gesture API 会被静默拦截;
* 拖动收尾置 suppressClick 吞掉随后的原生 click,防拖完误触。
*/
import { computed, onMounted, ref } from "vue";
@@ -90,6 +92,9 @@ function onDragMove(x: number, y: number): void {
pos.value = clampPos(originPos.x + dx, originPos.y + dy);
}
/** 拖动收尾后浏览器还会补发一次原生 click,置位吞掉它(轻点不置位,由 onTap 正常上报) */
let suppressClick = false;
function onDragEnd(): void {
if (!dragging) {
return;
@@ -97,10 +102,17 @@ function onDragEnd(): void {
dragging = false;
if (moved) {
uni.setStorageSync(STORAGE_KEY, pos.value);
suppressClick = true;
}
else {
emit("click");
}
/** 唯一点击出口:原生 click(鼠标轻点/触屏补发)保留用户手势,页面才能在里面拉起文件选择器 */
function onTap(): void {
if (suppressClick) {
suppressClick = false;
return;
}
emit("click");
}
// ===== touch(真机 / App)=====
@@ -128,7 +140,7 @@ function onMouseDown(e: MouseEvent): void {
if (touchHandled) {
return;
}
e.preventDefault();
// 注意不能 preventDefault:它会取消后续原生 click 及其用户激活,onTap 就再也收不到点击
onDragStart(e.clientX, e.clientY);
const move = (ev: MouseEvent) => onDragMove(ev.clientX, ev.clientY);
const up = () => {
@@ -143,7 +155,7 @@ function onMouseDown(e: MouseEvent): void {
<template>
<view class="float-add-btn" :style="posStyle" @touchstart="onTouchStart" @touchmove.stop.prevent="onTouchMove"
@touchend="onTouchEnd" @mousedown="onMouseDown">
@touchend="onTouchEnd" @mousedown="onMouseDown" @click="onTap">
<u-icon name="plus" size="52" color="#ffffff" />
</view>
</template>