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