【发布时间】:2022-11-04 02:31:47
【问题描述】:
我正在尝试提出一个处理指针事件的跨设备代码。
我在 Chrome/Android 上成功运行了这段代码(使用 USB 调试),但 Chrome 桌面刚刚启动并在鼠标释放后继续触发 pointermove。
(另一个问题是动作没有手机上那么流畅)
这些 SO 帖子不能解决我的问题:
【问题讨论】:
我正在尝试提出一个处理指针事件的跨设备代码。
我在 Chrome/Android 上成功运行了这段代码(使用 USB 调试),但 Chrome 桌面刚刚启动并在鼠标释放后继续触发 pointermove。
(另一个问题是动作没有手机上那么流畅)
这些 SO 帖子不能解决我的问题:
【问题讨论】:
“pointerup”事件被分配给#canvas,但这样的事件永远不会发生,因为鼠标实际上是在生成的DIV圆圈上方。
由于您的圈子只是视觉助手,请在 CSS 中设置
.dot {
/* ... */
pointer-events: none;
}
另外,请确保在"pointerdown" 上使用Event.preventDefault()。
关于在桌面和移动设备(触摸)上实现无缝体验的其他策略:
"pointerdown" 事件分配给所需的元素(在您的情况下为canvas)window 对象
编辑示例:
const canvas = document.getElementById('canvas');
function startTouch(ev) {
ev.preventDefault();
const dot = document.createElement('div');
dot.classList.add('dot');
dot.id = ev.pointerId;
dot.style.left = `${ev.pageX}px`;
dot.style.top = `${ev.pageY}px`;
document.body.append(dot);
}
function moveTouch(ev) {
const dot = document.getElementById(ev.pointerId);
if (!dot) return;
dot.style.left = `${ev.pageX}px`;
dot.style.top = `${ev.pageY}px`;
}
function endTouch(ev) {
const dot = document.getElementById(ev.pointerId);
if (!dot) return;
removeDot(dot);
}
function removeDot(dot) {
dot.remove();
}
canvas.addEventListener('pointerdown', startTouch);
addEventListener('pointermove', moveTouch);
addEventListener('pointerup', endTouch);
addEventListener('pointercancel', endTouch);
.dot {
background-color: deeppink;
width: 2rem;
height: 2rem;
border-radius: 50%;
transform: translate(-50%, -50%);
position: absolute;
pointer-events: none; /* ADD THIS! */
}
#canvas {
height: 50vh;
background-color: black;
touch-action: none;
}
body {
margin: 0;
}
<div id="canvas"></div>
代码也需要这种改进:
transform 来移动你的元素而不是top, left 属性
但我不会在这个答案中介绍这些修复。
【讨论】: