Skip to content

feat(floating-button): add pointer-based drag with edge snapping#51

Open
shallowaria wants to merge 1 commit into
yusixian:devfrom
shallowaria:feat/draggable-floating-button
Open

feat(floating-button): add pointer-based drag with edge snapping#51
shallowaria wants to merge 1 commit into
yusixian:devfrom
shallowaria:feat/draggable-floating-button

Conversation

@shallowaria
Copy link
Copy Markdown

@shallowaria shallowaria commented Mar 31, 2026

更改类型

  • 新功能
  • Bug 修复
  • 重构
  • 文档更新
  • 其他

更改描述

为悬浮球添加拖拽功能,用户可以自由拖动按钮到屏幕任意位置,松手后自动吸附到最近的水平边缘。

  • 基于 Pointer Events 实现拖拽,兼容鼠标和触屏
  • 位置计算逻辑抽取到 utils/floating-button-position.ts(clamp、snap、初始位置)
  • 拖拽阈值 6px,避免误触
  • 拖拽结束后抑制 click 事件,防止意外触发面板开关
  • 窗口 resize 时自动重新 clamp 位置
  • 子元素设置 pointer-events: none + draggable={false} 防止浏览器原生拖拽干扰
  • 页面刷新时使用 localstorage 记录悬浮球位置

相关 Issue

N/A

测试

  • 添加了单元测试
  • 手动测试通过
  • 测试了两种语言(如涉及 UI 更改)

utils/tests/floating-button-position.browser.ts 覆盖:

  • 初始位置计算(右下角)

  • 边界 clamp(超出视口时限制在安全区域内)

  • 左半屏释放吸附到左边缘

  • 右半屏释放吸附到右边缘

  • getFloatingButtonViewport 返回当前窗口尺寸

  • 刷新时悬浮球位置是否保存

  • 添加了单元测试

  • 手动测试通过

  • 测试了两种语言(如涉及 UI 更改)

截图(如适用)

(添加截图展示 UI 变化)

检查清单

  • 代码遵循项目规范
  • 通过 lint 检查
  • 添加了必要的测试
  • 更新了文档
  • 添加了翻译(如涉及 UI 文本)

- Implement drag via Pointer Events with threshold detection
- Extract position math to utils/floating-button-position.ts (clamp, snap, initial)
- Snap to nearest horizontal edge on release
- Re-clamp position on window resize
- Suppress click after drag to prevent accidental toggles
- Add unit tests for position utilities
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant