dom_dom0900_004

ARIA対応のモーダルでフォーカストラップを実装する目的はどれですか?

  1. モーダル外のクリックを無視するため
  2. キーボード操作でフォーカスがモーダル内を循環するようにするため
  3. タブの順序をランダムにするため
  4. マウスホイールの速度を制御するため
正解
  1. キーボード操作でフォーカスがモーダル内を循環するようにするため
解説

アクセシビリティの観点から、Tab/Shift+Tabでのフォーカス移動がモーダル内に閉じる間は循環し、外へ出ないようにする必要があります。

使用例(サンプルコード)

[ html ]

<div id="dialog" role="dialog" aria-modal="true" hidden>
  <button data-first>First</button>
  <button>Ok</button>
  <button data-last>Last</button>
</div>
<script>
const dlg = document.getElementById('dialog');
function trap(e){
  if(e.key !== 'Tab') return;
  const first = dlg.querySelector('[data-first]');
  const last = dlg.querySelector('[data-last]');
  if(e.shiftKey && document.activeElement === first){ last.focus(); e.preventDefault(); }
  else if(!e.shiftKey && document.activeElement === last){ first.focus(); e.preventDefault(); }
}
function open(){ dlg.hidden = false; dlg.addEventListener('keydown', trap); dlg.querySelector('[data-first]').focus(); }
function close(){ dlg.hidden = true; dlg.removeEventListener('keydown', trap); }
</script>