はじめに
こんにちは、ラボルのフロントエンドエンジニアのchi-satoです。
ラボルでは、フロントエンドのフレームワークでVue.jsを使用しているのですが、2023年12月末でVue2のサポートが終了するため、Vue3へのリプレイスを進めてきました。
その中で、Vue2で使っていたツールチップの実装がVue3では使えなくなってしまったので、Vue3でも対応できるようにライブラリをアップデートしました。そのため今回は、アップデート後のツールチップのライブラリ「floating-vue」についてと、より楽に実装するための方法をご紹介します!
floating-vueを使うことになった経緯
Vue2の既存コードでは「v-tooltip」というプラグインを使用してツールチップを実装していましたが、使用していたv-tooltipのバージョンがVue3には対応していませんでした。そのためVue3でも対応させるために新しいバージョンを使うことになりました。バージョンアップに伴って、名前も「floating-vue」に変更になりました。
v-tooltipではpopperjs(https://popper.js.org/)というライブラリを使用してVue.jsでのツールチップを実現していましたが、floating-vueではfloating-ui(https://floating-ui.com/)というライブラリを使っています。バージョンアップにより使い方が変わった箇所がいくつかあるので、次のセクションでは、実際にfloating-vueの使い方を紹介します。
基本の使い方
Vue3で新規実装したコード(floating-vue)
Vue2のときの記述方法はこちらでしたが、Vue3では下記のように実装します。
▼実装後のイメージ
これから実装するツールチップのイメージです。

▼install
npm i floating-vue
▼app.jsでfloating-vueを読み込む
import { Tooltip } from "floating-vue";
import "floating-vue/dist/style.css";//デフォルトcss
nuxtApp.vueApp.component("VTooltip", Tooltip);
▼Page側で読み込む
Sample.vue
<template>
<VTooltip
:triggers="['click']"
auto-hide
distance="8"
class="v-tooltip"
placement="top">
<button
type="button"
class="tooltip__btn"
@click="clickEvent">
?
</button>
<template #popper>
ここにツールチップの内容が入ります
</template>
</VTooltip>
</template>
<script setup>
const clickEvent = () => {
console.log('tooltipがclickされました')
};
</script>
<style lang="scss">
.tooltip__btn {
@include font-size(12);
width: 20px;
height: 20px;
font-weight: bold;
color: #fff;
background-color: #c8c8c8;
border-radius: 50%;
}
</style>
▼補足
VTooltipに指定している属性の内容は下記の通りです。
triggers: ツールチップを表示/非表示するトリガーとなるイベントを設定します。distance: 垂直方向の距離をピクセルで指定します。(水平方向の距離を指定したい場合はskiddingを使います)placement: tooltipを表示する位置を指定します。auto-hide: tooltipの領域外をクリックしたときにツールチップが閉じるようになります。
あとは任意でCSSやイベントを指定したら、ツールチップの実装の完了です!
Vue2で使っていたv-tooltipのコード
ちなみに、Vue2で使っていたv-tooltipは下記のようにして実装していました。
▼app.jsで読み込む
import VTooltip from 'v-tooltip' Vue.use(VTooltip);
▼Page側で読み込む
Sapmle.vue
<template>
<v-popover offset="16">
<button
type="button"
class="tooltip__btn"
@click="clickEvent">
?
</button>
<template slot="popover">
ここにツールチップの内容が入ります
</template>
</v-popover>
<template>
<style lang="scss">
.tooltip__btn {
@include font-size(12);
background-color: $disable;
font-weight: bold;
color: $white;
border-radius: 50%;
width: 20px;
height: 20px;
}
</style>
▼補足
offset: ツールチップが表示される位置をピクセルで指定します。offset="10 4”のように指定すると、垂直方向に10px,水平方向に4px移動します。
Tooltipをコンポーネント化してより楽に使い回す
前のセクションではfloating-vueを使ってツールチップを実装しましたが、Tooltipの呼び出し側で属性の指定をするとコード量が増えてしまうし、仕様が変更になった時に修正するのは手間ですよね。 そのため、floating-vueで実装したツールチップのコードを更にコンポーネント化し、より楽に使いまわせるようにします。
▼コンポーネントのコード
CustomTooltip.vue
<template>
<VTooltip
:triggers="['click']"
auto-hide
distance="8"
class="v-tooltip"
:placement="tooltipPlacement">
<button
type="button"
class="tooltip__btn"
@click="$emit('click')">
?
</button>
<template #popper>
<slot name="content" />
</template>
</VTooltip>
</template>
<script setup lang="ts">
const props = defineProps({
isShowBottom: { type: Boolean, default: false }, //吹き出し位置のカスタム用
});
const tooltipPlacement = computed(() => {
return props.isShowBottom ? "bottom" : "top";
});
</script>
<style lang="scss">
.tooltip__btn {
@include font-size(12);
width: 20px;
height: 20px;
margin-left: 4px;
font-weight: bold;
color: $white;
background-color: $disable;
border-radius: 50%;
}
</style>
▼Tooltipの呼び出し側
Tooltipを呼び出す側では、#contentを指定しているタグの中でツールチップに表示する内容を差し込みます。イベントやpropsは必要に応じて指定します。
Sample.vue
<CustomTooltip is-show-bottom="true" @click="clickEvent()"> <template #content> ここにツールチップの内容を記載します </template> </CustomTooltip>
導入手順は以上です!これでより楽にツールチップを使いまわせるようになりました。
まとめ
今回は「 floating-vue」についての紹介と、より楽に使い回す方法をご紹介しました!Vue3で簡単にツールチップを実装したい方は、是非試してみてください。
最後に
ラボルでは、エンジニアを積極採用中です。
1、2 年目のエンジニアから経験豊富なテックリードやエンジニリングマネージャーまで、興味がある方はぜひご応募ください!!