Vue でキーボードでの要素間の移動
はじめに
Vue.js でキーボード操作で要素間を移動させる方法について整理した。
イメージとしてはツリービューみたいなやつとかを、↑
↓
→
←
キーで移動するような感じ。
TL;DR
tabindex
を移動させたい要素に設定@keyup.up.exact
,@keyup.down.exact
でイベントハンドラを設定- ハンドラ内で次要素の
tabindex
を算出してfocus
目次
環境・条件
1 | $ cat /etc/os-release |
- Google Chrome バージョン: 80.0.3987.149(Official Build) (64 ビット)
詳細
前置き
HTML で要素間の移動
まず前提として、HTML で input
以外の要素を TAB
キーで移動可能にさせるには tabindex
を設定する。
1 | <div tabindex="0">foo</div> |
See the Pen tabindex by 17num (@17num) on CodePen.
Vue.js でキーボード操作のハンドリング
Vue.js でキーボード操作をハンドリングするには keyup
, keydown
, keypress
を利用する。
input
にキーボード操作でのイベントハンドラを設定する場合は以下のイメージ。
1 | <input type="text" |
それぞれのイベントのざっくりとした違い。(自分調べなので細かい誤りはあるかも)
keyup
: キーが離された時に発火keydown
: キーが押されている間 発火し続ける。日本語入力の時も発火するkeypress
: キーが押されている間 発火し続ける。日本語入力の時は発火しない
また、enter
や up
などでキーの指定が可能。
参考: キーコード
1 | <input type="text" |
Shift や Ctrl キーなども shift
, ctrl
などの修飾子で指定可能。
参考: システム修飾キー
1 | <input type="text" |
exact
を付けることで、Shift + Enter
のみに限定、などの厳密な指定も可能。
※つけていないと、Shift + Ctrl + Enter
, Shift + Alt + Enter
なども対象になる。
1 | <input type="text" |
本題
前置きの内容を組み合わせることで、矢印キーによる移動を簡単に実現可能。
完成イメージ。
1 | <template> |
実際には tabindex
の割当を良い感じに計算させたりとか、現在の最大の tabindex
を取得(※)したりとか、細かい考慮は必要。
※これは data
で持てば良いだけかも
あと、場合によっては以下あたりも考慮した方が良い。
click
も実行するべきかkeyup
ではなくてkeydown
にするkeydown
にするなら移動速度(初速・加速度・最大速度)の考慮
まとめ
tabindex
を移動させたい要素に設定@keyup.up.exact
,@keyup.down.exact
でイベントハンドラを設定- ハンドラ内で次要素の
tabindex
を算出してfocus
参考文献
- tabindex - HTML: HyperText Markup Language | MDN
- キーボードでナビゲート可能な JavaScript ウィジェット - アクセシビリティ | MDN
- Event Handling — Vue.js
- Vue.js で入力フォームを↑↓キーやタブ・シフトタブでフォーカス移動する - Qiita
- 【Vue.js】イベントハンドリングをサンプルを作りながら理解する - Qiita
- Vue.js v2 イベントハンドラ一覧
- vue.js - vuejs: @keyup.esc on div element is not working - Stack Overflow
関連記事
- Chart.js(vue-chartjs) でツールチップの表示内容を変更
- Vue.js で日本語変換での誤発火を抑止しつつ Enter キーで Submit
- Vue で子コンポーネントのメソッドをコールする
- apertureless/vue-chartjs でチャートの高さ(や幅、サイズ)を変更
- Chart.js で X軸, Y軸の値をカスタマイズ
- Chart.js(vue-chartjs) で凡例の一部を非表示にする方法
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア