【Vue.js】 【Vuetify】v-selectでv-tooltipを使う

こんにちは、びぶんです。 最近はVue.jsのフレームワークVuetifyを使っています。その中で、セレクトボックスにツールチップを使用することに躓いたため、その解決策を備忘録的に記載します。 かなりピンポイントですが、お付き合いください。

やりたいこと

セレクトボックスv-selectで、どこにマウスカーソルを合わせてもツールチップv-tooltipを表示したい!

環境

  • Vue:2.6.14
  • Vuetify:2.6.0

ツールチップとは?

ツールチップとは、ボタンなどでマウスカーソルを置いたときに吹き出しのように文字を表示するものです。ボタンの説明などで使用されます。

Vuetifyの公式ページにはボタンやテキストに適用されたツールチップはありますが、セレクトボックスに使用された例はありません。 v2.vuetifyjs.com

今回の問題

セレクトボックスv-selectでツールチップv-tooltipを使いたいですが、以下のように文字部分にマウスカーソルを合わせてもツールチップが表示されません。 これでは、長い文字列がセレクトボックスにある場合、ツールチップが表示できなくなる可能性があります。

ちなみにこの場合のコードは以下の通りです。

<v-tooltip top>
  <template v-slot:activator="{ on }">
    <v-select
      :items="items"
      v-model="selectItem"
      label="Select"
      v-on="on"
    ></v-select>
  </template>
  <span>{{ selectItem }}</span>
</v-tooltip>

解決策

styleに以下のコードを入れるだけです。template側のコードは変える必要はありません。

.v-select.v-text-field input {
  position: absolute !important;
}

原因

v-selectの仕様上、このセレクトボックスは2つ領域に分かれます。文字列が入るdivとその他のinputの2つです。特にv-tooltipによって適用されるのはinputの方のみのようなので、今回のような問題が発生しました。 この2つに対しては、デフォルトで以下のようにCSSが適用されています。

.v-select.v-text-field input {
    position: relative;
}

HTMLでの配置では、以下のように2つの領域が横並びになっています。

そこで、強制的にinput側をセレクトボックス全体に適用されるように「absolute」を入れてあげればよいということです。 そうすることで、input側を全体に持ってくることができます。

今回はCSSを駆使して何とか解決できました。これ以外に方法があれば教えてください。 では、また!