Хоча cursor: noneрішення CSS, безумовно, є надійним і простим вирішенням проблеми , якщо ваша реальна мета - видалити курсор за замовчуванням під час використання веб-програми або здійснити власну інтерпретацію необробленого руху миші (наприклад, для FPS-ігор), ви можете хочемо замість цього скористатися API Lock Lock .
Ви можете використовувати requestPointerLock на елементі, щоб видалити курсор і перенаправити всі mousemoveподії на цей елемент (з яким ви можете чи не можете обробити):
document.body.requestPointerLock();
Щоб звільнити блокування, ви можете використовувати exitPointerLock :
document.exitPointerLock();
Додаткові нотатки
Немає курсору, реально
Це дуже потужний виклик API. Він не тільки робить ваш курсор невидимим, але він фактично видаляє нативний курсор вашої операційної системи . Ви не зможете вибрати текст або зробити що- небудь за допомогою миші (крім прослуховування деяких подій миші у вашому коді) до тих пір, поки блокування вказівника не буде звільнено (за допомогою exitPointerLockабо натискання ESCв деяких браузерах).
Тобто ви не можете залишити вікно з курсором, щоб воно знову відображалось, оскільки курсору немає.
Обмеження
Як вже було сказано вище, це дуже потужний виклик API, і таким чином дозволяється здійснювати лише у відповідь на деяку пряму взаємодію користувача з Інтернетом, наприклад, клацання; наприклад:
document.addEventListener("click", function () {
document.body.requestPointerLock();
});
Крім того, requestPointerLockне працюватиме з пісочниці, iframeякщо не встановлено allow-pointer-lockдозвіл.
Повідомлення користувачів
Деякі браузери запропонують користувачеві підтвердження перед тим, як блокування задіяно, деякі просто відобразять повідомлення. Це означає, що блокування вказівника може не активуватися відразу після дзвінка. Однак фактичну активацію блокування вказівника можна прослухати, прослухавши pointerchangeподію на елементі, на якому requestPointerLockвикликався:
document.body.addEventListener("pointerlockchange", function () {
if (document.pointerLockElement === document.body) {
// Pointer is now locked to <body>.
}
});
Більшість веб-переглядачів відображатиме повідомлення лише один раз, але Firefox час від часу спаме повідомлення при кожному виклику. AFAIK, це можна вирішити лише за допомогою налаштувань користувача, див. Вимкнути сповіщення про блокування покажчика у Firefox .
Прослуховування сирого руху миші
API блокування вказівника не тільки видаляє мишу, але натомість перенаправляє необроблені дані про переміщення миші до елемента, на який requestPointerLockбуло покликано. Це можна прослухати просто за допомогою mousemoveподії, а потім отримати доступ до властивостей movementXі movementYоб'єктів події:
document.body.addEventListener("mousemove", function (e) {
console.log("Moved by " + e.movementX + ", " + e.movementY);
});