Tooltip

TooltipGitHub
一个在悬停在元素上时显示信息的弹出框。

用法

在 Tooltip 的默认插槽中使用 Button 或任何其他组件。

<template>
  <UTooltip text="Open on GitHub">
    <UButton label="Open" color="neutral" variant="subtle" />
  </UTooltip>
</template>
请确保使用App组件包装您的应用程序,该组件使用了TooltipProvider组件(来自 Reka UI)。
您可以检查 App 组件的 tooltip 属性,以了解如何全局配置 Tooltip。

文本

使用 text 属性设置 Tooltip 的内容。

<template>
  <UTooltip text="Open on GitHub">
    <UButton label="Open" color="neutral" variant="subtle" />
  </UTooltip>
</template>

键盘按键

使用 kbds 属性在 Tooltip 中渲染 Kbd 组件。

<template>
  <UTooltip text="Open on GitHub" :kbds="['meta', 'G']">
    <UButton label="Open" color="neutral" variant="subtle" />
  </UTooltip>
</template>
您可以使用特殊键,例如 meta,它在 macOS 上显示为 ,在其他平台上显示为 Ctrl

延迟

使用 delay-duration 属性更改 Tooltip 出现前的延迟。例如,您可以将其设置为 0 使其立即出现。

<template>
  <UTooltip :delay-duration="0" text="Open on GitHub">
    <UButton label="Open" color="neutral" variant="subtle" />
  </UTooltip>
</template>
这可以通过 App 组件中的 tooltip.delayDuration 选项全局配置。

内容

使用 content 属性来控制 Tooltip 内容的渲染方式,例如它的 alignside

<template>
  <UTooltip
    :content="{
      align: 'center',
      side: 'bottom',
      sideOffset: 8
    }"
    text="Open on GitHub"
  >
    <UButton label="Open" color="neutral" variant="subtle" />
  </UTooltip>
</template>

箭头

使用 arrow 属性在 Tooltip 上显示箭头。

<template>
  <UTooltip arrow text="Open on GitHub">
    <UButton label="Open" color="neutral" variant="subtle" />
  </UTooltip>
</template>

禁用

使用 disabled 属性禁用 Tooltip。

<template>
  <UTooltip disabled text="Open on GitHub">
    <UButton label="Open" color="neutral" variant="subtle" />
  </UTooltip>
</template>

示例

控制打开状态

您可以通过使用default-open prop 或v-model:open指令来控制打开状态。

<script setup lang="ts">
const open = ref(false)

defineShortcuts({
  o: () => open.value = !open.value
})
</script>

<template>
  <UTooltip v-model:open="open" text="Open on GitHub">
    <UButton label="Open" color="neutral" variant="subtle" />
  </UTooltip>
</template>
在此示例中,利用 defineShortcuts,您可以通过按 O 来切换 Tooltip。

跟随光标

您可以通过使用reference属性使 Tooltip 在悬停在元素上时跟随光标。

悬停在我
<script setup lang="ts">
const open = ref(false)
const anchor = ref({ x: 0, y: 0 })

const reference = computed(() => ({
  getBoundingClientRect: () =>
    ({
      width: 0,
      height: 0,
      left: anchor.value.x,
      right: anchor.value.x,
      top: anchor.value.y,
      bottom: anchor.value.y,
      ...anchor.value
    } as DOMRect)
}))
</script>

<template>
  <UTooltip
    :open="open"
    :reference="reference"
    :content="{ side: 'top', sideOffset: 16, updatePositionStrategy: 'always' }"
  >
    <div
      class="flex items-center justify-center rounded-md border border-dashed border-accented text-sm aspect-video w-72"
      @pointerenter="open = true"
      @pointerleave="open = false"
      @pointermove="(ev) => {
        anchor.x = ev.clientX
        anchor.y = ev.clientY
      }"
    >
      Hover me
    </div>

    <template #content>
      {{ anchor.x.toFixed(0) }} - {{ anchor.y.toFixed(0) }}
    </template>
  </UTooltip>
</template>

API

属性

属性默认值类型
文本

string

工具提示的文本内容。

键盘按键

(string|undefined)[]|KbdProps[]

在工具提示中显示的键盘按键。

内容

{ side: 'bottom', sideOffset: 8, collisionPadding: 8 }

TooltipContentProps &Partial<EmitsToProps<TooltipContentImplEmits>>

Tooltip 的内容。

arrow

false

boolean | TooltipArrowProps

在 Tooltip 旁边显示一个箭头。

portal

true

string | false | true | HTMLElement

在 portal 中渲染 tooltip。

reference

Element |VirtualElement

用于定位的引用(或锚点)元素。

如果未提供,将使用当前组件作为锚点。

defaultOpen

boolean

工具提示在初始渲染时的打开状态。当您不需要控制其打开状态时使用。

open

boolean

工具提示的受控打开状态。

delayDuration

700

number

覆盖 Provider 中给出的持续时间,以自定义特定 Tooltip 的打开延迟。

disableHoverableContent

boolean

阻止 Tooltip.Content 在悬停时保持打开状态。禁用此功能会影响可访问性。继承自 Tooltip.Provider。

disableClosingTrigger

false

boolean

当为 true 时,点击触发器不会关闭内容。

disabled

false

boolean

当为 true 时,禁用 tooltip

ignoreNonKeyboardFocus

false

boolean

防止 Tooltip 在焦点不是来自键盘时打开,通过与 :focus-visible 选择器匹配。如果您想避免在切换浏览器标签页或关闭对话框时打开它,这很有用。

ui

{ content?: ClassNameValue; arrow?: ClassNameValue; text?: ClassNameValue; kbds?: ClassNameValue; kbdsSize?: ClassNameValue; }

插槽

插槽类型
default

{ open: boolean; }

内容

{}

事件

事件类型
update:open

[value: boolean]

主题

app.config.ts
export default defineAppConfig({
  ui: {
    tooltip: {
      slots: {
        content: 'flex items-center gap-1 bg-default text-highlighted shadow-sm rounded-sm ring ring-default h-6 px-2.5 py-1 text-xs select-none data-[state=delayed-open]:animate-[scale-in_100ms_ease-out] data-[state=closed]:animate-[scale-out_100ms_ease-in] origin-(--reka-tooltip-content-transform-origin) pointer-events-auto',
        arrow: 'fill-default',
        text: 'truncate',
        kbds: "hidden lg:inline-flex items-center shrink-0 gap-0.5 not-first-of-type:before:content-['·'] not-first-of-type:before:me-0.5",
        kbdsSize: 'sm'
      }
    }
  }
})
vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'

export default defineConfig({
  plugins: [
    vue(),
    ui({
      ui: {
        tooltip: {
          slots: {
            content: 'flex items-center gap-1 bg-default text-highlighted shadow-sm rounded-sm ring ring-default h-6 px-2.5 py-1 text-xs select-none data-[state=delayed-open]:animate-[scale-in_100ms_ease-out] data-[state=closed]:animate-[scale-out_100ms_ease-in] origin-(--reka-tooltip-content-transform-origin) pointer-events-auto',
            arrow: 'fill-default',
            text: 'truncate',
            kbds: "hidden lg:inline-flex items-center shrink-0 gap-0.5 not-first-of-type:before:content-['·'] not-first-of-type:before:me-0.5",
            kbdsSize: 'sm'
          }
        }
      }
    })
  ]
})

更新日志

5cb65— 特性:导入 @nuxt/ui-pro 组件

5e39c— fix: 仅当存在 textkbds 时才渲染(#4568)

b00e0— feat: 添加 reference 属性

69a7b— feat: 添加 reference 属性

29fa4— 特性:添加全局 portal 属性 (#3688)

39c86— fix:@nuxt/module-builder 升级后重构类型(#3855)

5dec0— feat: 处理 content 属性中的事件