แม้ว่าcursor: none
โซลูชัน CSS จะเป็นวิธีแก้ปัญหาที่ง่ายและมั่นคงหากเป้าหมายที่แท้จริงของคุณคือการลบเคอร์เซอร์เริ่มต้นในขณะที่กำลังใช้งานเว็บแอปพลิเคชันของคุณหรือใช้การตีความการเคลื่อนเมาส์แบบดิบของคุณเอง (สำหรับเกม FPS เป็นต้น) คุณอาจ ต้องการพิจารณาใช้Pointer Lock 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
ได้รับอนุญาต
การแจ้งเตือนผู้ใช้
เบราว์เซอร์บางตัวจะแจ้งให้ผู้ใช้ยืนยันก่อนที่จะทำการล็อคบางส่วนจะแสดงข้อความ ซึ่งหมายความว่าการล็อกตัวชี้อาจไม่เปิดใช้งานทันทีหลังการโทร อย่างไรก็ตามการเปิดใช้งานการล็อกตัวชี้ที่แท้จริงสามารถฟังได้โดยการฟังpointerchange
เหตุการณ์ในองค์ประกอบที่requestPointerLock
ถูกเรียก:
document.body.addEventListener("pointerlockchange", function () {
if (document.pointerLockElement === document.body) {
// Pointer is now locked to <body>.
}
});
เบราว์เซอร์ส่วนใหญ่จะแสดงข้อความเพียงครั้งเดียว แต่ในบางครั้ง Firefox จะส่งข้อความสแปมในทุกๆการโทร AFAIK นี้เท่านั้นที่สามารถทำงานรอบโดยใช้การตั้งค่าดูการแจ้งเตือนตัวชี้ล็อคปิดการใช้งานใน Firefox
ฟังการเคลื่อนไหวของเมาส์ดิบ
Pointer Lock API ไม่เพียง แต่ลบเมาส์เท่านั้น แต่ยังเปลี่ยนเส้นทางข้อมูลการเคลื่อนไหวของเมาส์ดิบไปยังองค์ประกอบที่requestPointerLock
เรียกใช้แทน สิ่งนี้สามารถฟังได้ง่ายๆโดยใช้mousemove
เหตุการณ์จากนั้นเข้าถึงmovementX
และmovementY
คุณสมบัติบนวัตถุเหตุการณ์:
document.body.addEventListener("mousemove", function (e) {
console.log("Moved by " + e.movementX + ", " + e.movementY);
});