要使用 Pointer Lock API 锁定鼠标,必须在用户手势(如点击)触发的事件中调用 element.requestPointerLock(),目标元素需可见可聚焦;需监听 pointerlockchange 和 pointerlockerror 事件处理状态与错误;锁定后通过 mousemove 的 movementX/Y 获取位移;ESC 或 document.exitPointerLock() 可退出。
要使用 pointer lock api 锁定鼠标,核心是调用 element.requestpointerlock(),但必须在用户手势(如点击、按键)触发的事件中调用,且目标元素需在 dom 中可见并可聚焦。
浏览器强制要求 pointer lock 必须由显式用户操作触发,比如 click、mousedown 或 keydown。直接在页面加载或定时器里调用会失败。
document.body.requestPointerLock()
setTimeout、fetch.then)中调用,除非该回调本身由用户事件链触发click 事件再锁定锁定不是立即生效,需监听 pointerlockchange 和 pointerlockerror 事件来确认结果。
document.addEventListener('pointerlockchange', () => { if (document.pointerLockElement) { /* 已锁定 */ } })document.addEventListener('pointerlockerror', () => console.error('锁定失败'))锁定后,鼠标不再触发常规 mousemove 的 clientX/clientY,而是通过 movementX/movementY 获取相对位移。
document.addEventListener('mousemove', e => { console.log(e.movementX, e.movementY) })
用户可通过 ESC 键自动退出,也可主动调用 document.exitPointerLock()。
立即学习“Java免费学习笔记(深入)”;
document.exitPointerLock()
pointerlockchange 可判断是否已退出(document.pointerLockElement === null)movementX/Y 停止更新不复杂但容易忽略:每次锁定前检查 document.pointerLockElement 是否为 null,避免重复请求;同时确保目标元素(通常是 document.body 或 <canvas>)已渲染完成且未被 display: none 隐藏。