Vue.js でキーボード操作可能なコンテキストメニュー(右クリックメニュー)
はじめに
Vue.js で矢印キーや Enter キーによるキーボード操作が可能なコンテキストメニュー(右クリックメニュー)を表示する方法。
調査/検証 したところ rawilk/vue-context を使うのが一番楽だったので、基本的には vue-context の使い方についてのまとめ。
TL;DR
- rawilk/vue-context だとキーボード操作にデフォルトで対応
- ネストは
li.v-context__sub
とul.v-context
を使う←
,→
キーによる階層の移動が可能
- スタイルは
.v-context li
,.v-context li a:hover
,.v-context li a:focus
あたりで変更
目次
環境・条件
1 | $ cat /etc/os-release |
詳細
前置き: Vue.js でコンテキストメニューを表示する方法
Vue.js のコンテキストメニュー表示する方法やライブラリは主に以下。(自分調べ)
自作は工数の関係で除外し、各ライブラリを試したところ以下の結果。
- heynext/v-contextmenu
@keyup
や@keydown
など設定してもキーボード操作ができなかった
- vmaimone/vue-context-menu
tabindex
を設定して@keyup
や@keydown
を使えばキーボード操作できる- ただし、2017/08/01 でメンテがとまっている(※2020/04/05 時点)
- rawilk/vue-context
- デフォルトで矢印キーでのキーボード操作に対応
@keyup.enter
を使えば Enter キーも使える
vue-context
の使い方
セットアップ
参考: Installation | vue-context
npm i
でインストール
1 | $ npm i vue-context |
Vue の場合
components
に VueContext
を設定
1 | import Vue from 'vue'; |
Nuxt の場合
source/plugins/vue-context.js
を作成 ※名称は各自でお好みで
1 | import Vue from 'vue' |
source/nuxt.config.js
を編集
1 | ... |
基本
- 右クリックメニューを有効化したい場所に
@contextmenu.prevent="$refs.xxxx.open"
を設定 - 右クリックメニューを
<vue-context ref="xxxx">
で作成- 中身は
li
とa
で作成li
だけだとtabindex
が設定されず、矢印キー操作も効かないので注意
a
にクリックイベントを設定したい場合は@click
を設定する
- 中身は
1 | <template> |
右クリック時に、他の処理もさせたい場合は open($event)
のように $event
を引数として渡す。
1 | <p @contextmenu.prevent="$refs.menu1.open($event); otherMethods();"> |
Enter キーで右クリックメニュー内の処理をさせたい場合は、冒頭にも書いたように @keyup.enter
を使う。
1 | <!-- 右クリックメニュー --> |
ネスト
参考: Nested Menus - Advanced Usage Demo
ネストの親を li.v-context__sub
に、子は ul.v-context li
にする。多段ネストする場合も同様。
ネストされている場合、←
, →
キーによる階層の移動が可能。
1 | <vue-context ref="menu1"> |
ネストのアイコン
ネストされていることを示すアイコンが豆腐になるので、お好みで変更する。
(ちゃんと調べてないので何が原因かは不明、デモページでも豆腐になっている。追加でフォントの読み込みが要るのかも。)
.v-context__sub>a:after
の content
を変更すれば OK。
1 | .v-context__sub>a:after { |
ちゃんとやるなら FontAwesome の angle-right
とか使うのが良い。
参考: Font Awesome 5 Freeで疑似要素(:after,:before)のcontent指定する場合 - Qiita
1 | /* これは動作未確認 */ |
ホバー/フォーカス 時のスタイル変更
ホバー時のスタイルは .v-context li a:hover
, フォーカス時のスタイルは .v-context li a:focus
で変更可能。
1 | .v-context li a:hover, .v-context li a:focus { |
余白とか調整
.v-context
, .v-context li
, .v-context li a
あたりを変更すると余白とか変更可能。
1 | .v-context li a { |
参考: vmaimone/vue-context-menu の場合
以下を意識すれば実装できるはず。
<context-menu>
配下の<li>
にtabindex
を設定@keyup.enter
や@keyup.up
などのイベントハンドラを 作成/設定
右クリックのコンテキストメニューを「vue-context-menu」で実装する | カバの樹 をベース(参考)にすると良いと思う。
ただ、rawilk/vue-context がデフォルトで矢印キーの移動に対応してるのに、わざわざ自前で実装するのは正直ダルいので、なら rawilk/vue-context でいいじゃん、という感じ。
まとめ
- rawilk/vue-context だとキーボード操作にデフォルトで対応
- ネストは
li.v-context__sub
とul.v-context
を使う←
,→
キーによる階層の移動が可能
- スタイルは
.v-context li
,.v-context li a:hover
,.v-context li a:focus
あたりで変更
参考文献
- rawilk/vue-context: A simple vue context menu component.
- Docs | vue-context
- Change color on hover · Issue #25 · rawilk/vue-context
- vmaimone/vue-context-menu: A context menu component for vue js
- heynext/v-contextmenu: 🖱 ContextMenu based on Vue 2.0
- 右クリックのコンテキストメニューを「vue-context-menu」で実装する | カバの樹
関連記事
- Chart.js(vue-chartjs) でツールチップの表示内容を変更
- Vue.js で日本語変換での誤発火を抑止しつつ Enter キーで Submit
- Vue で子コンポーネントのメソッドをコールする
- apertureless/vue-chartjs でチャートの高さ(や幅、サイズ)を変更
- Chart.js で X軸, Y軸の値をカスタマイズ
- Chart.js(vue-chartjs) で凡例の一部を非表示にする方法
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア