divを「タブ可能」にするにはどうすればよいですか?


91

div要素のボタンがあり、ユーザーがキーボードのタブキーを押してボタン間を移動できるようにボタンを作成したいと考えています。テキストをアンカータグでラップしようとしましたが、動作しないようです。

誰かが解決策を持っていますか?


ボタンの間をタブで移動したいですか?またはdivですか?
Dancrumb、2012年

2
アンカーにhref属性がある場合は、機能するはずです。これは、アクティブ化可能なアイテムが実際に何かを行わない限り、マークアップの適切な使用である場合とそうでない場合があります。
Tim Medora 2012年

質問が
寄せ

ありがとう、hrefソリューションが最適に機能します!ティム、あなたが答えを提供するなら、私はそれを受け入れます。
TheBos

回答:


125

要素にtabindex属性を追加しますdiv

例:

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

steveaxのコメントによると、要素がページのどこにあるかからタブオーダーを逸脱させたくない場合は、をに設定tabindex0ます。

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

1
注意:tabindexは、HTML <5ではdivの有効な属性ではありません。参照 {Nepsが私のエラーを指摘した後に修正されました}
Dancrumb '30 / 11/12

3
@Dancrumb、はいHTML5にあります
Neps

45
おそらくtabindex=0自然なタブの順序にこだわらないように使用する方が良いでしょう。
steveax 2012年

6
ところで、これではEnterキーでクリックすることはできません。
Ciantic 2014

4
Hmn、@ Ciantic、divにタブで移動しながら、Enterキーのクリックを回避またはシミュレートする方法はありますか?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


私はここで推奨されているようkeyUpイベントの代わりに、KeyDownイベントイベントを使用することをお勧めであると考えている:developer.mozilla.org/en-US/docs/Web/Accessibility/...。keydownの明らかな利点は、(click()呼び出しの後で)ハンドラー関数からfalseを返した場合、ページの他の場所でのイベントの伝播を正しく停止しますが、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
            }
        });
});

ここで実用的な例を見つけることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.