เน้นสไตล์

สัญญาณบอกสถานะโฟกัส (มักหมายถึง "วงแหวนโฟกัส") จะระบุถึง องค์ประกอบที่โฟกัส ในหน้าเว็บ สำหรับผู้ใช้ที่ไม่สามารถใช้เมาส์ ของคุณมีความสำคัญมากเพราะเป็นเหมือนรากฐานสำหรับ เคอร์เซอร์เมาส์

ถ้าสัญญาณบอกสถานะโฟกัสเริ่มต้นของเบราว์เซอร์ขัดแย้งกับการออกแบบของคุณ คุณสามารถใช้ CSS เพื่อจัดรูปแบบใหม่ อย่าลืมคำนึงถึงผู้ใช้แป้นพิมพ์ด้วย

ใช้ :focus เพื่อแสดงสัญญาณบอกสถานะโฟกัสเสมอ

:focus Pseudo-class จะถูกนำมาใช้ทุกครั้งที่องค์ประกอบถูกโฟกัส โดยไม่คำนึงถึงอินพุต อุปกรณ์ (เมาส์ แป้นพิมพ์ สไตลัส ฯลฯ) หรือวิธีการที่ใช้ในการโฟกัส ตัวอย่างเช่น <div> ด้านล่างมี tabindex ซึ่งทำให้โฟกัสได้ และยังมี รูปแบบที่กำหนดเองสำหรับสถานะ :focus:

div[tabindex="0"]:focus {
  outline: 4px dashed orange;
}

ไม่ว่าคุณจะใช้เมาส์คลิกหรือใช้แป้นพิมพ์เพื่อแตะ <div> จะมีลักษณะเหมือนกันเสมอ

แต่เบราว์เซอร์อาจไม่สอดคล้องกับวิธีการที่จะใช้โฟกัส หรือไม่ หรือ ไม่ใช่องค์ประกอบที่ได้รับโฟกัส อาจขึ้นอยู่กับเบราว์เซอร์และระบบปฏิบัติการ ระบบ

ตัวอย่างเช่น <button> ด้านล่างมีสไตล์ที่กำหนดเองสำหรับ :focus ด้วย

button:focus {
  outline: 4px dashed orange;
}

หากคลิก <button> ด้วยเมาส์ใน Chrome บน macOS คุณจะเห็น รูปแบบโฟกัสที่กำหนดเอง อย่างไรก็ตาม คุณจะไม่เห็นรูปแบบโฟกัสที่กำหนดเองถ้าคุณ ให้คลิก <button> ใน Safari บน macOS เนื่องจากใน Safari องค์ประกอบไม่ได้รับโฟกัสเมื่อคุณคลิกที่องค์ประกอบนั้น

เนื่องจากลักษณะการทำงานของการโฟกัสไม่สอดคล้องกัน อาจต้องทดสอบเล็กน้อย บนอุปกรณ์ต่างๆ เพื่อให้แน่ใจว่าผู้ใช้ของคุณจะยอมรับรูปแบบโฟกัสของคุณได้

ใช้ :focus-visible เพื่อเลือกแสดงสัญญาณบอกสถานะโฟกัส

ฟิลด์ :focus-visible Pseudo-Class จะใช้ทุกครั้งที่องค์ประกอบได้รับโฟกัสและ เบราว์เซอร์จะกำหนดผ่านการเรียนรู้ ซึ่งการแสดงตัวบ่งชี้โฟกัส เป็นประโยชน์ต่อผู้ใช้ โดยเฉพาะอย่างยิ่ง หากการโต้ตอบล่าสุดของผู้ใช้ ดำเนินการผ่านแป้นพิมพ์และการกดปุ่มไม่มีเมตา ALT / OPTION หรือ CONTROL คีย์ :focus-visible ก็จะตรงกัน

ปุ่มในตัวอย่างด้านล่างจะเลือกแสดงสัญญาณบอกสถานะโฟกัส ถ้า เมื่อคุณใช้เมาส์คลิก ผลลัพธ์จะแตกต่างจากเมื่อคุณใช้ กด Tab ไปยังแป้นพิมพ์

button:focus-visible {
  outline: 4px dashed orange;
}

ใช้ :focus-within เพื่อจัดรูปแบบระดับบนสุดขององค์ประกอบที่โฟกัส

:focus-within Pseudo-class จะใช้กับเอลิเมนต์เมื่อตัวเอลิเมนต์ได้รับ หรือเมื่ออีกองค์ประกอบหนึ่งภายในองค์ประกอบนั้นมีโฟกัส

สามารถใช้เพื่อไฮไลต์บริเวณของหน้าเว็บเพื่อวาด ความสนใจของผู้ใช้ต่อพื้นที่นั้น ตัวอย่างเช่น แบบฟอร์มด้านล่างมุ่งเน้นทั้ง เมื่อเลือกแบบฟอร์มเอง และเมื่อปุ่มตัวเลือก ที่เลือกไว้

form:focus-within {
  background: #ffecb3;
}

เมื่อใดที่ควรแสดงสัญญาณบอกสถานะโฟกัส

หลักการทั่วไปที่ดีก็คือ ให้ถามตัวเองว่า "ถ้าคุณคลิกตัวควบคุมนี้ ขณะที่ กำลังใช้อุปกรณ์เคลื่อนที่ คุณคาดหวังให้อุปกรณ์แสดงแป้นพิมพ์หรือไม่"

หากคำตอบคือ "ใช่" ตัวควบคุมควรแสดงโฟกัสเสมอ โดยไม่คำนึงถึงอุปกรณ์อินพุตที่ใช้ในการโฟกัส ตัวอย่างที่ดีคือ องค์ประกอบ <input type="text"> ผู้ใช้จะต้องส่งข้อมูลไปที่ ผ่านแป้นพิมพ์โดยไม่คำนึงว่าเดิมองค์ประกอบอินพุตจะรับมาอย่างไร โฟกัส ดังนั้นการแสดงสัญญาณบอกสถานะโฟกัสจึงมีประโยชน์เสมอ

หากคำตอบคือ "ไม่" ตัวควบคุมอาจเลือกแสดงการโฟกัส ของคุณ ตัวอย่างที่ดีคือองค์ประกอบ <button> หากผู้ใช้คลิกที่รูปภาพ เมาส์หรือหน้าจอสัมผัส การทำงานนั้นเสร็จสมบูรณ์ และตัวบ่งชี้การโฟกัสอาจไม่ เป็นสิ่งที่จำเป็น อย่างไรก็ตาม หากผู้ใช้ไปยังส่วนต่างๆ ด้วยแป้นพิมพ์ ก็จะเป็นประโยชน์ เพื่อแสดงตัวบ่งชี้โฟกัส เพื่อให้ผู้ใช้ตัดสินใจว่าต้องการหรือไม่ คลิกตัวควบคุมโดยใช้คีย์ ENTER หรือ SPACE

หลีกเลี่ยง outline: none

จริงๆ แล้ว วิธีที่เบราว์เซอร์ใช้ในการตัดสินใจว่าเมื่อใด ควรระบุจุดโฟกัสก็คือ ทำให้เกิดความสับสน การเปลี่ยนรูปลักษณ์ขององค์ประกอบ <button> ด้วย CSS หรือการให้ องค์ประกอบที่ tabindex จะทำให้ลักษณะการทำงานของวงแหวนโฟกัสเริ่มต้นของเบราว์เซอร์เป็น ดึงดูดความสนใจ

รูปแบบการต่อต้านที่พบได้ทั่วไปคือการนำตัวบ่งชี้โฟกัสออกโดยใช้ CSS เช่น

/* Don't do this!!! */
:focus {
  outline: none;
}

วิธีที่ดีกว่าในการแก้ปัญหานี้คือการใช้ :focus ร่วมกับ โพลีฟิลล์ :focus-visible โค้ดบล็อกแรกด้านล่างแสดงวิธี Polyfill ใช้งานได้ และแอปตัวอย่างด้านล่างแสดงตัวอย่างการใช้ Polyfill เพื่อเปลี่ยนสัญญาณบอกสถานะโฟกัสบนปุ่ม

/*
  This will hide the focus indicator if the element receives focus via the
  mouse, but it will still show up on keyboard focus.
*/
.js-focus-visible :focus:not(.focus-visible) {
  outline: none;
}

/*
  Optionally: Define a strong focus indicator for keyboard focus.
  If you choose to skip this step, then the browser's default focus
  indicator will be displayed instead.
*/
.js-focus-visible .focus-visible {
  
}