Enquanto a cursor: none
solução CSS é definitivamente um sólido e de fácil solução , se o seu objetivo real é para remover o cursor padrão, enquanto o seu aplicativo web está sendo usado, ou implementar a sua própria interpretação do movimento matéria-rato (para jogos FPS, por exemplo), você pode deseja considerar o uso da API Pointer Lock .
Você pode usar requestPointerLock em um elemento para remover o cursor e redirecionar todos os mousemove
eventos para esse elemento (com o qual você pode ou não lidar):
document.body.requestPointerLock();
Para liberar o bloqueio, você pode usar exitPointerLock :
document.exitPointerLock();
Notas Adicionais
Sem cursor, de verdade
Esta é uma chamada de API muito poderosa. Ele não apenas torna o cursor invisível, como também remove o cursor nativo do sistema operacional . Você não poderá selecionar texto ou fazer qualquer coisa com o mouse (exceto ouvir alguns eventos do mouse no seu código) até que o bloqueio do ponteiro seja liberado (usando exitPointerLock
ou pressionando ESCem alguns navegadores).
Ou seja, você não pode deixar a janela com o cursor para que ela apareça novamente, pois não há cursor.
Restrições
Como mencionado acima, essa é uma chamada de API muito poderosa e, portanto, só pode ser feita em resposta a alguma interação direta do usuário na Web, como um clique; por exemplo:
document.addEventListener("click", function () {
document.body.requestPointerLock();
});
Além disso, requestPointerLock
não funcionará em uma área restrita iframe
, a menos que a allow-pointer-lock
permissão esteja definida.
Notificações do usuário
Alguns navegadores solicitarão ao usuário uma confirmação antes que o bloqueio seja ativado, outros simplesmente exibirão uma mensagem. Isso significa que o bloqueio do ponteiro pode não ser ativado imediatamente após a chamada. No entanto, a ativação real do bloqueio do ponteiro pode ser ouvida ouvindo o pointerchange
evento no elemento no qual requestPointerLock
foi chamado:
document.body.addEventListener("pointerlockchange", function () {
if (document.pointerLockElement === document.body) {
// Pointer is now locked to <body>.
}
});
A maioria dos navegadores exibe a mensagem apenas uma vez, mas o Firefox ocasionalmente envia spam para todas as chamadas. AFAIK, isso só pode ser contornado pelas configurações do usuário, consulte Desativar a notificação de bloqueio de ponteiro no Firefox .
Ouvindo o movimento bruto do mouse
A API Pointer Lock não apenas remove o mouse, mas também redireciona os dados brutos de movimento do mouse para o elemento em que requestPointerLock
foi chamado. Isso pode ser ouvido simplesmente usando o mousemove
evento e acessando as propriedades movementX
e movementY
no objeto de evento:
document.body.addEventListener("mousemove", function (e) {
console.log("Moved by " + e.movementX + ", " + e.movementY);
});