概要
Menu、Tooltipコンポーネントの初歩的な使い方のまとめです。
環境
- Windows 10 Professional 1909
- Node.js 12.14.1
- Vue.js 2.6.11
- Vuetify.js 2.2.12
参考
- [Quick start - Vuetify.js] (https://vuetifyjs.com/en/getting-started/quick-start)
- [Components] (https://vuetifyjs.com/en/components/api-explorer)
- [Styles - Colors] (https://vuetifyjs.com/en/styles/colors)
- [Material Design Icons] (https://cdn.materialdesignicons.com/4.5.95/)
[Menus] (https://vuetifyjs.com/en/components/menus)
v-menuコンポーネントはアクティベーターとメニューコンテンツの2つからなり、基本的な構成は以下のようになります。
メニューコンテンツにv-listコンポーネントが使われている例を多く見ますが、v-cardやv-sheetなどのコンポーネントでもかまいません。
<v-menu>
<!-- メニューのアクティベーター -->
<template v-slot:activator="{ on }">
<v-btn v-on="on">Open</v-btn>
</template>
<!-- メニューになるコンテンツ -->
<v-list>
<v-list-item>
// ...省略...
</v-list-item>
</v-list>
</v-menu>
Props
VMenu
- [VMenu] (https://github.com/vuetifyjs/vuetify/blob/v2.2.12/packages/vuetify/src/components/VMenu/VMenu.ts)
- [Delayable] (https://github.com/vuetifyjs/vuetify/blob/v2.2.12/packages/vuetify/src/mixins/delayable/index.ts)
- [Detachable] (https://github.com/vuetifyjs/vuetify/blob/v2.2.12/packages/vuetify/src/mixins/detachable/index.ts)
- [Bootable] (https://github.com/vuetifyjs/vuetify/blob/v2.2.12/packages/vuetify/src/mixins/bootable/index.ts)
- [Menuable] (https://github.com/vuetifyjs/vuetify/blob/v2.2.12/packages/vuetify/src/mixins/menuable/index.ts)
- [Positionable] (https://github.com/vuetifyjs/vuetify/blob/v2.2.12/packages/vuetify/src/mixins/positionable/index.ts)
- [Activatable] (https://github.com/vuetifyjs/vuetify/blob/v2.2.12/packages/vuetify/src/mixins/activatable/index.ts)
- [Returnable] (https://github.com/vuetifyjs/vuetify/blob/v2.2.12/packages/vuetify/src/mixins/returnable/index.ts)
- [Toggleable] (https://github.com/vuetifyjs/vuetify/blob/v2.2.12/packages/vuetify/src/mixins/toggleable/index.ts)
- [Themeable] (https://github.com/vuetifyjs/vuetify/blob/v2.2.12/packages/vuetify/src/mixins/themeable/index.ts)
VMenu ---- Delayable
`--- Dependent
`--- Detachable ---- Bootable
`--- Menuable ---- Positionable
| `--- Stackable
| `--- Activatable
`--- Returnable
`--- Toggleable
`--- Themeable
name | type | default | relation | src | |
---|---|---|---|---|---|
VMenu | auto | boolean | false | ||
close-on-click | boolean | true | true | ||
close-on-content-click | boolean | true | true | ||
disabled | boolean | false | |||
disable-keys | boolean | false | |||
max-height | number or string | auto | 'auto' | ||
offset-x | boolean | false | |||
offset-y | boolean | false | |||
open-on-click | boolean | true | true | ||
open-on-hover | boolean | false | |||
origin | string | 'top left' | 'top left' | ||
transition | boolean or string | v-menu-transition | 'v-menu-transition' | ||
Delayable | open-delay | number or string | 0 | 0 | |
close-delay | number or string | 0 | 0 | ||
Detachable | attach | any | false | v-app | false |
content-class | string | undefined | v-app | '' | |
Bootable | eager | boolean | false | ||
Menuable | allow-overflow | boolean | false | ||
light | boolean | false | |||
dark | boolean | false | |||
max-width | number or string | auto | 'auto' | ||
min-width | number or string | undefined | |||
nudge-bottom | number or string | 0 | 0 | ||
nudge-left | number or string | 0 | 0 | ||
nudge-right | number or string | 0 | 0 | ||
nudge-top | number or string | 0 | 0 | ||
nudge-width | number or string | 0 | 0 | ||
offset-overflow | boolean | false | |||
open-on-click | boolean | - | |||
position-x | number | undefined | null | ||
position-y | number | undefined | null | ||
z-index | number or string | undefined | null | ||
Positionable | absolute | boolean | false | ||
bottom | boolean | false | absolute, fixed | ||
fixed | boolean | false | |||
left | boolean | false | absolute, fixed | ||
right | boolean | false | absolute, fixed | ||
top | boolean | false | absolute, fixed | ||
Activatable | activator | any | undefined | null | |
disabled | - | ||||
internal-activator | boolean | false | |||
open-on-hover | boolean | false | |||
Returnable | return-value | any | undefined | null | |
Toggleable | value | any | undefined | ||
Themeable | dark | boolean | false | null | |
light | boolean | false | null |
- value : コンポーネントを表示するか非表示にするかを制御します。
実装例
テーマ
dark
ダークテーマのメニューです。ボタンをクリックするとダークテーマが適用されたv-listコンポーネントで作成したメニューが表示されます。閉じるにはメニューやメニュー外をクリック、またはESCを押下します。
<v-menu dark>
<template v-slot:activator="{ on }">
<v-btn v-on="on">
Dropdown
</v-btn>
</template>
<v-list dark dense>
<v-list-item v-for="menu in menus" :key="menu.no" link>
<v-list-item-icon>
<v-icon dark dense left color="blue">{{ menu.icon }}</v-icon>
</v-list-item-icon>
<v-list-item-title>{{ menu.name }}</v-list-item-title>
</v-list-item>
</v-list>
</v-menu>
light
ライトテーマのメニューです。light
プロパティ以外のソースコードはダークテーマと同一です。(動作は同じなのでスクリーンショットになります)
メニューの開閉
hover
open-on-click
プロパティのデフォルト値がtrueなので、アクティベーターをクリックするとメニューが表示されるというのがデフォルトの動きになります。
open-on-hover
プロパティをtrueにすると、アクティベーターにマウスカーソルを合わせるだけでメニューが表示されるようになります。
<v-menu :open-on-hover="true" :open-on-click="false" offset-y>
<!-- hover 省略 -->
</v-menu>
close
close-on-click
プロパティをtrueにするとメニュー外をクリックすると閉じ、close-on-content-click
プロパティをtrueにするとメニューをクリックすると閉じます。どちらもデフォルト値はtrueなのでメニュー外やメニューをクリックするとメニューは閉じます。
<v-menu :close-on-click="true" :close-on-content-click="false">
<!-- click close 省略 -->
</v-menu>
<v-menu :close-on-click="false" :close-on-content-click="true">
<!-- content click close 省略 -->
</v-menu>
delay
open-delay
、close-delay
プロパティでメニューの開閉にディレイを設定できます。指定する単位はミリ秒です。
<v-menu open-delay="2000" close-delay="2000" :open-on-hover="true">
<!-- delay 省略 -->
</v-menu>
disabled
disabled
プロパティを指定するとメニューを無効化します。
<v-menu disabled>
<!-- disabled 省略 -->
</v-menu>
disabled-keys
disabled-keys
プロパティを指定するとキーボード操作を無効にします。
キーボード操作が有効だとESCを押下してメニューを閉じることができます。
<v-menu disable-keys>
<!-- disable-keys 省略 -->
</v-menu>
表示位置
offset
offset-x
、offset-y
プロパティでメニューの表示位置を調整できます。
<v-menu offset-x>
<!-- offset-x 省略 -->
</v-menu>
<v-menu offset-y>
<!-- offset-y 省略 -->
</v-menu>
<v-menu offset-x offset-y>
<!-- offset-x,y 省略 -->
</v-menu>
offset-x
はメニューをアクティベーターの右隣りに表示します。(表示領域があれば)
offset-y
はメニューをアクティベーターの下に表示します。(表示領域があれば)
offset-x
とoffset-y
はメニューをアクティベーターの右下に表示します。(表示領域があれば)
position
さらにoffset-x
、offset-y
とtop
、bottom
、left
、right
プロパティと組み合わせると、メニューを上下左右に表示させることができます。
<v-menu top offset-y>
<!-- TOP + OFFSET-Y 省略 -->
</v-menu>
<v-menu bottom offset-y>
<!-- BOTTOM + OFFSET-Y 省略 -->
</v-menu>
<v-menu left offset-x>
<!-- LEFT + OFFSET-X 省略 -->
</v-menu>
<v-menu right offset-x>
<!-- RIGHT + OFFSET-Y 省略 -->
</v-menu>
nudge
さらにnudge-top
、nudge-bottom
、nudge-left
、nudge-right
プロパティを使用すると、メニューの表示位置を調整できます。
<v-menu top offset-y nudge-top="10">
<!-- TOP 省略 -->
</v-menu>
<v-menu bottom offset-y nudge-bottom="10">
<!-- BOTTOM 省略 -->
</v-menu>
<v-menu left offset-x nudge-left="10">
<!-- LEFT 省略 -->
</v-menu>
<v-menu right offset-x nudge-right="10">
<!-- RIGHT 省略 -->
</v-menu>
absolute
absolute
プロパティを指定するとアクティベーターをクリックした位置にメニューが表示されます。
下記はv-sheetコンポーネントをアクティベーターとしたときの例です。
<v-menu activator="#sheet1" absolute>
<!-- absolute 省略 -->
</v-menu>
<v-sheet id="sheet1" width="300" height="200" color="grey"></v-sheet>
表示サイズ
width
min-width
、max-width
プロパティでメニューの横幅を指定することができます。デフォルトではアクティベーターと同じ幅で表示されます。
下図は指定なしの状態で表示したメニューです。
下図はmax-width
プロパティで横幅を制限した状態です。
<v-menu offset-y max-width="150">
<!-- WIDTH 省略 -->
</v-menu>
height
max-height
プロパティでメニューの縦幅を指定することができます。表示幅に収まらない場合はスクロールバーが表示されます。
<v-menu offset-y max-height="180">
<!-- HEIGHT 省略 -->
</v-menu>
トランジション
デフォルトでfade-transition
というエフェクトが適用されていますが、transition
プロパティで他のエフェクトを適用することもできます。
またBoolean値でfalseを指定するとエフェクト無しで表示されます。
<v-menu>
<!-- DEFAULT 省略 -->
</v-menu>
<v-menu transition="scale-transition">
<!-- SCALE 省略 -->
</v-menu>
<v-menu transition="scroll-x-transition">
<!-- SCROLL 省略 -->
</v-menu>
<v-menu transition="slide-x-transition">
<!-- SLIDE 省略 -->
</v-menu>
<v-menu :transition="false">
<!-- FALSE 省略 -->
</v-menu>
Slots
activator
使用すると、クリックするとコンポーネントがアクティブになります(または特定のコンポーネントにカーソルを合わせます)。 これにより、イベントの伝播が手動で停止されます。 このスロットなしで、モデルを介してコンポーネントを開く場合、イベントの伝播を手動で停止する必要があります。
[Tooltips] (https://vuetifyjs.com/en/components/tooltips)
<v-tooltip top>
<!-- コンテンツのアクティベーター -->
<template v-slot:activator="{ on }">
<v-btn v-on="on">Button</v-btn>
</template>
<!-- ツールチップになるコンテンツ -->
<span>Tooltip</span>
</v-tooltip>
Props
VTooltip
- [VTooltip] (https://github.com/vuetifyjs/vuetify/blob/v2.2.12/packages/vuetify/src/components/VTooltip/VTooltip.ts)
- [Colorable] (https://github.com/vuetifyjs/vuetify/blob/v2.2.12/packages/vuetify/src/mixins/colorable/index.ts)
- [Delayable] (https://github.com/vuetifyjs/vuetify/blob/v2.2.12/packages/vuetify/src/mixins/delayable/index.ts)
- [Detachable] (https://github.com/vuetifyjs/vuetify/blob/v2.2.12/packages/vuetify/src/mixins/detachable/index.ts)
- [Bootable] (https://github.com/vuetifyjs/vuetify/blob/v2.2.12/packages/vuetify/src/mixins/bootable/index.ts)
- [Menuable] (https://github.com/vuetifyjs/vuetify/blob/v2.2.12/packages/vuetify/src/mixins/menuable/index.ts)
- [Positionable] (https://github.com/vuetifyjs/vuetify/blob/v2.2.12/packages/vuetify/src/mixins/positionable/index.ts)
- [Activatable] (https://github.com/vuetifyjs/vuetify/blob/v2.2.12/packages/vuetify/src/mixins/activatable/index.ts)
- [Toggleable] (https://github.com/vuetifyjs/vuetify/blob/v2.2.12/packages/vuetify/src/mixins/toggleable/index.ts)
VTooltip ---- Colorable
`--- Delayable
`--- Dependent
`--- Detachable ---- Bootable
`--- Menuable ---- Positionable
| `--- Stackable
| `--- Activatable ---- Delayable
| `--- Toggleable
`--- Toggleable
name | type | default | relation | src | |
---|---|---|---|---|---|
VTooltip | close-delay | number or string | 0 | 0 | |
disabled | boolean | false | |||
fixed | boolean | true | true | ||
open-delay | number or string | 0 | 0 | ||
open-on-hover | boolean | true | true | ||
tag | string | 'span' | 'span' | ||
transition | string | undefined | |||
z-index | any | undefined | null | ||
Colorable | color | string | undefined | ||
Delayable | open-delay | number or string | - | 0 | |
close-delay | number or string | - | 0 | ||
Detachable | attach | any | false | v-app | false |
content-class | string | undefined | v-app | '' | |
Bootable | eager | boolean | false | ||
Menuable | allow-overflow | boolean | false | ||
light | boolean | false | |||
dark | boolean | false | |||
max-width | number or string | auto | 'auto' | ||
min-width | number or string | undefined | |||
nudge-bottom | number or string | 0 | 0 | ||
nudge-left | number or string | 0 | 0 | ||
nudge-right | number or string | 0 | 0 | ||
nudge-top | number or string | 0 | 0 | ||
nudge-width | number or string | 0 | 0 | ||
offset-overflow | boolean | false | |||
open-on-click | boolean | false | |||
position-x | number | undefined | null | ||
position-y | number | undefined | null | ||
z-index | number or string | - | null | ||
Positionable | absolute | boolean | false | ||
bottom | boolean | false | |||
fixed | boolean | - | |||
left | boolean | false | |||
right | boolean | false | |||
top | boolean | false | |||
Activatable | activator | any | false | null | |
disabled | boolean | - | |||
internal-activator | boolean | false | |||
open-on-hover | boolean | - | |||
Toggleable | value | any | undefined |
- value : コンポーネントを表示するか非表示にするかを制御します。
実装例
ポジション
v-tooltipコンポーネントでは、ツールチップを正しく表示するためにポジションを指定するtop
、bottom
、left
、right
プロパティの何れかを指定する必要があります。
<v-tooltip left>
<!-- 省略 -->
</v-tooltip>
<v-tooltip top>
<!-- 省略 -->
</v-tooltip>
<v-tooltip bottom>
<!-- 省略 -->
</v-tooltip>
<v-tooltip right>
<!-- 省略 -->
</v-tooltip>
テーマ
dark
ダークテーマのツールチップです。
<v-tooltip top dark>
<template v-slot:activator="{ on }">
<v-btn dark v-on="on">Button</v-btn>
</template>
<span>Tooltip</span>
</v-tooltip>
light
ライトテーマのツールチップです。lightプロパティ以外のソースコードはダークテーマと同一です。
<v-tooltip top light>
<template v-slot:activator="{ on }">
<v-btn light v-on="on">Button</v-btn>
</template>
<span>Tooltip</span>
</v-tooltip>
カラー
color
プロパティでツールチップの背景色を指定します。
<v-tooltip top color="red">
<!-- color 省略 -->
</v-tooltip>
ツールチップのON/OFF
open
open-on-hover
プロパティのデフォルト値がtrueなので、カーソルを合わせるだけでツールチップが表示されるというのがデフォルトの動きになります。
open-on-click
プロパティをtrueにすると、アクティベーターをクリックするまでツールチップは表示されません。
<v-tooltip top :open-on-hover="true" :open-on-click="false">
<!-- hover 省略 -->
</v-tooltip>
<v-tooltip top :open-on-hover="false" :open-on-click="true">
<!-- click 省略 -->
</v-tooltip>
delay
open-delay
、close-delay
プロパティでツールチップのON/OFFにディレイを設定できます。指定する単位はミリ秒です。
なお、クリックしてツールチップをON/OFFする設定(open-on-click
をtrue、open-on-hover
をfalse)と併用はできないようです。
<v-tooltip top>
<!-- default 省略 -->
</v-tooltip>
<v-tooltip top open-delay="2000" close-delay="2000">
<!-- delay 省略 -->
</v-tooltip>
左側がデフォルト(ディレイ無し)、右側がディレイ有り(2秒)の動作です。
disabled
disabled
プロパティをtrueに設定するとツールチップは表示されません。
<v-tooltip top disabled>
<!-- disabled 省略 -->
</v-tooltip>
サイズ
min-width
、max-width
プロパティでツールチップの表示幅を指定できます。
<v-tooltip top min-width="200" max-width="400">
<!-- width 省略 -->
</v-tooltip>
<v-tooltip top>
<!-- default 省略 -->
</v-tooltip>
トランジション
デフォルトでscale-transition
というエフェクトが適用されていますが、transition
プロパティで他のエフェクトを適用することもできます。
<v-tooltip top>
<!-- default 省略 -->
</v-tooltip>
<v-tooltip top transition="fade-transition">
<!-- fade 省略 -->
</v-tooltip>
<v-tooltip top transition="slide-x-transition">
<!-- slide-x 省略 -->
</v-tooltip>
<v-tooltip top transition="scroll-x-transition">
<!-- scroll-x 省略 -->
</v-tooltip>
左からデフォルト(sacle-transition
)、fade-transition
、slide-x-transition
、scroll-x-transition
の動きです。
nudge
nudge-top
、nudge-bottom
、nudge-left
、nudge-right
プロパティでツールチップの表示位置を調整できます。
※他にnudge-width
というプロパティもありますが使い方の確認ができませんでした。
topとnudge-left/rightの組み合わせ
<v-tooltip top nudge-left="30">
<!-- nudge-left 省略 -->
</v-tooltip>
<v-tooltip top>
<!-- default 省略 -->
</v-tooltip>
<v-tooltip top nudge-right="30">
<!-- nudge-right 省略 -->
</v-tooltip>
bottomとnudge-left/rightの組み合わせ
<v-tooltip bottom nudge-left="30">
<!-- nudge-left 省略 -->
</v-tooltip>
<v-tooltip bottom>
<!-- default 省略 -->
</v-tooltip>
<v-tooltip bottom nudge-right="30">
<!-- nudge-right 省略 -->
</v-tooltip>
leftとnudge-top/bottomの組み合わせ
<v-tooltip left nudge-top="50">
<!-- nudge-top 省略 -->
</v-tooltip>
<v-tooltip left>
<!-- default 省略 -->
</v-tooltip>
<v-tooltip left nudge-bottom="50">
<!-- nudge-bottom 省略 -->
</v-tooltip>
rightとnudge-top/bottomの組み合わせ
<v-tooltip right nudge-top="50">
<!-- nudge-top 省略 -->
</v-tooltip>
<v-tooltip right>
<!-- default 省略 -->
</v-tooltip>
<v-tooltip right nudge-bottom="50">
<!-- nudge-bottom 省略 -->
</v-tooltip>
nudge同士の組み合わせ
<v-tooltip left nudge-top="25" nudge-right="25">
<!-- nudge-top nudge-right 省略 -->
</v-tooltip>
アクティベーター
アクティベータスロットを使わずにactivator
プロパティを使用することもできます。
<v-tooltip left nudge-top="20" activator="#card_ok">
<span>ok tooltip</span>
</v-tooltip>
<v-tooltip right nudge-top="20" activator="#card_cancel">
<span>cancel tooltip</span>
</v-tooltip>
<v-card>
<!-- 省略 -->
<v-card-actions>
<v-spacer></v-spacer>
<v-btn small id="card_ok">OK</v-btn>
<v-btn small id="card_cancel">Cancel</v-btn>
</v-card-actions>
</v-card>
Slots
activator
使用すると、クリックするとコンポーネントがアクティブになります(または特定のコンポーネントにカーソルを合わせます)。 これにより、イベントの伝播が手動で停止されます。 このスロットなしで、モデルを介してコンポーネントを開く場合、イベントの伝播を手動で停止する必要があります。