Tooltip ツールチップ
マウスホバー時に追加情報を表示するテキストヒントコンポーネントです。
基本的な使い方
<script setup lang="ts">
import { LhTooltip, LhButton } from '@lh-ui/vue3'
</script>
<template>
<!-- 基本的な使い方 -->
<LhTooltip content="これはヒントメッセージです">
<LhButton>ホバーでヒントを表示</LhButton>
</LhTooltip>
</template><script>
import { LhTooltip, LhButton } from '@lh-ui/vue3'
export default {
components: { LhTooltip, LhButton },
}
</script>
<template>
<!-- 基本的な使い方 -->
<LhTooltip content="これはヒントメッセージです">
<LhButton>ホバーでヒントを表示</LhButton>
</LhTooltip>
</template>各種位置
<script setup lang="ts">
</script>
<template>
<!-- 上 -->
<LhTooltip content="上のヒント" placement="top">
<LhButton>上</LhButton>
</LhTooltip>
<!-- 下 -->
<LhTooltip content="下のヒント" placement="bottom">
<LhButton>下</LhButton>
</LhTooltip>
<!-- 左 -->
<LhTooltip content="左のヒント" placement="left">
<LhButton>左</LhButton>
</LhTooltip>
<!-- 右 -->
<LhTooltip content="右のヒント" placement="right">
<LhButton>右</LhButton>
</LhTooltip>
</template><script>
export default {}
</script>
<template>
<!-- 上 -->
<LhTooltip content="上のヒント" placement="top">
<LhButton>上</LhButton>
</LhTooltip>
<!-- 下 -->
<LhTooltip content="下のヒント" placement="bottom">
<LhButton>下</LhButton>
</LhTooltip>
<!-- 左 -->
<LhTooltip content="左のヒント" placement="left">
<LhButton>左</LhButton>
</LhTooltip>
<!-- 右 -->
<LhTooltip content="右のヒント" placement="right">
<LhButton>右</LhButton>
</LhTooltip>
</template>遅延のカスタマイズ
<script setup lang="ts">
import { LhTooltip, LhButton } from '@lh-ui/vue3'
</script>
<template>
<!-- 1 秒遅延して表示 -->
<LhTooltip content="1 秒遅延して表示" :show-after="1000">
<LhButton>遅延ヒント</LhButton>
</LhTooltip>
<!-- open-delay / close-delay -->
<LhTooltip content="ホバーして 300ms 後に表示、離れて 500ms 後に非表示" :open-delay="300" :close-delay="500">
<LhButton>open-delay / close-delay</LhButton>
</LhTooltip>
</template><script>
import { LhTooltip, LhButton } from '@lh-ui/vue3'
export default {
components: { LhTooltip, LhButton },
}
</script>
<template>
<!-- 1 秒遅延して表示 -->
<LhTooltip content="1 秒遅延して表示" :show-after="1000">
<LhButton>遅延ヒント</LhButton>
</LhTooltip>
<!-- open-delay / close-delay -->
<LhTooltip content="ホバーして 300ms 後に表示、離れて 500ms 後に非表示" :open-delay="300" :close-delay="500">
<LhButton>open-delay / close-delay</LhButton>
</LhTooltip>
</template>国際化
ヒントのテキストは LhConfigProvider と組み合わせて言語パックを切り替えることで国際化できます。
<script setup lang="ts">
import { ref } from 'vue'
import { LhConfigProvider, LhTooltip, LhButton } from '@lh-ui/vue3'
import { zhCN } from '@lh-ui/vue3'
import { enUS } from '@lh-ui/vue3'
const locale = ref('zh-CN')
</script>
<template>
<!-- ConfigProvider で言語パックを切り替え -->
<LhConfigProvider :locale="locale === 'zh-CN' ? zhCN : enUS">
<LhTooltip :content="locale === 'zh-CN' ? '中文提示' : 'English Tooltip'">
<LhButton>Tooltip</LhButton>
</LhTooltip>
<LhButton @click="locale = locale === 'zh-CN' ? 'en-US' : 'zh-CN'">
{{ locale === 'zh-CN' ? '切换英文' : 'Switch to Chinese' }}
</LhButton>
</LhConfigProvider>
</template><script>
import { LhConfigProvider, LhTooltip, LhButton } from '@lh-ui/vue3'
import { zhCN } from '@lh-ui/vue3'
import { enUS } from '@lh-ui/vue3'
export default {
components: { LhConfigProvider, LhTooltip, LhButton },
data() {
return {
locale: 'zh-CN',
zhCN: zhCN,
enUS: enUS,
}
},
}
</script>
<template>
<!-- ConfigProvider で言語パックを切り替え -->
<LhConfigProvider :locale="locale === 'zh-CN' ? zhCN : enUS">
<LhTooltip :content="locale === 'zh-CN' ? '中文提示' : 'English Tooltip'">
<LhButton>Tooltip</LhButton>
</LhTooltip>
<LhButton @click="locale = locale === 'zh-CN' ? 'en-US' : 'zh-CN'">
{{ locale === 'zh-CN' ? '切换英文' : 'Switch to Chinese' }}
</LhButton>
</LhConfigProvider>
</template>sx クイックレイアウト
sx プロパティを使うと、追加の CSS を書かずにトリガーのルート要素の余白とサイズを手軽に調整できます。
<script setup lang="ts">
import { LhTooltip, LhButton } from '@lh-ui/vue3'
</script>
<template>
<!-- sx の余白レイアウト -->
<LhTooltip content="sx はトリガーのルート要素に適用されます" :sx="{ mt: 2, ml: 2 }">
<LhButton type="primary">上余白 2、左余白 2</LhButton>
</LhTooltip>
</template><script>
import { LhTooltip, LhButton } from '@lh-ui/vue3'
export default {
components: { LhTooltip, LhButton },
}
</script>
<template>
<!-- sx の余白レイアウト -->
<LhTooltip content="sx はトリガーのルート要素に適用されます" :sx="{ mt: 2, ml: 2 }">
<LhButton type="primary">上余白 2、左余白 2</LhButton>
</LhTooltip>
</template>sx は
8pxを基準とします:mt: 2→marginTop: 16px、ml: 2→marginLeft: 16px。完全なプロパティは sx クイックレイアウトを参照してください。
トリガー方式と状態
trigger でトリガー方式を指定します;disabled でヒントを無効化します;manual と visible を組み合わせて手動で表示を制御します;hideAfter で遅延非表示を制御します。
<script setup lang="ts">
import { ref } from 'vue'
import { LhTooltip, LhButton } from '@lh-ui/vue3'
const manualVisible = ref(false)
</script>
<template>
<!-- クリックでトリガー -->
<LhTooltip content="クリックでトリガー" trigger="click">
<LhButton>クリックでトリガー</LhButton>
</LhTooltip>
<!-- フォーカスでトリガー -->
<LhTooltip content="フォーカスでトリガー" trigger="focus">
<LhButton>フォーカスでトリガー</LhButton>
</LhTooltip>
<!-- ヒントを無効化 -->
<LhTooltip content="無効化されたヒント" disabled>
<LhButton type="info" disabled>ヒントを無効化</LhButton>
</LhTooltip>
<!-- 手動制御 -->
<LhTooltip content="手動制御" manual :visible="manualVisible">
<LhButton @click="manualVisible = !manualVisible">手動切り替え</LhButton>
</LhTooltip>
<!-- 遅延非表示 -->
<LhTooltip content="1 秒遅延して非表示" :hide-after="1000">
<LhButton>遅延非表示</LhButton>
</LhTooltip>
</template><script>
import { LhTooltip, LhButton } from '@lh-ui/vue3'
export default {
components: { LhTooltip, LhButton },
data() {
return {
manualVisible: false,
}
},
}
</script>
<template>
<!-- クリックでトリガー -->
<LhTooltip content="クリックでトリガー" trigger="click">
<LhButton>クリックでトリガー</LhButton>
</LhTooltip>
<!-- フォーカスでトリガー -->
<LhTooltip content="フォーカスでトリガー" trigger="focus">
<LhButton>フォーカスでトリガー</LhButton>
</LhTooltip>
<!-- ヒントを無効化 -->
<LhTooltip content="無効化されたヒント" disabled>
<LhButton type="info" disabled>ヒントを無効化</LhButton>
</LhTooltip>
<!-- 手動制御 -->
<LhTooltip content="手動制御" manual :visible="manualVisible">
<LhButton @click="manualVisible = !manualVisible">手動切り替え</LhButton>
</LhTooltip>
<!-- 遅延非表示 -->
<LhTooltip content="1 秒遅延して非表示" :hide-after="1000">
<LhButton>遅延非表示</LhButton>
</LhTooltip>
</template>
openDelay/closeDelayはそれぞれshowAfter/hideAfterのエイリアスで、好みに応じて使い分けられます。
テーマと外観
effect でダーク・ライトテーマを切り替え、bgColor で背景色をカスタマイズし、maxWidth で最大幅を制限し、teleportTarget でポップアップレイヤーのマウント先を指定します。
<script setup lang="ts">
import { LhTooltip, LhButton } from '@lh-ui/vue3'
</script>
<template>
<!-- ダークテーマ -->
<LhTooltip content="ダークテーマ" effect="dark">
<LhButton>ダークテーマ</LhButton>
</LhTooltip>
<!-- ライトテーマ -->
<LhTooltip content="ライトテーマ" effect="light">
<LhButton>ライトテーマ</LhButton>
</LhTooltip>
<!-- カスタム背景色 -->
<LhTooltip content="カスタム背景色" bg-color="#5a3fa8">
<LhButton>カスタム背景色</LhButton>
</LhTooltip>
<!-- 最大幅 -->
<LhTooltip content="このテキストは長めです。maxWidth により 160px に制限され、自動的に折り返して表示されます" :max-width="160">
<LhButton>最大幅 160px</LhButton>
</LhTooltip>
<!-- カスタムマウント先 -->
<LhTooltip content="#app にマウントされたポップアップ" teleport-target="#app">
<LhButton>カスタムマウント先</LhButton>
</LhTooltip>
</template><script>
import { LhTooltip, LhButton } from '@lh-ui/vue3'
export default {
components: { LhTooltip, LhButton },
}
</script>
<template>
<!-- ダークテーマ -->
<LhTooltip content="ダークテーマ" effect="dark">
<LhButton>ダークテーマ</LhButton>
</LhTooltip>
<!-- ライトテーマ -->
<LhTooltip content="ライトテーマ" effect="light">
<LhButton>ライトテーマ</LhButton>
</LhTooltip>
<!-- カスタム背景色 -->
<LhTooltip content="カスタム背景色" bg-color="#5a3fa8">
<LhButton>カスタム背景色</LhButton>
</LhTooltip>
<!-- 最大幅 -->
<LhTooltip content="このテキストは長めです。maxWidth により 160px に制限され、自動的に折り返して表示されます" :max-width="160">
<LhButton>最大幅 160px</LhButton>
</LhTooltip>
<!-- カスタムマウント先 -->
<LhTooltip content="#app にマウントされたポップアップ" teleport-target="#app">
<LhButton>カスタムマウント先</LhButton>
</LhTooltip>
</template>Tooltip API
Props
| プロパティ | 説明 | 型 | デフォルト値 |
|---|---|---|---|
| content | ヒントの内容 | string | '' |
| placement | ヒントの位置 | "top" | "top-start" | "top-end" | "bottom" | "bottom-start" | "bottom-end" | "left" | "left-start" | "left-end" | "right" | "right-start" | "right-end" | 'top' |
| trigger | トリガー方式 | "hover" | "click" | "focus" | 'hover' |
| disabled | 無効にするかどうか | boolean | false |
| manual | 手動で表示を制御するかどうか | boolean | false |
| visible | 手動制御の表示状態 | boolean | — |
| showAfter | 表示の遅延時間(ms) | number | 0 |
| hideAfter | 非表示の遅延時間(ms) | number | 0 |
| openDelay | 表示の遅延時間(ms)、showAfter のエイリアス | number | — |
| closeDelay | 非表示の遅延 | number | — |
| effect | テーマ | "dark" | "light" | 'dark' |
| type | 内蔵テーマ色タイプ(effect の背景色を上書きする) | "primary" | "success" | "warning" | "danger" | "info" | — |
| bgColor | カスタム背景色(effect と type の背景色を上書きする) | string | — |
| maxWidth | 最大幅 | string | number | '200px' |
| teleportTarget | Teleport のマウント先(セレクターまたは要素、デフォルトは body) | string | HTMLElement | 'body' |
| themeVars | コンポーネントレベルのテーマ変数。ConfigProvider の設定を上書きする | { [x: string]: string; } | — |
| bgPattern | コンポーネントレベルの背景紋様。ConfigProvider の設定を上書きする | string | — |
| sx | sx クイックレイアウトプロパティ(トリガーのルート要素に適用) | LhSxProps | — |
注:
triggerの'click'値は現時点では未実装です(挙動は'hover'と同じ)。クリックによる切り替えは今後のバージョンで提供されます。
Slots
| スロット名 | 説明 |
|---|---|
| default | ヒントをトリガーする要素(ヒントの本文は content プロパティで設定する) |
Methods
ref を使ってコンポーネントが公開するメソッドを呼び出せます:
| メソッド名 | 説明 |
|---|---|
| show | ヒントを直ちに表示する |
| hide | ヒントを直ちに非表示にする |
| toggle | ヒントの表示状態を切り替える |
アクセシビリティ
- ポップアップレイヤーは
role="tooltip"を持ちます。表示時にトリガーのルートへaria-describedbyが自動的に設定されポップアップを指し、非表示時に自動的に削除されるため、宙に浮いた参照が残りません - キーボードで操作可能:
hover/focusトリガー方式では、キーボードのフォーカスがトリガーに入る(focusin)とヒントも表示され、フォーカスが外れると自動的に非表示になります。これは WAI-ARIA APG の tooltip パターンに準拠しています;clickトリガー方式はフォーカスに反応しません - トリガー内にはフォーカス可能な要素(ボタンやリンクなど)を配置してください。純粋なテキストはキーボードでフォーカスできず、キーボードユーザーに対してヒントが届かなくなります
型定義
本コンポーネントが外部にエクスポートする TypeScript の型構造は以下の通りです(packages/components/tooltip/src/types.ts と @lh-ui/share/core/* のソースから自動抽出。各エントリーをクリックすると完全な定義を表示します。プロパティの説明は上記の Props 表を参照してください):
LhTooltipPlacement
/**
* Tooltip の型
*/
export type LhTooltipPlacement = 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end' | 'right' | 'right-start' | 'right-end'LhTooltipTrigger
export type LhTooltipTrigger = 'hover' | 'click' | 'focus'LhTooltipEffect
export type LhTooltipEffect = 'dark' | 'light'LhTooltipType
export type LhTooltipType = 'primary' | 'success' | 'warning' | 'danger' | 'info'LhTooltipProps
/**
* Tooltip コンポーネントの Props
*/
export interface LhTooltipProps {
/** ヒントのテキスト内容 */
content?: string
/** 表示位置 */
placement?: LhTooltipPlacement
/** トリガー方式 */
trigger?: LhTooltipTrigger
/** 無効にするかどうか */
disabled?: boolean
/** 手動で表示を制御するかどうか */
manual?: boolean
/** 手動制御の表示状態 */
visible?: boolean
/** 表示の遅延時間(ms) */
showAfter?: number
/** 非表示の遅延時間(ms) */
hideAfter?: number
/** 表示の遅延時間(ms)、showAfter のエイリアス */
openDelay?: number
/** 非表示の遅延 */
closeDelay?: number
/** テーマ */
effect?: LhTooltipEffect
/** 内蔵テーマ色タイプ(effect の背景色を上書きする) */
type?: LhTooltipType
/** カスタム背景色(effect と type の背景色を上書きする) */
bgColor?: string
/** 最大幅 */
maxWidth?: string | number
/** Teleport のマウント先(セレクターまたは要素、デフォルトは body) */
teleportTarget?: string | HTMLElement
/** コンポーネントレベルのテーマ変数。ConfigProvider の設定を上書きする */
themeVars?: Record<string, string>
/** コンポーネントレベルの背景紋様。ConfigProvider の設定を上書きする */
bgPattern?: string
/** sx クイックレイアウトプロパティ(トリガーのルート要素に適用) */
sx?: LhSxProps
}