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

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

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

  • 1
  • 12
  • 1.5
  • อย่างน้อย 4

แหล่งที่มา

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

Tabindex คืออะไร

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

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

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

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

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

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

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

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

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

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

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

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

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

การรู้ลักษณะการทำงานของแป้นพิมพ์ที่อาจเป็นเรื่องยาก คู่มือ Accessible Rich Internet Applications (ARIA) Authoring Practices แสดงประเภทของคอมโพเนนต์และประเภทการทำงานของแป้นพิมพ์ที่รองรับ

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

แทรกองค์ประกอบลงในลำดับแท็บตามปกติโดยใช้ 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 องค์ประกอบจะยังคงอยู่ในลำดับแท็บ หากต้องการนำองค์ประกอบและองค์ประกอบย่อยทั้งหมดออกจากลำดับแท็บ ให้ลองใช้ polyfill ของ WICG inert โพลีฟิลจะจำลองลักษณะการทำงานของแอตทริบิวต์ inert ที่เสนอ ซึ่งป้องกันไม่ให้เทคโนโลยีความช่วยเหลือพิเศษเลือกหรืออ่านองค์ประกอบได้

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

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

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

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

ใช้ "การเดินทาง tabindex"

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

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

เมื่อเกิดกรณีนี้ขึ้น คอมโพเนนต์จะกำหนด 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 ทั่วไปและระบุคีย์ที่คอมโพเนนต์ควรรองรับ