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.