ควบคุมโฟกัสด้วย Tabindex

องค์ประกอบ HTML มาตรฐาน เช่น <button> หรือ <input> มีการช่วยเหลือพิเศษสำหรับแป้นพิมพ์อยู่แล้ว และควรนำมาใช้เมื่อเป็นไปได้ อย่างไรก็ตาม หากต้องการสร้างองค์ประกอบแบบอินเทอร์แอกทีฟที่กําหนดเอง คุณสามารถสร้างพฤติกรรมของผู้ใช้ที่คาดไว้ได้โดยการเพิ่ม tabindex

การรองรับเบราว์เซอร์

  • Chrome: 1.
  • ขอบ: 12.
  • Firefox: 1.5
  • Safari: 3.1

แหล่งที่มา

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

tabindex คืออะไร

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

tabindex ใช้ได้กับองค์ประกอบใดก็ได้ แต่ควรใช้กับองค์ประกอบแบบอินเทอร์แอกทีฟเท่านั้น และรับค่าจำนวนเต็มในช่วง การใช้ tabindex จะช่วยให้คุณระบุลําดับที่ชัดเจนสําหรับองค์ประกอบของหน้าเว็บที่โฟกัสได้ แทรกองค์ประกอบที่โฟกัสไม่ได้ลงในลําดับการกด Tab และนําองค์ประกอบออกจากลําดับการกด Tab ได้ เช่น

tabindex="0": แทรกองค์ประกอบลงในลําดับแท็บตามปกติ องค์ประกอบสามารถ โฟกัสได้โดยกดแท็บ และโฟกัสองค์ประกอบได้โดยการเรียกใช้ เมธอด focus()

tabindex="-1": นำองค์ประกอบออกจากลําดับแท็บตามปกติ แต่องค์ประกอบจะยังคงรับโฟกัสได้ด้วยการเรียกใช้เมธอด focus()

tabindex="5": ดัชนี Tab ที่มากกว่า 0 จะนำองค์ประกอบนั้นมาไว้ด้านหน้า ของลำดับแท็บตามปกติ หากมีองค์ประกอบหลายรายการที่มี tabindex มากกว่า 0 ลําดับการกด Tab จะเริ่มจากค่าต่ำสุดที่มากกว่า 0 และไล่ลำดับขึ้นไป การใช้ Tabindex ที่มากกว่า 0 จะถือว่าเป็น anti-pattern

ตรวจสอบว่าเข้าถึงตัวควบคุมด้วยแป้นพิมพ์ได้

เครื่องมืออย่าง Lighthouse เหมาะสำหรับการตรวจหาการช่วยเหลือพิเศษบางอย่างโดยอัตโนมัติ อย่างไรก็ตาม การทดสอบบางอย่างยังคงต้องดำเนินการโดยเจ้าหน้าที่

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

จัดการโฟกัสที่ระดับหน้า

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

ในกรณีนี้ ให้ระบุพื้นที่เนื้อหาที่เลือกและให้ tabindex ของ -1 และเรียกใช้เมธอด focus เพื่อให้มั่นใจว่าเนื้อหาจะไม่ปรากฏใน ตามลำดับแท็บตามปกติ เทคนิคนี้เรียกว่าการจัดการโฟกัสซึ่งทำให้ บริบทที่ผู้ใช้รับรู้ซึ่งสอดคล้องกับเนื้อหาภาพของเว็บไซต์

จัดการโฟกัสในคอมโพเนนต์

ในบางกรณี คุณต้องจัดการโฟกัสที่ระดับการควบคุมด้วย เช่น องค์ประกอบที่กำหนดเอง

การทราบว่าควรใช้ลักษณะการทํางานของแป้นพิมพ์ใดนั้นอาจเป็นเรื่องยาก คำแนะนำแนวทางการเขียนแอปพลิเคชัน Rich Internet ที่เข้าถึงได้ (ARIA) แสดงรายการประเภทคอมโพเนนต์และการดำเนินการบนแป้นพิมพ์ที่คอมโพเนนต์รองรับ

แทรกองค์ประกอบลงในลำดับแท็บ

แทรกองค์ประกอบลงในลำดับแท็บตามปกติโดยใช้ tabindex="0" เช่น

<div tabindex="0">Focus me with the TAB key</div>

หากต้องการโฟกัสองค์ประกอบ ให้กดแป้น Tab หรือเรียกใช้เมธอด focus() ขององค์ประกอบ

นำองค์ประกอบออกจากลำดับแท็บ

นำองค์ประกอบออกโดยใช้ tabindex="-1" เช่น

<button tabindex="-1">Can't reach me with the TAB key!</button>

ซึ่งจะนําองค์ประกอบออกจากลําดับแท็บตามปกติ แต่องค์ประกอบจะยังคงโฟกัสได้ด้วยการเรียกใช้เมธอด focus()

การใช้ tabindex="-1" กับองค์ประกอบจะไม่ส่งผลต่อองค์ประกอบย่อย หากองค์ประกอบย่อยอยู่ในลําดับแท็บโดยธรรมชาติหรือเนื่องจากค่า tabindex องค์ประกอบย่อยจะยังคงอยู่ในลําดับแท็บ หากต้องการนำองค์ประกอบและองค์ประกอบย่อยทั้งหมดในลำดับแท็บออก ให้ลองใช้ โพลีฟิลล์ประเภท inert ของ WICG โพลีฟิลจะจำลองลักษณะการทำงานของแอตทริบิวต์ inert ที่เสนอ ซึ่งจะป้องกันไม่ให้เทคโนโลยีความช่วยเหลือพิเศษเลือกหรืออ่านองค์ประกอบ

หลีกเลี่ยง tabindex > 0

tabindex ที่มากกว่า 0 จะส่งองค์ประกอบไปไว้ที่ด้านหน้าของลําดับแท็บตามปกติ หากมีองค์ประกอบหลายรายการที่มี tabindex มากกว่า 0 ลำดับแท็บจะเริ่มต้นจากค่าต่ำสุดที่มากกว่า 0 แล้วไล่ลำดับสูงขึ้น

การใช้ tabindex ที่มากกว่า 0 จะถือว่าเป็นรูปแบบที่ไม่ถูกต้องเนื่องจากโปรแกรมอ่านหน้าจอจะไปยังส่วนต่างๆ ของหน้าตามลําดับ DOM ไม่ใช่ลําดับแท็บ หากต้องการให้องค์ประกอบปรากฏเร็วขึ้นในลําดับแท็บ คุณควรย้ายองค์ประกอบนั้นไปยังตําแหน่งก่อนหน้าใน DOM

Lighthouse ช่วยให้คุณระบุองค์ประกอบที่มี tabindex > 0 ได้ เรียกใช้การตรวจสอบการช่วยเหลือพิเศษ (Lighthouse > ตัวเลือก > การช่วยเหลือพิเศษ) แล้วมองหาผลการตรวจสอบ "ไม่มีองค์ประกอบที่มีค่า [tabindex] มากกว่า 0"

ใช้ "tabindex ที่ใช้กับอุปกรณ์เคลื่อนที่"

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

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

เมื่อเกิดกรณีนี้ขึ้น คอมโพเนนต์จะตั้งค่า tabindex ของรายการย่อยที่โฟกัสก่อนหน้านี้เป็น -1, ตั้งค่า tabindex ของรายการย่อยที่จะโฟกัสเป็น 0 และเรียกใช้เมธอด focus() กับรายการย่อยนั้น

ก่อน

<div role="toolbar">
  <button tabindex="-1">Undo</button>
  <button tabindex="0">Redo</button>
  <button tabindex="-1">Cut</button>
</div>

หลัง

<div role="toolbar">
  <button tabindex="-1">Undo</button>
  <button tabindex="-1">Redo</button>
  <button tabindex="0">Cut</button>
</div>

สูตรการเข้าถึงด้วยแป้นพิมพ์

หากไม่แน่ใจว่าแป้นพิมพ์ในระดับใดที่รองรับคอมโพเนนต์ที่กำหนดเอง คุณสามารถอ้างอิงถึง หลักปฏิบัติในการสร้าง ARIA 1.1 คู่มือนี้แสดงรายการรูปแบบ UI ทั่วไปและระบุคีย์ คอมโพเนนต์ควรรองรับ