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 属性,了解如何进行全局配置。

文本

使用 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 内容的渲染方式,例如它的 align(对齐)或 side(侧边)。

<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: PointerEvent) => {
        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[]

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

内容{ 侧面: '底部', 侧面偏移量: 8, 碰撞填充: 8 }TooltipContentProps & Partial<EmitsToProps<TooltipContentImplEmits>>

Tooltip 的内容。

arrowfalseboolean | TooltipArrowProps

在 Tooltip 旁边显示一个箭头。

portaltruestring | false | true | HTMLElement

在传送门 (portal) 中渲染 Tooltip。

referenceElement | VirtualElement

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

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

defaultOpenboolean

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

openboolean

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

delayDuration700number

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

disableHoverableContentboolean

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

disableClosingTriggerfalseboolean

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

disabledfalseboolean

当为 true 时,禁用 Tooltip

ignoreNonKeyboardFocusfalseboolean

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

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

插槽

插槽类型
default{ open: boolean; }
内容{ ui: object; }

事件

事件类型
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'
          }
        }
      }
    })
  ]
})

更新日志

v4.5.0
v4.2.0
  • dd81d— feat(components): 添加 data-slot 属性 (#5447)
v4.1.0
  • 63c0a— feat(components): 在使用的插槽属性中暴露 ui (#5207)
v3.3.1
  • 5e39c— fix(Tooltip): 仅在存在 textkbds 时渲染 (#4568)
  • 5cb65— feat: 导入 @nuxt/ui-pro 组件 (#4675)
v3.3.0
  • 63476— fix(Tooltip): 仅在同时存在 textkbds 时显示分隔符 (#4570)
  • b00e0— feat(Popover): 添加 reference 属性
  • 69a7b— feat(Tooltip): 添加 reference 属性
v3.1.3
  • 0634a— fix(Tooltip): 增加内边距以保持一致性
v3.1.0
  • 29fa4— feat(App): 添加全局 portal 属性 (#3688)
  • d49e0— feat(module): 定义中性效用类 (neutral utilities) (#3629)
  • 01d8d— fix(components): 在 popper 内容中遵循 transform-origin (#3919)
  • f9737— feat(module): 动态 rounded-* 工具类 (#3906)
  • 39c86— fix(components): 在 @nuxt/module-builder 升级后重构类型 (#3855)
v3.0.1
  • 5dec0— feat(components): 处理 content 属性中的事件