Как сделать div «табулируемым»?

94

У меня есть кнопки, которые являются элементами div, и я хочу сделать их так, чтобы пользователь мог нажимать клавишу табуляции на своей клавиатуре и перемещаться между ними. Я пробовал обернуть их текст в теги привязки, но, похоже, это не сработало.

у кого-нибудь есть решение?

Босс
источник
Вы хотите переключаться между кнопками? Или дивы?
Dancrumb
2
Если у привязки есть hrefатрибут, он должен работать. Это может быть или не быть подходящим использованием разметки, если активируемый элемент действительно что-то не делает.
Тим Медора
Вопрос задан stackoverflow.com/questions/3059203/tab-index-on-div
ntgCleaner
Спасибо, решение href работает лучше всего! Тим, если вы дадите ответ, я его приму.
TheBoss

Ответы:

128

Добавьте tabindexатрибуты к своим divэлементам.

Пример:

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

Согласно комментарию Стивеакса, если вы не хотите, чтобы порядок табуляции отличался от того, где находится элемент на странице, установите tabindexзначение 0:

<div tabindex="0">First</div>
<div tabindex="0">Second</div>
Neps
источник
1
NB: tabindex не является допустимым атрибутом div в HTML <5. Ссылка {Исправлено после того, как Непс указал на мою ошибку}
Dancrumb
4
@Dancrumb, да, они в HTML5
Neps
45
Наверное, лучше использовать, tabindex=0чтобы не испортить естественный порядок табуляции.
steveax
7
кстати, это не позволяет щелкнуть по нему с вводом.
Ciantic
5
Хм, @Ciantic есть идеи, как мы можем обойти или смоделировать щелчок при вводе во время вкладки в этот div? hmn
Jomar Sevillejo
7

для тех, кто заинтересован, в дополнение к принятому ответу вы можете добавить следующий jquery, чтобы изменить стиль div при переходе к нему, а также обработать Enter и Space, чтобы вызвать щелчок (тогда ваш обработчик щелчка сделает все остальное)

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

Я уверен, что кто-то превратил это в плагин jq $ (). MakeTabStop

Проснулся
источник
1
Я считаю, что лучше использовать событие keydown вместо события keyup, как рекомендуется здесь: developer.mozilla.org/en-US/docs/Web/Accessibility/… . Очевидным преимуществом keydown является то, что если вы вернете false из своей функции hander (после вызова click ()), она правильно остановит распространение события в другом месте на странице, тогда как с keyup это не работает.
M Katz
Пробел также может прокручивать страницу. Возможно, вам также понадобится использовать функцию preventDefault.
b_laoshi
3

Добавьте tabindex="0"атрибут в каждый div, который вы хотите использовать с вкладками. Затем используйте псевдоклассы CSS: hover и: focus, например, чтобы указать пользователю приложения, что div находится в фокусе и доступен для нажатия, например. Используйте JavaScript для обработки щелчка.

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

Сделайте элементы доступными для вкладок и щелчков нажатием клавиши с помощью jquery

Предположения

  • Все элементы, которые не являются вкладками, не кликабельны и должны быть активными, имеют атрибут onclick (его можно изменить на класс или другой атрибут)
  • Все элементы однотипны; Я буду использовать div.
  • Вы используете jquery

Образец HTML:

...

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

...

Код JQuery: это код, который будет запускаться после загрузки страницы. Он должен работать на вашей 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
            }
        });
});

Вы можете найти рабочий пример здесь .

b_laoshi
источник