Missed the action at the 2018 Chrome Dev Summit? Catch up with our playlist on the Google Chrome Developers channel on YouTube. Watch now.

DOM 順序の重要性

ネイティブ要素は、DOM での位置に基づいて自動的にタブオーダーに挿入されます。そのため、フォーカス動作について学ぶにはネイティブ要素を操作するのが一番です。

たとえば、DOM に 3 つのボタン要素が順番に配置されているとします。 Tab を押すと、各ボタンが順番にフォーカスされます。以下のコード ブロックをクリックして、フォーカス ナビゲーションの開始点を変えて、Tab を押してボタン間でフォーカスを移動させてみてください。

<button>I Should</button>
<button>Be Focused</button>
<button>Last!</button>

CSS を使用すると、DOM での順序を保持したまま、異なる順序で要素を画面に表示できることに注意してください。たとえば、float などの CSS プロパティを使用して 1 つのボタンを右に移動した場合、ボタンが画面に表示される順序は変わりますが、DOM での順序は保持されるため、タブオーダーも変わりません。ページ全体をユーザーがタブで移動した場合、ボタンは直感的な順序ではフォーカスされません。以下のコード ブロックをクリックして、フォーカス ナビゲーションの開始点を変えて、Tab を押してボタン間でフォーカスを移動させてみてください。

<button style="float: right">I Should</button>
<button>Be Focused</button>
<button>Last!</button>

CSS を使用して画面上での要素の視覚的な位置を変更する場合は注意が必要です。フォーカスの位置がランダムに移動しているように見えるため、キーボードを使用するユーザーが混乱することがあります。このような理由から、WebAIM チェックリストのセクション 1.3.2 では、コード順によって決定される読み取りとナビゲーションの順序は、論理的かつ直感的にする必要があると既定されています。

原則として、ときどきページ上をタブで移動して、タブオーダーがおかしな順番になっていないことを確認してください。この確認作業にはそれほど手間がかからないので、習慣的に行うことをお勧めします。

画面外のコンテンツ

レスポンシブ サイド ナビゲーションなど、現在表示されていなくても DOM で必要なコンテンツがある場合はどうすべきでしょうか。このように、画面外にある状態でフォーカスを受け取る要素があると、ユーザーがページ上をタブで移動した際に、フォーカスが消えたり再表示されたりするように見えることがあります。これは明らかに望ましくない状況です。理想的には、パネルが画面外にあるときはフォーカスを受け取らないようにして、ユーザーが操作できる状態でのみフォーカスが当たるようにする必要があります。

画面外のスライドイン パネルによるフォーカスの妨げ

フォーカスの位置を確認するために、多少の検出作業が必要になる場合があります。 現在フォーカスされている要素を確認するには、コンソールで document.activeElement を使用します。

現在フォーカスが当たっている画面外の要素を特定したら、それを display: none または visibility: hidden に設定して、ユーザーに表示する前に display: block または visibility: visible に戻すことができます。

display none に設定されたスライドイン パネル

display block に設定されたスライドイン パネル

一般に、公開前にデベロッパー側でサイト上をタブで移動し、フォーカスが消えたり、論理的ではない順序で移動したりしないことを確認することをお勧めします。問題がある場合は、display: none または visibility: hidden で画面外のコンテンツを適切に非表示にするか、要素の DOM での物理的な位置を変更して論理的な順序になるようにする必要があります。