ツールチップ
<script setup lang="ts">
import { TooltipArrow, TooltipContent, TooltipPortal, TooltipProvider, TooltipRoot, TooltipTrigger } from 'radix-vue'
import { Icon } from '@iconify/vue'
</script>
<template>
<TooltipProvider>
<TooltipRoot>
<TooltipTrigger
class="text-grass11 shadow-blackA7 hover:bg-green3 inline-flex h-[35px] w-[35px] items-center justify-center rounded-full bg-white shadow-[0_2px_10px] outline-none focus:shadow-[0_0_0_2px] focus:shadow-black"
>
<Icon icon="radix-icons:plus" />
</TooltipTrigger>
<TooltipPortal>
<TooltipContent
class="data-[state=delayed-open]:data-[side=top]:animate-slideDownAndFade data-[state=delayed-open]:data-[side=right]:animate-slideLeftAndFade data-[state=delayed-open]:data-[side=left]:animate-slideRightAndFade data-[state=delayed-open]:data-[side=bottom]:animate-slideUpAndFade text-grass11 select-none rounded-[4px] bg-white px-[15px] py-[10px] text-[15px] leading-none shadow-[hsl(206_22%_7%_/_35%)_0px_10px_38px_-10px,_hsl(206_22%_7%_/_20%)_0px_10px_20px_-15px] will-change-[transform,opacity]"
:side-offset="5"
>
Add to library
<TooltipArrow
class="fill-white"
:width="8"
/>
</TooltipContent>
</TooltipPortal>
</TooltipRoot>
</TooltipProvider>
</template>
機能
- 表示遅延をグローバルに制御するためのプロバイダー。
- トリガーがフォーカスされたか、ホバーされたときに開きます。
- トリガーがアクティブになったか、Escapeキーを押すと閉じます。
- カスタムタイミングをサポートします。
構成
すべての部品をインポートして組み立てる。
<script setup lang="ts">
import { TooltipArrow, TooltipContent, TooltipPortal, TooltipProvider, TooltipRoot, TooltipTrigger } from 'radix-vue'
</script>
<template>
<TooltipProvider>
<TooltipRoot>
<TooltipTrigger />
<TooltipPortal>
<TooltipContent>
<TooltipArrow />
</TooltipContent>
</TooltipPortal>
</TooltipRoot>
</TooltipProvider>
</template>
APIリファレンス
プロバイダー
ツールチップにグローバルな機能を提供するためにアプリケーションをラップします。
プロップ | デフォルト | タイプ |
---|---|---|
delayDuration | 700 | 数値 ポインターがトリガーに入った時点からツールチップが開くまでの期間。 |
disableClosingTrigger | ブール値
| |
disabled | ブール値
| |
disableHoverableContent | false | ブール値
|
ignoreNonKeyboardFocus | false | ブール値
|
skipDelayDuration | 300 | 数値 再度遅延が発生することなく、ユーザーが別のトリガーを入力できる時間。 |
ルート
ツールチップのすべての部品を含みます。
プロップ | デフォルト | タイプ |
---|---|---|
defaultOpen | false | ブール値 最初にレンダリングされたときのツールチップの開状態。開状態を制御する必要がない場合に使用します。 |
delayDuration | 数値
| |
disableClosingTrigger | ブール値
| |
disabled | ブール値
| |
disableHoverableContent | ブール値 ホバー時にTooltip.Contentが開いたままになるのを防ぎます。これを無効にすると、アクセシビリティに影響します。Tooltip.Providerから継承します。 | |
ignoreNonKeyboardFocus | ブール値
| |
open | ブール値 ツールチップの制御された開状態。 |
Emit | ペイロード |
---|---|
update:open | [value: boolean] ツールチップの開状態が変更されたときに呼び出されるイベントハンドラー。 |
スロット (デフォルト) | ペイロード |
---|---|
open | ブール値 現在の開状態 |
トリガー
ツールチップを切り替えるボタン。デフォルトでは、TooltipContent
はトリガーに対して自身を配置します。
プロップ | デフォルト | タイプ |
---|---|---|
as | 'button' | AsTag | コンポーネント このコンポーネントがレンダリングする要素またはコンポーネント。 |
asChild | ブール値 子として渡されたものに対してデフォルトでレンダリングされる要素を変更し、それらのプロップと動作をマージします。 詳細については、コンポジションガイドを参照してください。 |
データ属性 | 値 |
---|---|
[data-state] | "closed" | "delayed-open" | "instant-open" |
ポータル
使用すると、コンテンツ部分をbody
にポータルします。
プロップ | デフォルト | タイプ |
---|---|---|
disabled | ブール値 テレポートを無効にして、コンポーネントをインラインでレンダリングします。 | |
forceMount | ブール値 より多くの制御が必要な場合に強制的にマウントするために使用します。Vueアニメーションライブラリでアニメーションを制御する場合に便利です。 | |
to | 文字列 | HTMLElement Vueネイティブのテレポートコンポーネントのプロップ |
コンテンツ
ツールチップが開いているときにポップアップ表示されるコンポーネント。
プロップ | デフォルト | タイプ |
---|---|---|
align | 'start' | 'center' | 'end' トリガーに対する優先される位置合わせ。衝突が発生すると変更される場合があります。 | |
alignOffset | 数値
| |
ariaLabel | 文字列 デフォルトでは、スクリーンリーダーはコンポーネント内のコンテンツを読み上げます。これが十分に記述的でない場合、または読み上げることができないコンテンツがある場合は、より記述的なラベルとしてaria-labelを使用します。 | |
arrowPadding | 数値 矢印とコンテンツの端の間のパディング。コンテンツにborder-radiusがある場合、これにより角がオーバーフローするのを防ぎます。 | |
as | 'div' | AsTag | コンポーネント このコンポーネントがレンダリングする要素またはコンポーネント。 |
asChild | ブール値 子として渡されたものに対してデフォルトでレンダリングされる要素を変更し、それらのプロップと動作をマージします。 詳細については、コンポジションガイドを参照してください。 | |
avoidCollisions | ブール値
| |
collisionBoundary | 要素 | (要素 | null)[] | null 衝突境界として使用される要素。デフォルトではビューポートですが、このチェックに含める追加の要素を指定できます。 | |
collisionPadding | 数値 | Partial<Record<'top' | 'right' | 'bottom' | 'left', 数値>> 境界線の端から衝突検出が発生する距離(ピクセル単位)。数値(すべての辺で同じ)、または部分的なパディングオブジェクト(例:{ top: 20, left: 20 })を受け入れます。 | |
forceMount | ブール値 より多くの制御が必要な場合に強制的にマウントするために使用します。Vueアニメーションライブラリでアニメーションを制御する場合に便利です。 | |
hideWhenDetached | ブール値 トリガーが完全に隠されたときにコンテンツを隠すかどうか。 | |
side | 'top' | 'top' | 'right' | 'bottom' | 'left' 開いているときにレンダリングするトリガーの優先される辺。衝突が発生し、avoidCollisionsが有効になっている場合、反転されます。 |
sideOffset | 数値 トリガーからの距離(ピクセル単位)。 | |
sticky | 'partial' | 'always' 位置合わせ軸のスティッキーな動作。 |
Emit | ペイロード |
---|---|
escapeKeyDown | [イベント: KeyboardEvent] 開いた後にフォーカスが破壊的なアクションに移動したときに呼び出されるイベントハンドラー。 |
pointerDownOutside | [イベント: Event] コンポーネントの境界外でポインターイベントが発生したときに呼び出されるイベントハンドラー。 |
データ属性 | 値 |
---|---|
[data-state] | "closed" | "delayed-open" | "instant-open" |
[data-side] | "left" | "right" | "bottom" | "top" |
[data-align] | "start" | "end" | "center" |
CSS変数 | 説明 |
---|---|
--radix-tooltip-content-transform-origin | コンテンツと矢印の位置/オフセットから計算された transform-origin 。 |
--radix-tooltip-content-available-width | トリガーと境界線の端の間の残りの幅。 |
--radix-tooltip-content-available-height | トリガーと境界線の端の間の残りの高さ。 |
--radix-tooltip-trigger-width | トリガーの幅。 |
--radix-tooltip-trigger-height | トリガーの高さ。 |
矢印
ツールチップと一緒にレンダリングするためのオプションの矢印要素。これは、トリガーとTooltipContent
を視覚的にリンクするのに役立ちます。TooltipContent
内でレンダリングする必要があります。
プロップ | デフォルト | タイプ |
---|---|---|
as | 'svg' | AsTag | コンポーネント このコンポーネントがレンダリングする要素またはコンポーネント。 |
asChild | ブール値 子として渡されたものに対してデフォルトでレンダリングされる要素を変更し、それらのプロップと動作をマージします。 詳細については、コンポジションガイドを参照してください。 | |
height | 5 | 数値 矢印の高さ(ピクセル単位)。 |
width | 10 | 数値 矢印の幅(ピクセル単位)。 |
例
グローバルに設定
Provider
を使用して、delayDuration
とskipDelayDuration
をグローバルに制御します。
<script setup>
import { TooltipContent, TooltipProvider, TooltipRoot, TooltipTrigger } from 'radix-vue'
</script>
<template>
<TooltipProvider
:delay-duration="800"
:skip-delay-duration="500"
>
<TooltipRoot>
<TooltipTrigger>…</TooltipTrigger>
<TooltipContent>…</TooltipContent>
</TooltipRoot>
<TooltipRoot>
<TooltipTrigger>…</TooltipTrigger>
<TooltipContent>…</TooltipContent>
</TooltipRoot>
</TooltipProvider>
</template>
即時に表示
delayDuration
プロップを使用して、ツールチップが開くまでの時間を制御します。
<script setup>
import { TooltipContent, TooltipProvider, TooltipRoot, TooltipTrigger } from 'radix-vue'
</script>
<template>
<TooltipRoot :delay-duration="0">
<TooltipTrigger>…</TooltipTrigger>
<TooltipContent>…</TooltipContent>
</TooltipRoot>
</template>
無効なボタンからのツールチップの表示
無効なボタンはイベントを発生させないので、
Trigger
をspan
としてレンダリングします。button
にpointerEvents
がないことを確認します。
<script setup>
import { TooltipContent, TooltipProvider, TooltipRoot, TooltipTrigger } from 'radix-vue'
</script>
<template>
<TooltipRoot>
<TooltipTrigger as-child>
<span tabindex="0">
<button
disabled
style="{ pointerEvents: 'none' }"
>…</button>
</span>
</TooltipTrigger>
<TooltipContent>…</TooltipContent>
</TooltipRoot>
</template>
コンテンツサイズを制限する
コンテンツの幅をトリガーの幅に合わせて制限したい場合もあります。また、ビューポートを超えないように高さを制限したい場合もあります。
これをサポートするために、--radix-tooltip-trigger-width
や--radix-tooltip-content-available-height
などのいくつかのCSSカスタムプロパティを公開しています。これらを使用して、コンテンツの寸法を制限します。
<!-- index.vue -->
<script setup>
import { TooltipContent, TooltipProvider, TooltipRoot, TooltipTrigger } from 'radix-vue'
</script>
<template>
<TooltipRoot>
<TooltipTrigger>…</TooltipTrigger>
<TooltipPortal>
<TooltipContent
class="TooltipContent"
:side-offset="5"
>
…
</TooltipContent>
</TooltipPortal>
</TooltipRoot>
</template>
/* styles.css */
.TooltipContent {
width: var(--radix-tooltip-trigger-width);
max-height: var(--radix-tooltip-content-available-height);
}
起点認識アニメーション
CSSカスタムプロパティ--radix-tooltip-content-transform-origin
を公開しています。これを使用して、side
、sideOffset
、align
、alignOffset
、および衝突に基づいて計算された起点からコンテンツをアニメーション化します。
<!-- index.vue -->
<script setup>
import { TooltipContent, TooltipProvider, TooltipRoot, TooltipTrigger } from 'radix-vue'
</script>
<template>
<TooltipRoot>
<TooltipTrigger>…</TooltipTrigger>
<TooltipContent class="TooltipContent">
…
</TooltipContent>
</TooltipRoot>
</template>
/* styles.css */
.TooltipContent {
transform-origin: var(--radix-tooltip-content-transform-origin);
animation: scaleIn 0.5s ease-out;
}
@keyframes scaleIn {
from {
opacity: 0;
transform: scale(0);
}
to {
opacity: 1;
transform: scale(1);
}
}
衝突認識アニメーション
data-side
属性とdata-align
属性を公開しています。これらの値は、衝突を反映してランタイム時に変化します。これらを使用して、衝突と方向を認識するアニメーションを作成してください。
<!-- index.vue -->
<script setup>
import { TooltipContent, TooltipProvider, TooltipRoot, TooltipTrigger } from 'radix-vue'
</script>
<template>
<TooltipRoot>
<TooltipTrigger>…</TooltipTrigger>
<TooltipContent class="TooltipContent">
…
</TooltipContent>
</TooltipRoot>
</template>
/* styles.css */
.TooltipContent {
animation-duration: 0.6s;
animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1);
}
.TooltipContent[data-side="top"] {
animation-name: slideUp;
}
.TooltipContent[data-side="bottom"] {
animation-name: slideDown;
}
@keyframes slideDown {
from {
opacity: 0;
transform: translateY(-10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes slideUp {
from {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
アクセシビリティ
キーボード操作
キー | 説明 |
---|---|
Tab | ツールチップを開閉します(遅延なし)。 |
Space | 開いている場合は、ツールチップを閉じます(遅延なし)。 |
Enter | 開いている場合は、ツールチップを閉じます(遅延なし)。 |
Escape | 開いている場合は、ツールチップを閉じます(遅延なし)。 |
カスタムAPI
プリミティブな部分を独自のコンポーネントに抽象化することで、独自のAPIを作成してください。
部分の抽象化とcontentプロパティの導入
この例では、Tooltip
のすべての部分を抽象化し、新しいcontent
プロパティを導入しています。
使用方法
<script setup lang="ts">
import { Tooltip } from './your-tooltip'
</script>
<template>
<Tooltip content="Tooltip content">
<button>Tooltip trigger</button>
</Tooltip>
</template>
実装
asChild
プロパティを使用して、トリガー部分をスロット可能な領域に変換します。これにより、トリガーが渡された子要素に置き換えられます。
<!-- your-tooltip.vue -->
<script setup lang="ts">
import { TooltipArrow, TooltipContent, TooltipRoot, type TooltipRootEmits, type TooltipRootProps, TooltipTrigger, useForwardPropsEmits } from 'radix-vue'
const props = defineProps<TooltipRootProps & { content?: string }>()
const emits = defineEmits<TooltipRootEmits>()
const forward = useForwardPropsEmits(props, emits)
</script>
<template>
<TooltipRoot v-bind="forward">
<TooltipTrigger as-child>
<slot />
</TooltipTrigger>
<TooltipContent
side="top"
align="center"
>
{{ content }}
<TooltipArrow
:width="11"
:height="5"
/>
</TooltipContent>
</TooltipRoot>
</template>