Jak sprawić, by div był „tabbable”?


94

Mam przyciski, które są elementami div i chcę je tak zrobić, aby użytkownik mógł naciskać klawisz Tab na klawiaturze i poruszać się między nimi. Próbowałem zawinąć ich tekst w znaczniki kotwicy, ale wydaje się, że nie działa.

Czy ktoś ma rozwiązanie?


Chcesz przechodzić między przyciskami? Albo divy?
Dancrumb

2
Jeśli kotwica ma hrefatrybut, powinna działać. Może to być właściwe użycie znaczników, chyba że aktywowany element faktycznie coś robi.
Tim Medora


Dziękuję, rozwiązanie href działa najlepiej! Tim, jeśli udzielisz odpowiedzi, przyjmuję ją.
TheBoss

Odpowiedzi:


128

Dodaj tabindexatrybuty do swoich divelementów.

Przykład:

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

Za komentarz steveax, o ile nie chcesz kolejność tabulatora do odstąpienia od której element jest na stronie, należy ustawić tabindexna 0:

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

1
Uwaga: tabindex nie jest prawidłowym atrybutem elementów div w HTML <5. Odniesienie {Poprawione po tym, jak Neps wskazał mój błąd}
Dancrumb,

4
@Dancrumb, tak, są w HTML5
Neps,

45
Prawdopodobnie lepiej się go używa tabindex=0, aby nie zaszkodzić naturalnej kolejności tabulacji.
steveax

7
przy okazji, to nie pozwala jednak na kliknięcie go enterem.
Ciantic,

5
Hmn, @Ciantic masz jakiś pomysł, w jaki sposób możemy obejść lub zasymulować kliknięcie Enter, gdy jesteś w tabulatorze do tego div? hmn
Jomar Sevillejo

7

dla zainteresowanych, oprócz zaakceptowanej odpowiedzi, możesz dodać następujące jquery, aby zmienić styl div po przejściu do niego tabulatorem, a także obsłużyć Enter i Spację, aby wywołać kliknięcie (wtedy twoja obsługa kliknięcia zrobi resztę)

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

Jestem pewien, że ktoś zrobił to we wtyczce jq $ (). MakeTabStop


1
Uważam, że lepiej jest użyć zdarzenia keydown zamiast zdarzenia keyup, zgodnie z zaleceniami tutaj: developer.mozilla.org/en-US/docs/Web/Accessibility/… . Widoczną zaletą keydown jest to, że jeśli zwrócisz false z funkcji hander (po wywołaniu click ()), poprawnie zatrzyma to propagację zdarzenia w innym miejscu na stronie, podczas gdy z kluczem to nie działa.
M Katz,

Spacja może również przewijać stronę. Konieczne może być również użycie funkcji PreventDefault.
b_laoshi

3

Dodaj tabindex="0"atrybut do każdego elementu div, który ma być tabulowany. Następnie użyj pseudoklas CSS: hover i: focus, na przykład, aby wskazać użytkownikowi aplikacji, że element div jest aktywny i można go kliknąć. Użyj JavaScript do obsługi kliknięcia.

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

Uczyń elementy tabulatorami i klikalnymi, naciskając klawisz przy użyciu jQuery

Założenia

  • Wszystkie elementy, które nie są kartami, nie można ich klikać i powinny być klikalne, mają atrybut onclick (można to zmienić na klasę lub inny atrybut)
  • Wszystkie elementy są tego samego typu; Użyję elementów div.
  • Używasz jquery

Przykładowy html:

...

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

...

Kod JQuery: jest to kod, który zostanie uruchomiony po załadowaniu strony. Musi działać na Twojej stronie HTML.

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

Można znaleźć pracy przykład tutaj .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.