Làm thế nào để bạn tạo một div "tabbable"?


94

Tôi có các nút là phần tử div và tôi muốn tạo chúng để người dùng có thể nhấn phím tab trên bàn phím của họ và di chuyển giữa chúng. Tôi đã thử gói văn bản của họ trong các thẻ neo nhưng có vẻ như nó không hoạt động.

Có ai có giải pháp không?


Bạn muốn tab giữa các nút? Hay divs?
Dancrumb,

2
Nếu neo có một hrefthuộc tính thì nó sẽ hoạt động. Nó có thể có hoặc không phải là cách sử dụng thích hợp của đánh dấu trừ khi mục có thể kích hoạt thực sự làm được điều gì đó.
Tim Medora,


Cảm ơn bạn, giải pháp href hoạt động tốt nhất! Tim, nếu bạn cung cấp câu trả lời, tôi sẽ chấp nhận nó.
TheBoss

Câu trả lời:


128

Thêm tabindexthuộc tính vào các divphần tử của bạn .

Thí dụ:

<div tabindex="1">First</div>
<div tabindex="2">Second</div>

Mỗi lần bình luận steveax, nếu bạn không muốn thứ tự tab để đi chệch khỏi nơi nguyên tố này là trong trang, thiết lập tabindexđể 0:

<div tabindex="0">First</div>
<div tabindex="0">Second</div>

1
NB: tabindex không phải là thuộc tính hợp lệ của div trong HTML <5. Tham khảo {Đã sửa chữa sau khi Neps chỉ ra lỗi của tôi}
Dancrumb,

4
@Dancrumb, vâng, chúng ở HTML5
Neps vào

45
Có lẽ tốt hơn nên sử dụng tabindex=0để không bị xáo trộn với thứ tự tabbing tự nhiên.
steveax

7
btw, điều này không cho phép một người nhấp vào nó với enter.
Ciantic

5
Hmn, @Ciantic có bất kỳ ý tưởng nào về cách chúng tôi có thể làm việc xung quanh hoặc mô phỏng một cú nhấp chuột vào enter trong khi được gắn thẻ vào div đó không? hmn
Jomar Sevillejo

7

đối với những người quan tâm, ngoài câu trả lời được chấp nhận, bạn có thể thêm câu lệnh sau để thực hiện thay đổi kiểu div khi bạn gắn tab vào nó, đồng thời xử lý Enter và Space để kích hoạt một nhấp chuột (sau đó trình xử lý nhấp chuột của bạn sẽ thực hiện phần còn lại)

$(document).on('focus', '.button',function(){
    $(this).css('border','1px dotted black')
});
$(document).on('keyup', '.button',function(e){
    if(e.which==13 || e.which==32)
        $(this).click()
});

Tôi chắc rằng ai đó đã tạo điều này thành một plugin jq $ (). MakeTabStop


1
Tôi tin rằng tốt hơn nên sử dụng sự kiện keydown thay vì sự kiện keyup như được đề xuất tại đây: developer.mozilla.org/en-US/docs/Web/Accessibility/… . Một lợi thế rõ ràng của keydown là nếu bạn trả về false từ hàm xử lý của mình (sau lệnh gọi click ()), nó sẽ dừng chính xác sự lan truyền của sự kiện ở nơi khác trên trang, trong khi với keyup, điều này không hoạt động.
M Katz

Không gian cũng có thể cuộn trang. Bạn cũng có thể cần phải sử dụng chức năng PreventDefault.
b_laoshi

3

Thêm tabindex="0"thuộc tính vào từng div mà bạn muốn có thể tab. Sau đó, sử dụng các lớp giả CSS: di chuột và: tiêu điểm, chẳng hạn để thông báo cho người dùng ứng dụng biết rằng div nằm trong tiêu điểm và có thể nhấp được. Sử dụng JavaScript để xử lý nhấp chuột.

var doc = document;
var providers = doc.getElementsByClassName("provider");

for (var i = 0; i < providers.length; i++) {
    providers[i].onclick = function() {
      console.log(this.innerHTML);
    };
}
.provider {
    flex: 0 1 auto;
    align-self: auto;
    width: 256px;
    height: 48px;
    margin-top: 12px;
    margin-right: 12px;
    text-align: center;
    line-height: 48px;
    
    text-transform: uppercase;
    background-size: contain;
    background-repeat: no-repeat;
    background-position: 10%;
    background-color: gray;
}

.provider:hover{
  cursor: pointer;
}

.provider:focus{
    -webkit-box-shadow: 0px 2px 8px 2px rgba(0,0,0,0.4);
    -moz-box-shadow: 0px 2px 8px 2px rgba(0,0,0,0.4);
    box-shadow: 0px 2px 8px 2px rgba(0,0,0,0.4);
}
<h4>Click in this area first then press tab</h4>
<div id="email" class="provider" tabindex="0">email</div>
<div id="facebook" class="provider" tabindex="0">facebook</div>
<div id="github" class="provider" tabindex="0">github</div>
<div id="google" class="provider" tabindex="0">google</div>
<div id="twitter" class="provider" tabindex="0">twitter</div>


1

Làm cho các phần tử có thể lập bảng và có thể nhấp được bằng cách nhấn phím bằng jquery

Giả định

  • Tất cả các phần tử thuộc loại không thể tab, không thể nhấp và phải có thể nhấp được đều có thuộc tính onclick (điều này có thể được thay đổi thành một lớp hoặc thuộc tính khác)
  • Tất cả các phần tử đều thuộc cùng một loại; Tôi sẽ sử dụng div.
  • Bạn đang sử dụng jquery

Html mẫu:

...

<div onclick="clicked(this)">Button 1</div>
<div onclick="clicked(this)">Button 2</div>
<div onclick="clicked(this)">Button 3</div>

...

Mã truy vấn: Đây là mã sẽ chạy khi trang đã tải xong. Nó cần chạy trên trang HTML của bạn.

$(()=>{
    // make divs with an onclick attribute tabbable/clickable
    $('div[onclick]')
        .attr('tabindex', '0')                     // Add tab indexes
        .keypress((evt)=>{
            var key = evt.key;
            evt.preventDefault();                  // Ensure all default keypress
                                                   // actions are not used
            if (key === ' ' || key === 'Enter') {  // Only send click events for Space
                                                   // or Enter keys
                evt.currentTarget.click();         // Run the click event for element
            }
        });
});

Bạn có thể tìm thấy một ví dụ làm việc ở đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.