Bagaimana Anda membuat div "tabbable"?

94

Saya memiliki tombol yang merupakan elemen div dan saya ingin membuatnya sehingga memungkinkan bagi pengguna untuk menekan tombol tab pada keyboard mereka dan berpindah di antaranya. Saya sudah mencoba membungkus teks mereka dalam tag jangkar tetapi sepertinya tidak berhasil.

Apakah ada yang punya solusi?

TheBoss
sumber
Anda ingin tab di antara tombol? Atau divs?
Dancrumb
2
Jika jangkar memiliki hrefatribut, itu harus berfungsi. Ini mungkin atau mungkin bukan penggunaan markup yang tepat kecuali item yang dapat diaktifkan benar-benar melakukan sesuatu.
Tim Medora
Pertanyaan telah diajukan stackoverflow.com/questions/3059203/tab-index-on-div
ntgCleaner
Terima kasih, solusi href bekerja paling baik! Tim, jika Anda memberikan jawaban saya akan menerimanya.
TheBoss

Jawaban:

128

Tambahkan tabindexatribut ke divelemen Anda .

Contoh:

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

Menurut komentar steveax, jika Anda tidak ingin urutan tab menyimpang dari tempat elemen berada di halaman, setel tabindexke 0:

<div tabindex="0">First</div>
<div tabindex="0">Second</div>
Neps
sumber
1
NB: tabindex bukanlah atribut div yang valid di HTML <5. Referensi {Dikoreksi setelah Neps menunjukkan kesalahan saya}
Dancrumb
4
@Dancrumb, ya mereka ada di HTML5
Neps
45
Mungkin lebih baik digunakan tabindex=0agar tidak berantakan dengan urutan tabbing alami.
steveax
7
btw, ini tidak memungkinkan seseorang untuk mengkliknya dengan enter.
Ciantic
5
Hmn, @Ciantic ada ide bagaimana kita bisa mengatasi atau mensimulasikan klik enter sementara tab ke div itu? hmn
Jomar Sevillejo
7

bagi mereka yang tertarik, selain jawaban yang diterima, Anda dapat menambahkan jquery berikut untuk mengubah gaya div saat Anda menekan tab, dan juga menangani Enter dan Spasi untuk memicu klik (maka handler klik Anda akan melakukan sisanya)

$(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()
});

Saya yakin seseorang telah membuat ini menjadi plugin jq $ (). MakeTabStop

AwokeKnowing
sumber
1
Saya yakin lebih baik menggunakan acara keydown daripada acara keyup seperti yang direkomendasikan di sini: developer.mozilla.org/en-US/docs/Web/Accessibility/… . Keuntungan nyata dari keydown adalah jika Anda mengembalikan false dari fungsi hander (setelah panggilan click ()), ini akan menghentikan penyebaran peristiwa di tempat lain di halaman dengan benar, sedangkan dengan keyup ini tidak berfungsi.
M Katz
Space mungkin juga menggulir halaman. Anda mungkin perlu menggunakan fungsi preventDefault juga.
b_laoshi
3

Tambahkan tabindex="0"atribut ke setiap div yang Anda inginkan tabbable. Kemudian gunakan kelas semu CSS: hover dan: focus, misalnya untuk menandakan kepada pengguna aplikasi bahwa div dalam fokus dan dapat diklik, misalnya. Gunakan JavaScript untuk menangani klik.

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>

Ronnie Royston
sumber
1

Buat elemen menjadi tabbable dan dapat diklik dengan menekan tombol menggunakan jquery

Asumsi

  • Semua elemen yang berjenis non-tabbable, non-clickable dan harus dapat diklik memiliki atribut onclick (ini dapat diubah ke kelas atau atribut lain)
  • Semua elemen memiliki tipe yang sama; Saya akan menggunakan divs.
  • Anda menggunakan jquery

Contoh html:

...

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

...

Kode jquery: Ini adalah kode yang akan dijalankan ketika halaman telah dimuat. Ini harus dijalankan di halaman HTML Anda.

$(()=>{
    // 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
            }
        });
});

Anda dapat menemukan contoh yang berfungsi di sini .

b_laoshi
sumber