Come si crea un div "tabbable"?


94

Ho pulsanti che sono elementi div e voglio crearli in modo che sia possibile per l'utente premere il tasto tab sulla tastiera e spostarsi tra di loro. Ho provato a racchiudere il loro testo in tag di ancoraggio ma non sembra funzionare.

Qualcuno ha una soluzione?


Vuoi passare tra i pulsanti? O i div?
Dancrumb

2
Se l'ancora ha un hrefattributo dovrebbe funzionare. Può essere o meno un uso appropriato del markup a meno che l'elemento attivabile non faccia effettivamente qualcosa.
Tim Medora


Grazie, la soluzione href funziona meglio! Tim, se fornisci una risposta la accetterò.
TheBoss

Risposte:


128

Aggiungi tabindexattributi ai tuoi divelementi.

Esempio:

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

Secondo il commento di steveax, se non vuoi che l'ordine di tabulazione si discosti da dove si trova l'elemento nella pagina, imposta tabindexsu 0:

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

1
NB: tabindex non è un attributo valido dei div in HTML <5. Riferimento {corretto dopo che Neps ha sottolineato il mio errore}
Dancrumb

4
@Dancrumb, sì, sono in HTML5
Neps

45
Probabilmente è meglio usare tabindex=0anche se per non confondere con l'ordine naturale di tabulazione.
steveax

7
a proposito, questo non consente di fare clic su di esso con invio.
Ciantic

5
Hmn, @Ciantic, hai idea di come possiamo aggirare o simulare un clic su Invio mentre siamo collegati a quel div? hmn
Jomar Sevillejo

7

per chi fosse interessato, oltre alla risposta accettata, è possibile aggiungere il seguente jquery per modificare lo stile del div quando ci si tabula, e anche gestire Invio e Spazio per attivare un clic (quindi il gestore dei clic farà il resto)

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

Sono sicuro che qualcuno lo ha trasformato in un plugin jq $ (). MakeTabStop


1
Credo che sia meglio usare l'evento keydown invece dell'evento keyup come raccomandato qui: developer.mozilla.org/en-US/docs/Web/Accessibility/… . Un apparente vantaggio di keydown è che se restituisci false dalla tua funzione hander (dopo la chiamata click ()), interromperà correttamente la propagazione dell'evento altrove sulla pagina, mentre con keyup questo non funziona.
M Katz

Lo spazio potrebbe anche far scorrere la pagina. Potrebbe essere necessario utilizzare anche la funzione preventDefault.
b_laoshi

3

Aggiungi l' tabindex="0"attributo a ogni div che desideri tabbable. Quindi utilizza le pseudo classi CSS: hover e: focus, ad esempio per indicare all'utente dell'app che il div è attivo e cliccabile, ad esempio. Utilizza JavaScript per gestire il clic.

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

Rendi gli elementi tabbable e cliccabili premendo un tasto usando jquery

Presupposti

  • Tutti gli elementi che sono di un tipo non tabulabile, non cliccabile e dovrebbero essere cliccabili hanno un attributo onclick (questo potrebbe essere cambiato in una classe o altro attributo)
  • Tutti gli elementi sono dello stesso tipo; Userò i div.
  • Stai usando jquery

HTML di esempio:

...

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

...

Codice Jquery: questo è il codice che verrà eseguito quando la pagina è stata caricata. Deve essere eseguito sulla tua pagina 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
            }
        });
});

Puoi trovare un esempio funzionante qui .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.