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

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

Browser Support

  • Chrome: 1.
  • Edge: 12.
  • Firefox: 1.5.
  • Safari: 3.1.

Source

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

tabindex คืออะไร

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

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

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

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

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

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

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

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

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

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

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

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

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

การทราบว่าควรใช้ลักษณะการทำงานของแป้นพิมพ์แบบใดอาจเป็นเรื่องยาก คู่มือแนวทางปฏิบัติในการเขียน Accessible Rich Internet Applications (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" กับองค์ประกอบหนึ่งๆ จะไม่มีผลกับองค์ประกอบย่อย หากองค์ประกอบย่อยอยู่ในลำดับการกดแป้น Tab ตามปกติหรือเนื่องจากค่า tabindex องค์ประกอบย่อยจะยังคงอยู่ในลำดับการกดแป้น Tab หากต้องการนำองค์ประกอบและองค์ประกอบย่อยทั้งหมดออกจากลำดับการไปยังแท็บ ให้ลองใช้inert Polyfill ของ WICG Polyfill จะจำลองลักษณะการทำงานของแอตทริบิวต์ inert ที่เสนอ ซึ่งจะป้องกันไม่ให้เทคโนโลยีความช่วยเหลือพิเศษเลือกหรืออ่านองค์ประกอบ

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

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

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

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

ใช้ "tabindex แบบเคลื่อนที่"

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

หากต้องการใช้ฟังก์ชันที่คล้ายกันในคอมโพเนนต์ของคุณเอง คุณสามารถใช้เทคนิคที่เรียกว่า "roving 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 ที่พบบ่อยและระบุคีย์ที่คอมโพเนนต์ควรรองรับ