¿Cómo se hace que un div sea "tabulado"?

94

Tengo botones que son elementos div y quiero hacerlos para que el usuario pueda presionar la tecla de tabulación en su teclado y moverse entre ellos. Intenté envolver su texto en etiquetas de anclaje pero no parece funcionar.

¿Alguien tiene una solución?

El jefe
fuente
¿Quieres tabular entre los botones? ¿O los divs?
Dancrumb
2
Si el ancla tiene un hrefatributo, debería funcionar. Puede ser o no un uso apropiado del marcado a menos que el elemento activable realmente haga algo.
Tim Medora
Se ha hecho la pregunta stackoverflow.com/questions/3059203/tab-index-on-div
ntgCleaner
¡Gracias, la solución href funciona mejor! Tim, si me das una respuesta, la aceptaré.
TheBoss

Respuestas:

128

Agrega tabindexatributos a tus divelementos.

Ejemplo:

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

Según el comentario de steveax, si no desea que el orden de tabulación se desvíe de donde está el elemento en la página, establezca el valor tabindexen 0:

<div tabindex="0">First</div>
<div tabindex="0">Second</div>
Neps
fuente
1
NB: tabindex no es un atributo válido de divs en HTML <5. Referencia {Corregida después de que Neps señaló mi error}
Dancrumb
4
@Dancrumb, sí, están en HTML5
Neps
45
Probablemente sea mejor usarlo tabindex=0para no estropear el orden de tabulación natural.
steveax
7
Por cierto, esto no permite que uno haga clic en él con enter.
Ciantic
5
Hmn, @Ciantic, ¿alguna idea de cómo podemos solucionar o simular un clic al entrar mientras estamos en esa div? hmn
Jomar Sevillejo
7

para aquellos interesados, además de la respuesta aceptada, puede agregar el siguiente jquery para hacer que el estilo div cambie cuando lo presione, y también manejar Enter y Space para activar un clic (luego su controlador de clic hará el 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()
});

Estoy seguro de que alguien ha convertido esto en un complemento jq $ (). MakeTabStop

Despertó Sabiendo
fuente
1
Creo que es mejor usar el evento keydown en lugar del evento keyup como se recomienda aquí: developer.mozilla.org/en-US/docs/Web/Accessibility/… . Una ventaja aparente de keydown es que si devuelve falso de su función de control (después de la llamada click ()), detendrá correctamente la propagación del evento en otras partes de la página, mientras que con keyup esto no funciona.
M Katz
El espacio también puede desplazar la página. Es posible que también deba utilizar la función preventDefault.
b_laoshi
3

Agregue el tabindex="0"atributo a cada div que desee tabular. Luego use CSS pseudoclases: hover y: focus, por ejemplo, para indicar al usuario de la aplicación que el div está enfocado y se puede hacer clic, por ejemplo. Utilice JavaScript para manejar el 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>

Ronnie Royston
fuente
1

Haga que los elementos se puedan tabular y hacer clic en presionando una tecla usando jquery

Supuestos

  • Todos los elementos que son de un no-tabbable, tipo no se puede hacer clic y debe ser clickable tienen un onclick atributo (esto se puede cambiar a una clase u otro atributo)
  • Todos los elementos son del mismo tipo; Usaré divs.
  • Estás usando jquery

Ejemplo 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 es el código que se ejecutará cuando la página se haya cargado. Debe ejecutarse en su 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
            }
        });
});

Puede encontrar un ejemplo práctico aquí .

b_laoshi
fuente