Como você torna uma div “tabulada”?

91

Tenho botões que são elementos div e quero torná-los de forma que o usuário possa pressionar a tecla tab no teclado e se mover entre eles. Eu tentei envolver o texto em tags âncora, mas não parece funcionar.

Alguém tem uma solução?

O chefe
fonte
Você deseja alternar entre os botões? Ou os divs?
Dancrumb
2
Se a âncora tiver um hrefatributo, ele deve funcionar. Pode ou não ser um uso apropriado da marcação, a menos que o item ativável realmente faça algo.
Tim Medora
Obrigado, a solução href funciona melhor! Tim, se você der uma resposta, eu aceitarei.
TheBoss

Respostas:

125

Adicione tabindexatributos aos seus divelementos.

Exemplo:

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

De acordo com o comentário de steveax, se você não quiser que a ordem das guias se desvie de onde o elemento está na página, defina o tabindexpara 0:

<div tabindex="0">First</div>
<div tabindex="0">Second</div>
Neps
fonte
1
NB: tabindex não é um atributo válido de divs em HTML <5. Referência {Corrigido após Neps apontar meu erro}
Dancrumb
3
@Dancrumb, sim, eles estão em HTML5
Neps de
45
Provavelmente é melhor usar, tabindex=0porém, para não atrapalhar a ordem natural de tabulação.
steveax
6
btw, isso não permite que alguém clique nele com enter.
Ciantic
4
Hmn, @Ciantic, alguma ideia de como podemos contornar ou simular um clique em Enter enquanto acessamos esse div? hmn
Jomar Sevillejo
7

para os interessados, além da resposta aceita, você pode adicionar o seguinte jquery para fazer a mudança de estilo div quando você tabular para ele, e também manipular Enter e Espaço para acionar um clique (então seu manipulador de cliques fará o 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()
});

Tenho certeza de que alguém transformou isso em um plugin jq $ (). MakeTabStop

AwokeKnowing
fonte
Acredito que seja melhor usar o evento keydown em vez do evento keyup, conforme recomendado aqui: developer.mozilla.org/en-US/docs/Web/Accessibility/… . Uma aparente vantagem do keydown é que se você retornar false de sua função hander (após a chamada click ()), ele interromperá corretamente a propagação do evento em outro lugar na página, enquanto com keyup isso não funciona.
M Katz
O espaço também pode rolar a página. Pode ser necessário usar a função preventDefault também.
b_laoshi
3

Adicione o tabindex="0"atributo a cada div que você deseja tabular. Em seguida, use as pseudo classes CSS: hover e: focus, por exemplo, para indicar ao usuário do aplicativo que o div está em foco e pode ser clicado, por exemplo. Use JavaScript para lidar com o clique.

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
fonte
1

Torne os elementos tabuláveis ​​e clicáveis ​​pressionando a tecla usando jquery

Premissas

  • Todos os elementos que são do tipo não tabulável e não clicável e devem ser clicáveis ​​têm um atributo onclick (isso pode ser alterado para uma classe ou outro atributo)
  • Todos os elementos são do mesmo tipo; Vou usar divs.
  • Você está usando jquery

Amostra de html:

...

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

...

Código Jquery: este é o código que será executado quando a página for carregada. Ele precisa ser executado em sua página 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
            }
        });
});

Você pode encontrar um exemplo de trabalho aqui .

b_laoshi
fonte