floating-ui-vue-skilld について
@floating-ui/vueは、ツールチップ、ポップオーバー、メニューなどを基準要素の近くに配置するVue 3用コンポーザブルです。useFloatingによるリアクティブな位置計算と、Vue 3.3以降に対応したVue向けミドルウェアを提供します。
主な機能
- 01フローティング要素の座標計算
- 02リアクティブなrefとgetterオプション
- 03位置調整ミドルウェアと矢印対応
- 04レイアウト変化に応じた自動更新
活用シーン
- 01基準要素のそばへのツールチップ配置
- 02スクロールやリサイズ中のメニュー位置維持
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ skilld-dev/ vue-ecosystem-skills --skill floating-ui-vue-skilldインストール後、Claude Code で/floating-ui-vue-skilldを入力して読み込まれたか確認します。
同梱ファイルreferences/api.mdreferences/migration.md
詳細
@floating-ui/vue 2.0.1
アンカー位置指定用の Vue 3 コンポーザブルです。useFloating() は、フローティング要素(ツールチップ、ポップオーバー、メニュー)を参照要素の隣に配置する x/y 座標を計算します。
バージョンの制限
- Vue
>=3.3.0のみ対応しています(ピア依存関係、package.json:58)。v2.0.0 でvue-demiレイヤーが削除され、Vue 2 および Vue <3.3 のサポートが終了しました。 - Vue 2 または Vue <3.3 のプロジェクトでは、
npm install @floating-ui/vue@1を引き続き使用する必要があります(https://floating-ui.com/docs/vue)。 - ランタイム依存関係:
@floating-ui/dom@^1.8.0、@floating-ui/utils@^0.2.12(package.json:46-49)。 exactOptionalPropertyTypesを有効にした TypeScript に対応しています(v2.0.1 以降。オプショナルプロパティの型はT | undefinedです。dist/floating-ui.vue.d.ts:198-224)。
クイックスタート
<script setup>
import {ref} from 'vue';
import {useFloating, offset, flip, shift, autoUpdate} from '@floating-ui/vue';
const reference = ref(null);
const floating = ref(null);
const open = ref(false);
const {floatingStyles, isPositioned} = useFloating(reference, floating, {
open,
middleware: [offset(10), flip(), shift()],
whileElementsMounted: autoUpdate,
});
</script>
<template>
<button ref="reference" @click="open = !open">Button</button>
<div v-if="open" ref="floating" :style="floatingStyles">Tooltip</div>
</template>
デフォルトの配置は bottom です。位置指定にはデフォルトで transform を使用します(https://floating-ui.com/docs/vue)。
1.x からの API 変更
- 破壊的変更(2.0.0):
vue-demiが削除されました。Vue 2 および Vue <3.3 はサポートされなくなりました。その他の破壊的な API 変更はありません。useFloating、arrowおよびすべての再エクスポートのシグネチャは、1.1.x のものが維持されています(https://github.com/floating-ui/floating-ui/releases/tag/@floating-ui/[email protected])。 - 修正(2.0.1):
exactOptionalPropertyTypesのもとで、オプショナルなuseFloatingオプションに明示的なundefinedを指定できるようになりました(https://github.com/floating-ui/floating-ui/releases/tag/@floating-ui/[email protected])。 - 1.x から引き継がれた変更のない動作:
x/yのデフォルト値は0(nullではありません)です。floatingStylesはバインド可能な位置指定スタイルを返します。1.1.0 以降、オプションには参照値とゲッター(MaybeReadonlyRefOrGetter)を指定できます(dist/floating-ui.vue.d.ts:193-225、dist/floating-ui.vue.mjs:83-84で確認済み)。
ベストプラクティス
- スクロール、サイズ変更、レイアウト変更の間もフローティング要素をアンカー位置に保つため、
whileElementsMounted: autoUpdateを渡します(dist/floating-ui.vue.mjs:146-156;https://floating-ui.com/docs/vue)。 - オプションを渡すために
autoUpdateをラップする場合は、必ずクリーンアップ関数を返します(dist/floating-ui.vue.mjs:140-145):
useFloating(reference, floating, {
whileElementsMounted(...args) {
return autoUpdate(...args, {animationFrame: true});
},
});
whileElementsMountedを使用する場合は、フローティング要素にv-ifを使います。v-showを使う場合は、whileElementsMountedを省略してautoUpdateを手動で管理してください。そうしないと、非表示要素のリスナーがリークします(https://floating-ui.com/docs/vue)。openの参照値を渡し、副作用の実行をisPositionedで制御します。位置指定はマイクロタスクで解決されるため、それまでは要素が (0, 0) に配置されます。openがfalseの間、isPositionedはfalseのままです(dist/floating-ui.vue.mjs:137、dist/floating-ui.vue.mjs:157-161):
const {isPositioned} = useFloating(reference, floating, {open});
watch(isPositioned, (positioned) => {
if (positioned) inputRef.value?.focus();
});
open、placement、strategy、middleware、transformオプションには、リアクティビティを保つために参照値またはゲッター(() => props.placement)を渡します。これらはflush: 'sync'で監視されます(dist/floating-ui.vue.mjs:162-164)。- コンポーネントのテンプレート参照を直接渡します。コンポーネントは
$el経由で展開されます。コメントノードを描画するコンポーネントはnullに解決され、位置指定は安全に何もしません(dist/floating-ui.vue.mjs:6-15)。 - デフォルトの
transform: trueを維持し、CSS の transform アニメーションが必要な場合は内側のラッパー要素をアニメーションさせます。外側の位置指定ノードはtranslate()による位置指定を維持します(https://floating-ui.com/docs/vue)。 - テンプレート参照を使って
arrow({element: arrowRef})を指定します。矢印要素がマウントされるまでは何もせず({}を返し)、配置にはmiddlewareData.arrow?.x/.yを参照します(dist/floating-ui.vue.mjs:27-34)。
よくあるタスク
- 矢印の位置指定の例とすべてのオプションのデフォルト値:API リファレンス。
- 1.x からのアップグレード、または Vue 2 向けのバージョン固定:移行ガイド。
パッケージのエクスポート
useFloating、arrow に加えて、@floating-ui/dom から再エクスポートされるもの:autoPlacement、autoUpdate、computePosition、detectOverflow、flip、getOverflowAncestors、hide、inline、limitShift、offset、platform、shift、size(dist/floating-ui.vue.mjs:2)。Vue 対応の arrow の動作を維持するため、ミドルウェアは @floating-ui/dom ではなく @floating-ui/vue からインポートしてください。
コメント
Markdown 対応