Files

32 lines
5.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 阵列悬停、拖动与滚轮
2026-09-10。沿用已批准的参考视频与原生实现流程。
## 交互
- 鼠标命中卡片时额外竖直抬起 0.28,约 200ms 显现,移开后平滑回落。反馈按循环阵列的实际位置保存,选中模型、阵列实例和归位副本共享同一高度,不改变详情抽取进度或镜头目标。
- 鼠标左键、触摸与笔使用同一组 Pointer Events。7px 内保留点击,10px 后自由拖动;已经移动过的手势回到起点也不当作点击。
- 用户最新选择自由平面跟随,取消屏幕横竖快捷手势和斜向锁轴。以选中模型中心采样两个轨道的 CSS 投影,逆矩阵同时计算列与档案位移。投影在手势内固定,允许水平、竖直、任意斜向及中途转弯;无效或退化投影不开始拖动。
- 两个轨道同时由指针或惯性持有,选档不能引发额外镜头吸附。沿实际经过的物理格位选档并更新列内记忆,按钮/键盘切列仍使用该列记忆。
- 拖动连续改变原有横向与前后轨道。用户进一步要求网页快速滑动的持续惯性:松手后以实际速度继续运动,速度按 `exp(-2.4 × 秒数)` 衰减,不再预选远处目标或限制最多两列/三档。档案随实际经过的位置依次切换,沿用标题、声音、波浪、归位和各列记忆;速度低于 0.6 格/秒后,才以速率 10 的临界阻尼弹簧吸附到最终整数位置。
- 松手速度来自最近 120ms 的指针样本,包含可用的合并事件并使用事件时间戳;反向时从转折点重新估算。相同距离,拖得越快,继续滚动越远;停止移动超过 80ms 再松手不追加惯性。再次按住立即停止并保留当前轨道位置,尚未拖过方向阈值时也不会自动回弹;点击接住惯性不会误选其他卡片。键盘、滚轮、模式切换和减少动态效果设置会中止惯性。
- 双向速度共享自由衰减阶段,保留屏幕中的滑行方向;整体放慢后共同吸附。再次按下同时接住两个轨道。
- 滚轮向上切上一档、向下切下一档。像素、行和页单位归一化,累计 100px 切一档,单事件最多三档;停顿或反向清除旧的累计量。Ctrl+滚轮和主要横向的触控板事件不截获。
- 捕获丢失、pointercancel、窗口失焦、窗口尺寸变化或新增第二根手指时,停止拖动并吸附;后续单指可继续。详情仍在净空足够后拖动旋转;正文和弹窗不会触发阵列切档。
实现:`src/archive-drag.ts`、`src/scene.ts`。原来的松手后单步 swipe 判断已移除。
## 验证
本次自由拖动:纯逻辑、桌面及手机横竖屏自由路径、鼠标及触摸快慢惯性、悬停与输入回归、生产构建通过。桌面另验证双向惯性比例及同时接住两个轨道。相同 3.2 档拖动,慢拖最终移动 3 档,快拖桌面移动 6 档、触摸模拟移动 8 档(原生事件调度会影响采样速度)。下列响应式与 WebKit 条目还记录此前验证范围;本次结果见对应 JSON 报告。
- `node --experimental-strip-types scripts/check-archive-drag.mjs`:小幅移动、逆投影还原任意屏幕方向、连续转弯、反向、停顿、减少动态效果、快慢速度差与最终吸附、负坐标循环,以及 30/60/120fps 的惯性积分一致性。相同 1.6 档距离、80ms 与 800ms 两种输入,模型测试最终位置为第 10 格与第 2 格。
- `scripts/check-archive-momentum.mjs`:Chromium 实际鼠标与 CDP 触摸,比较同距离快拖和慢拖,检查松手后依次跨档、连续衰减、按住停止、改变方向接管、跨列惯性、键盘中止和减少动态效果。报告为 `.tools/array-input/momentum.json`。
- `scripts/check-archive-diagonal.mjs`:桌面鼠标、手机竖屏和横屏 CDP 触摸,直接使用实际相机的两条斜向投影,检查正反方向、物理间距跟随,以及同一次拖动中水平、竖直、转弯、回到起点的屏幕位移。纯逻辑检查补充另一组相机、冻结映射、退化投影与双向惯性比例。报告为 `.tools/array-input/diagonal.json`。
- `scripts/check-array-input.mjs`:实际 Chromium WebGL 页面,1920×1080 鼠标与 390×844 CDP 触摸。检查不足半格时阵列已经跟随、松手前切档、吸附、反向、悬停升起与复原、点击选择、滚轮、弹窗隔离、八档循环、捕获丢失和多指取消、取消后恢复、详情旋转。
- `scripts/check-responsive.mjs`:Chromium 手机横屏与竖屏原有回归,包括滑动方向、循环、详情、正文、查看器和弹窗。
- Windows Playwright WebKit 的 390×844 竖屏完整回归通过;使用合成 PointerEvent,不代表 iPhone 真机多指行为。初次开发服务器运行在查看器步骤超时,改用固定生产构建后完整通过。
- `scripts/check-loop.mjs`:20,000 次相邻循环导航;`npm run check:viewport`:视口与原片构图;`npm run build`:TypeScript、资源与 PWA 构建。
本地截图和报告在 `.tools/array-input/`、`.tools/responsive/`。手机触摸验证属于桌面浏览器模拟,没有新增 iPhone 真机测试数据。