Mặc dù cursor: none
giải pháp CSS chắc chắn là một cách giải quyết ổn định và dễ dàng , nhưng nếu mục tiêu thực tế của bạn là loại bỏ con trỏ mặc định trong khi ứng dụng web của bạn đang được sử dụng hoặc thực hiện giải thích di chuyển chuột thô của riêng bạn (ví dụ như trò chơi FPS), bạn có thể muốn xem xét sử dụng API Khóa con trỏ thay thế.
Bạn có thể sử dụng requestPulumLock trên một phần tử để xóa con trỏ và chuyển hướng tất cả các mousemove
sự kiện đến phần tử đó (mà bạn có thể hoặc không thể xử lý):
document.body.requestPointerLock();
Để giải phóng khóa, bạn có thể sử dụng exitPulumLock :
document.exitPointerLock();
Ghi chú bổ sung
Không có con trỏ, thực sự
Đây là một cuộc gọi API rất mạnh mẽ. Nó không chỉ hiển thị con trỏ của bạn vô hình, mà nó thực sự loại bỏ con trỏ riêng của hệ điều hành của bạn . Bạn sẽ không thể chọn văn bản hoặc làm bất cứ điều gì với chuột của bạn (ngoại trừ nghe một số sự kiện chuột trong mã của bạn) cho đến khi khóa con trỏ được phát hành (bằng cách sử dụng exitPointerLock
hoặc nhấn ESCtrong một số trình duyệt).
Đó là, bạn không thể rời khỏi cửa sổ với con trỏ để nó hiển thị lại, vì không có con trỏ.
Những hạn chế
Như đã đề cập ở trên, đây là một lệnh gọi API rất mạnh và do đó chỉ được phép thực hiện để đáp ứng với một số tương tác trực tiếp của người dùng trên web, chẳng hạn như nhấp chuột; ví dụ:
document.addEventListener("click", function () {
document.body.requestPointerLock();
});
Ngoài ra, requestPointerLock
sẽ không hoạt động từ hộp cát iframe
trừ khi allow-pointer-lock
được phép.
Thông báo người dùng
Một số trình duyệt sẽ nhắc người dùng xác nhận trước khi khóa được kích hoạt, một số trình duyệt sẽ chỉ hiển thị một thông báo. Điều này có nghĩa là khóa con trỏ có thể không kích hoạt ngay sau cuộc gọi. Tuy nhiên, việc kích hoạt thực tế khóa con trỏ có thể được lắng nghe bằng cách lắng nghe pointerchange
sự kiện trên phần tử requestPointerLock
được gọi là:
document.body.addEventListener("pointerlockchange", function () {
if (document.pointerLockElement === document.body) {
// Pointer is now locked to <body>.
}
});
Hầu hết các trình duyệt sẽ chỉ hiển thị tin nhắn một lần, nhưng Firefox sẽ thỉnh thoảng spam tin nhắn trên mỗi cuộc gọi. AFAIK, điều này chỉ có thể được xử lý bằng cài đặt người dùng, xem Tắt thông báo khóa con trỏ trong Firefox .
Lắng nghe chuyển động của chuột thô
API Khóa con trỏ không chỉ loại bỏ chuột mà thay vào đó chuyển hướng dữ liệu di chuyển chuột thô đến phần tử requestPointerLock
được gọi. Điều này có thể được nghe đơn giản bằng cách sử dụng mousemove
sự kiện, sau đó truy cập vào movementX
và movementY
các thuộc tính trên đối tượng sự kiện:
document.body.addEventListener("mousemove", function (e) {
console.log("Moved by " + e.movementX + ", " + e.movementY);
});