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 で、初期値の設定と選択状態のクリア