Mientras que la cursor: none
solución de CSS es definitivamente un sólido y fácil solución , si su objetivo real es quitar el cursor por defecto, mientras se está utilizando la aplicación web, o de poner en práctica su propia interpretación del movimiento del ratón prima (para juegos FPS, por ejemplo), es posible que desee considerar el uso de la API de bloqueo del puntero en su lugar.
Puede usar requestPointerLock en un elemento para eliminar el cursor y redirigir todos los mousemove
eventos a ese elemento (que puede o no manejar):
document.body.requestPointerLock();
Para liberar el bloqueo, puede usar exitPointerLock :
document.exitPointerLock();
Notas adicionales
Sin cursor, de verdad
Esta es una llamada API muy poderosa. No solo hace que su cursor sea invisible, sino que también elimina el cursor nativo de su sistema operativo . No podrá seleccionar texto ni hacer nada con el mouse (excepto escuchar algunos eventos del mouse en su código) hasta que se libere el bloqueo del puntero (ya sea usando exitPointerLock
o presionando ESCalgunos navegadores).
Es decir, no puede dejar la ventana con el cursor para que se muestre nuevamente, ya que no hay cursor.
Restricciones
Como se mencionó anteriormente, esta es una llamada API muy poderosa y, por lo tanto, solo se puede realizar en respuesta a alguna interacción directa del usuario en la web, como un clic; por ejemplo:
document.addEventListener("click", function () {
document.body.requestPointerLock();
});
Además, requestPointerLock
no funcionará desde un entorno limitado a iframe
menos que se establezca el allow-pointer-lock
permiso.
Notificaciones de usuario
Algunos navegadores solicitarán al usuario una confirmación antes de que se active el bloqueo, algunos simplemente mostrarán un mensaje. Esto significa que el bloqueo del puntero podría no activarse inmediatamente después de la llamada. Sin embargo, la activación real del bloqueo del puntero se puede escuchar escuchando el pointerchange
evento en el elemento en el que requestPointerLock
se llamó:
document.body.addEventListener("pointerlockchange", function () {
if (document.pointerLockElement === document.body) {
// Pointer is now locked to <body>.
}
});
La mayoría de los navegadores solo mostrarán el mensaje una vez, pero Firefox ocasionalmente enviará el mensaje de spam en cada llamada. AFAIK, esto solo se puede solucionar mediante la configuración del usuario, consulte Deshabilitar la notificación de bloqueo del puntero en Firefox .
Escuchando el movimiento crudo del mouse
La API de bloqueo de puntero no solo elimina el mouse, sino que en su lugar redirige los datos sin procesar del movimiento del mouse al elemento que requestPointerLock
se activó. Esto se puede escuchar simplemente usando el mousemove
evento, luego accediendo a las propiedades movementX
y movementY
en el objeto de evento:
document.body.addEventListener("mousemove", function (e) {
console.log("Moved by " + e.movementX + ", " + e.movementY);
});