Sử dụng chỉ mục thẻ

Dave Gash
Dave Gash
Meggin Kearney
Meggin Kearney
Alexandra Klepper
Alexandra Klepper

Thứ tự thẻ mặc định được cung cấp bởi vị trí DOM của các phần tử HTML ngữ nghĩa là thuận tiện, nhưng có thể đôi khi bạn cần phải sửa đổi thứ tự tab. Di chuyển các phần tử trong HTML là lựa chọn lý tưởng, nhưng có thể không khả thi. Trong những trường hợp này, bạn có thể dùng thuộc tính HTML tabindex để đặt thẻ của một phần tử một cách rõ ràng vị trí.

Hỗ trợ trình duyệt

  • 1
  • 12
  • 1,5
  • ≤4

Nguồn

Có thể áp dụng tabindex cho mọi phần tử, mặc dù không nhất thiết hữu ích trên mọi phần tử và nhận một khoảng các giá trị số nguyên. Bằng tabindex, bạn có thể chỉ định thứ tự rõ ràng cho các phần tử trang có thể làm tâm điểm, chèn một phần tử không thể làm tâm điểm vào thứ tự thẻ và xoá các phần tử khỏi thứ tự nhấn phím tab. Ví dụ:

tabindex="0": Chèn một phần tử vào thứ tự thẻ tự nhiên. Phần tử có thể lấy tiêu điểm bằng cách nhấn Tab và có thể lấy tiêu điểm phần tử bằng cách gọi phương thức focus() của nó.

tabindex="-1": Xoá một phần tử khỏi thứ tự thẻ thông thường, nhưng phần tử đó sẽ bị xoá vẫn có thể lấy tiêu điểm bằng cách gọi phương thức focus().

tabindex="5": Chỉ mục thẻ nào lớn hơn 0 sẽ đưa phần tử đó lên trước của thứ tự tab thông thường. Trường hợp có nhiều phần tử có chỉ mục thẻ lớn hơn lớn hơn 0 thì thứ tự thẻ sẽ bắt đầu từ giá trị thấp nhất lớn hơn 0 và đang hoạt động hiệu quả.

Điều này đặc biệt đúng với các phần tử không đầu vào như tiêu đề, hình ảnh hoặc bài viết tựa đề. Khi có thể, tốt nhất là bạn nên sắp xếp mã nguồn để trình tự DOM cung cấp thứ tự tab logic. Nếu bạn sử dụng tabindex, hãy chỉ định tính năng tương tác tuỳ chỉnh các thành phần điều khiển như nút, thẻ, trình đơn thả xuống và trường văn bản; tức là các phần tử người dùng có thể muốn cung cấp đầu vào.

Chỉ thêm tabindex vào nội dung mang tính tương tác. Ngay cả khi nội dung quan trọng, chẳng hạn như hình ảnh chính, thì người dùng trình đọc màn hình vẫn có thể hiểu được nội dung đó mà không cần thêm tiêu điểm.

Quản lý tiêu điểm ở cấp trang

Đôi khi, tabindex là cần thiết để mang lại trải nghiệm người dùng liền mạch. Ví dụ: nếu bạn xây dựng một trang mạnh mẽ với nhiều phần nội dung, nhưng tất cả nội dung đều hiển thị đồng thời. Điều này có thể là về đường liên kết điều hướng thay đổi nội dung hiển thị mà không cần làm mới trang.

Trong trường hợp này, hãy xác định vùng nội dung đã chọn và đặt thuộc tính tabindex cho vùng nội dung đó -1 và gọi phương thức focus. Việc này giúp đảm bảo nội dung không xuất hiện trong thứ tự tab thông thường. Kỹ thuật này, được gọi là quản lý tiêu điểm, giúp bối cảnh mà người dùng nhận thấy được đồng bộ với nội dung hình ảnh của trang web.

Quản lý tiêu điểm trong thành phần

Trong một số trường hợp, bạn cũng phải quản lý tiêu điểm ở cấp độ kiểm soát, chẳng hạn như bằng thành phần tuỳ chỉnh.

Ví dụ: phần tử select có thể nhận được tiêu điểm cơ bản, nhưng một khi tại đó, bạn có thể sử dụng các phím mũi tên để hiện thêm các tuỳ chọn có thể chọn. Nếu tạo một phần tử select tuỳ chỉnh, bạn cần sao chép phần tử đó để người dùng bàn phím vẫn có thể tương tác với chế độ điều khiển của bạn.

Nếu biết được hành vi bàn phím nào cần triển khai thì bạn có thể gặp khó khăn. Chiến lược phát hành đĩa đơn Ghi nhận ứng dụng Internet đa dạng thức (ARIA) có thể truy cập Các phương pháp hướng dẫn liệt kê các loại thành phần và những loại thao tác bàn phím mà các thành phần này hỗ trợ.

Có thể bạn đang xử lý Phần tử tuỳ chỉnh giống như một tập hợp các nút chọn, nhưng với kiểu dáng độc đáo và hành vi.

<radio-group>
    <radio-button>Water</radio-button>
    <radio-button>Coffee</radio-button>
    <radio-button>Tea</radio-button>
    <radio-button>Cola</radio-button>
    <radio-button>Ginger Ale</radio-button>
</radio-group>

Để xác định xem họ cần hỗ trợ bàn phím nào, hãy kiểm tra Phương pháp ghi nhận quyền tác giả của ARIA hướng dẫn. Phần 2 chứa danh sách các mẫu thiết kế, bao gồm bảng đặc điểm cho radio nhóm, thành phần hiện có phù hợp nhất với phần tử mới của bạn.

Một trong những hành vi bàn phím phổ biến cần được được hỗ trợ là các phím mũi tên lên/xuống/trái/phải. Để thêm hành vi này vào phương thức mới chúng tôi sẽ sử dụng kỹ thuật có tên là di chuyển chỉ mục thẻ.

Chỉ mục thẻ lưu trữ hoạt động bằng cách đặt tabindex thành -1 cho tất cả phần tử con, ngoại trừ một tài khoản hiện đang hoạt động.

<radio-group>
  <radio-button tabindex="0">Water</radio-button>
  <radio-button tabindex="-1">Coffee</radio-button>
  <radio-button tabindex="-1">Tea</radio-button>
  <radio-button tabindex="-1">Cola</radio-button>
  <radio-button tabindex="-1">Ginger Ale</radio-button>
</radio-group>

Thành phần này sử dụng trình nghe sự kiện bàn phím để xác định phím nào thao tác nhấn của người dùng; khi điều này xảy ra, lệnh này sẽ đặt tabindex thành -1, đặt tabindex của thành phần con cần làm tâm điểm thành 0 và gọi hàm tập trung vào nó.

<radio-group>
    <!-- Assuming the user pressed the down arrow, we'll focus the next available child -->
    <radio-button tabindex="-1">Water</radio-button>
    <radio-button tabindex="0">Coffee</radio-button> // call .focus() on this element
    <radio-button tabindex="-1">Tea</radio-button>
    <radio-button tabindex="-1">Cola</radio-button>
    <radio-button tabindex="-1">Ginger Ale</radio-button>
</radio-group>

Khi người dùng đến trang cuối cùng (hoặc đầu tiên, tuỳ thuộc vào hướng họ đang di chuyển) di chuyển tiêu điểm con, tiêu điểm lặp lại quanh vị trí đầu tiên (hoặc cuối cùng) trẻ.

Hãy thử ví dụ sau đây. Kiểm tra phần tử trong Công cụ cho nhà phát triển để quan sát chỉ mục thẻ di chuyển từ đài phát này sang đài phát tiếp theo.

Mô-đun và bẫy bàn phím

Tốt nhất là bạn nên tránh quản lý tiêu điểm theo cách thủ công vì việc này có thể dẫn đến các tình huống phức tạp. Ví dụ: một tiện ích tự động hoàn thành cố gắng quản lý tiêu điểm và ảnh chụp hành vi của thẻ nhưng ngăn người dùng rời khỏi thẻ cho đến khi hoàn tất. Đây được gọi là bẫy bàn phím và có thể gây khó chịu cho người dùng.

Mục 2.1.2 của WCAG nêu rõ rằng không bao giờ được khoá tiêu điểm bàn phím hoặc bị mắc kẹt ở một phần tử trang cụ thể. Người dùng phải di chuyển được đến và đi từ tất cả các phần tử trang mà chỉ cần sử dụng .

Trường hợp ngoại lệ của quy tắc này là phương thức. Tuy nhiên, bạn vẫn nên tránh sử dụng tabindex khi tạo một cửa sổ phụ. Với inert, bạn có thể đảm bảo người dùng không thể vô tình tương tác với một phần tử (một phần tử có chủ đích bẫy bàn phím). Sử dụng <dialog> là phần tử trơ theo mặc định, để tạo một phương thức cho người dùng trong khi chặn số nhấp chuột và thẻ nằm ngoài cửa sổ phụ. Điều này cho phép người dùng tập trung vào một lựa chọn bắt buộc.