Mentre la cursor: nonesoluzione di CSS è sicuramente un solido e facile soluzione , se il tuo obiettivo attuale è quello di rimuovere il cursore predefinito mentre si utilizza l'applicazione web, o implementare la propria interpretazione del movimento grezzo del mouse (per i giochi FPS, per esempio), si potrebbe preferire invece utilizzare l' API di blocco puntatore .
È possibile utilizzare requestPointerLock su un elemento per rimuovere il cursore e reindirizzare tutti gli mousemoveeventi su quell'elemento (che è possibile o meno gestire):
document.body.requestPointerLock();
Per rilasciare il blocco, è possibile utilizzare exitPointerLock :
document.exitPointerLock();
Note aggiuntive
Nessun cursore, per davvero
Questa è una chiamata API molto potente. Non solo rende invisibile il cursore, ma rimuove effettivamente il cursore nativo del sistema operativo . Non sarai in grado di selezionare il testo o fare qualsiasi cosa con il mouse (eccetto l'ascolto di alcuni eventi del mouse nel tuo codice) fino a quando non viene rilasciato il blocco del puntatore (utilizzando exitPointerLocko premendo ESCalcuni browser).
Cioè, non puoi lasciare la finestra con il cursore per mostrarla di nuovo, poiché non c'è cursore.
restrizioni
Come accennato in precedenza, questa è una chiamata API molto potente ed è quindi consentita solo in risposta ad alcune interazioni dirette dell'utente sul Web, come un clic; per esempio:
document.addEventListener("click", function () {
document.body.requestPointerLock();
});
Inoltre, requestPointerLocknon funzionerà da un sandbox a iframemeno che non allow-pointer-locksia stata impostata l' autorizzazione.
User-notifiche
Alcuni browser richiederanno conferma all'utente prima che venga attivato il blocco, altri visualizzeranno semplicemente un messaggio. Ciò significa che il blocco del puntatore potrebbe non attivarsi subito dopo la chiamata. Tuttavia, l'attivazione effettiva del blocco del puntatore può essere ascoltata ascoltando l' pointerchangeevento sull'elemento su cui è requestPointerLockstato chiamato:
document.body.addEventListener("pointerlockchange", function () {
if (document.pointerLockElement === document.body) {
// Pointer is now locked to <body>.
}
});
La maggior parte dei browser visualizzerà il messaggio solo una volta, ma Firefox occasionalmente invierà spam al messaggio ogni singola chiamata. AFAIK, questo può essere risolto solo dalle impostazioni dell'utente, vedi Disabilitare la notifica di blocco del puntatore in Firefox .
Ascoltare il movimento del mouse crudo
L'API di blocco puntatore non solo rimuove il mouse, ma reindirizza i dati di movimento del mouse non elaborati sull'elemento su cui è requestPointerLockstato richiamato. Questo può essere ascoltato semplicemente usando l' mousemoveevento, quindi accedendo alle proprietà movementXe movementYsull'oggetto evento:
document.body.addEventListener("mousemove", function (e) {
console.log("Moved by " + e.movementX + ", " + e.movementY);
});