どのHTML要素がフォーカスを受け取ることができますか?


248

フォーカスを取ることが許可されているHTML要素の決定的なリストを探しています。つまり、focus()呼び出されたときにどの要素がフォーカスされるのですか?

私はフォーカスを当てることができる要素で動作するjQuery拡張機能を書いています。この質問の答えが、私が対象とする要素について具体的になることを願っています。

回答:


337

明確なリストはありません、それはブラウザ次第です。私たちが持っている唯一の標準はDOM Level 2 HTMLです。それによると、focus()メソッドを持つ唯一の要素はHTMLInputElement、HTMLSelectElement、HTMLTextAreaElementおよびHTMLAnchorElementです。これは特にHTMLButtonElementとHTMLAreaElementを省略します。

今日のブラウザはfocus()HTMLElementで定義していますが、次のいずれかでない限り、要素は実際にはフォーカスされません。

  • HTMLAnchorElement / HTMLAreaElementとhref
  • HTMLInputElement / HTMLSelectElement / HTMLTextAreaElement / HTMLButtonElement with not with disabled(IE実際にエラーを表示しようとすると)、ファイルのアップロードはセキュリティ上の理由から異常な動作をします
  • HTMLIFrameElement(フォーカスすることは何の役にも立ちませんが)。他の埋め込み要素も、おそらく、すべてをテストしたわけではありません。
  • を含む要素 tabindex

ブラウザーによっては、この動作に他の微妙な例外や追加がある可能性があります。


2
私はいくつかの興味深い結果を見つけました:jsfiddle.net/B7gn6は、「tabindex」属性が少なくともChromeで動作するには十分でないことを示唆しています...
Jon z

19
tabindex属性が「要素がフォーカス可能であるかどうかを作成者が制御できるようにする」ことがHTML5で標準化されています:w3.org/TR/html5/…基本的に、値0は要素をフォーカス可能にしますが、その順序はブラウザーに任されます。
natevw 14年

7
のすべての要素element.isContentEditable === trueもフォーカス可能です。IE -10(11+?)は、表示ブロックまたはテーブル(div、spanなど)で任意の要素にフォーカスできることに注意してください。
2015年

14
tabindexが-1の要素は、focusメソッドを通じてプログラムによってフォーカスを受け取ることができます。タブすることはできません。
jessebeach 2015

5
…tabindexが-1でない限り、フォーカスは不可能です>>真ではありません。tabindexが-1の場合、CLICKINGによるフォーカスは可能ですが、「tab」を押すことによるフォーカスは不可能です。-1を指定すると、要素がフォーカス可能になります。タブ順で追加されないだけです。jsfiddle.net/0jz0kd1aを参照してください。最初に要素をクリックしてから、tabindexを0に変更して、tabを使用してみてください。
daremkd

37

ここに、フォーカス可能なHTML要素を選択するためのbobince回答に基づくCSSセレクターがあります。

  a[href]:not([tabindex='-1']),
  area[href]:not([tabindex='-1']),
  input:not([disabled]):not([tabindex='-1']),
  select:not([disabled]):not([tabindex='-1']),
  textarea:not([disabled]):not([tabindex='-1']),
  button:not([disabled]):not([tabindex='-1']),
  iframe:not([tabindex='-1']),
  [tabindex]:not([tabindex='-1']),
  [contentEditable=true]:not([tabindex='-1'])
  {
      /* your CSS for focusable elements goes here */
  }

またはSASSでもう少し美しい:

a[href],
area[href],
input:not([disabled]),
select:not([disabled]),
textarea:not([disabled]),
button:not([disabled]),
iframe,
[tabindex],
[contentEditable=true]
{
    &:not([tabindex='-1'])
    {
        /* your SCSS for focusable elements goes here */
    }
}

GoogleがこのStackoverflowの質問にリダイレクトしたとき、それが私が探していたものだったので、それを答えとして追加しました。

編集:フォーカス可能なセレクタがもう1つあります:

[contentEditable=true]

ただし、これはめったに使用されません。


@TWiStErRob-あなたのセレクタは明示的に設定されたtabindexを持たない要素を含まないため、あなたのセレクタは@ReeCubeのセレクタと同じ要素をターゲットにしません。たとえば、属性を持つ要素である<a href="foo.html">Bar</a>ため、確かにフォーカス可能です。ただし、セレクターには含まれていません。ahref
jbyrd 2015

@jbyrdは、bobinceのステートメントに基づく編集の呼び出しにすぎませんでした。「... tabindexが-1でない限り、フォーカスが不可能になります。」、ReeCubeの答えを置き換えることは想定されていませんでした。編集履歴をご覧ください。
TWiStErRob 2015

SASS(またはCSS)は、上記の質問(ブラウザの不整合を除く)に対する厳密な回答を提供するのに適したフォームです。
ロイティンカー、2015

tabindex="-1"ではない要素がunfocusable作る、それだけでタブ移動によって集束することはできません。それをクリックするか、プログラムでHTMLElement.focus(); 他の負の数についても同じです。参照:developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/...
ラザロ

tabindex-1のアイテムは除外しません。ユーザーは入力デバイスを介してフォーカスすることはできませんが、プログラムで設定し、そのフォーカスを静止させたい場合があります。
James Westgate

7
$focusable:
  'a[href]',
  'area[href]',
  'button',
  'details',
  'input',
  'iframe',
  'select',
  'textarea',

  // these are actually case sensitive but i'm not listing out all the possible variants
  '[contentEditable=""]',
  '[contentEditable="true"]',
  '[contentEditable="TRUE"]',

  '[tabindex]:not([tabindex^="-"])',
  ':not([disabled])';

私はすべてのフォーカス可能な要素のSCSSリストを作成していますが、この質問のGoogleランクにより、これが誰かを助けるかもしれないと思いました。

注意すべきいくつかの事柄:

  • どうにかして生成するのが完全にもっともらしいので私は変更:not([tabindex="-1"])しまし:not([tabindex^="-"])-2。申し訳ありませんが安全ですか?
  • :not([tabindex^="-"])他のすべてのフォーカス可能なセレクターに追加しても、まったく意味がありません。それを使用[tabindex]:not([tabindex^="-"])するとき、あなたが否定しようとしているすべての要素がすでに含まれています:not
  • :not([disabled])無効化された要素がフォーカス可能になることは決してないので、含めました。そのため、すべての要素に追加しても意味がありません。



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