🚀

フォーカス移動で開いているコンポーネントを自動で閉じる実装と解説

に公開

目的

開いているアコーディオンやメニューなど、特定のコンポーネント以外に
フォーカスが移動したとき、自動で閉じるようにする。
キーボード操作やスクリーンリーダー対応のためのアクセシビリティ向け制御。


コード

handleFocusBound = this.handleFocus.bind(this);

document.addEventListener('focusin', this.handleFocusBound);

handleFocus(event: FocusEvent) {
  const target = event.target as HTMLElement;
  if (!target.closest('親要素')) {
    フォーカスが外れたときに動作する機能;
  }
}

説明

handleFocusBound = this.handleFocus.bind(this);

this.handleFocus の中で this を常に クラスインスタンス(BaseToggle) に固定するために使用する。
イベントリスナーに直接 this.handleFocus を渡すと this の参照先が変わることがあるため、bind(this) で固定しておく。


document.addEventListener('focusin', this.handleFocusBound);

focusin は、フォーカスがどこかの要素に入ったときに発火するイベント。
focus と異なりバブリングするため、親要素でも検知できる。
開いているエリアの外にフォーカスが移動したかを監視するのに適している。


closest(selector)

指定したセレクタに一致する 最も近い親要素(または自身) を取得するDOMメソッド。
一致する要素が存在しない場合は null を返す。

Discussion