组件
返回目录
组件详情入口
浮层
@vean/ui
STooltip

Tooltip

Tooltip 属于 浮层 分类。建议先看演示与用法,再对照 API 表格完成接入和样式调整。

先用快捷跳转面板找到概述、用法、演示和 API,再往下细读完整文档内容。

快速跳转

同分类组件

如果你在同一类交互里做组合,这些组件通常会一起出现。

文字提示

概述

当元素获得键盘焦点或鼠标悬停时,显示与该元素相关信息的弹出层。STooltip 组合 Aria TooltipRoot/TooltipTrigger/TooltipPositioner/TooltipPopup/TooltipArrow 基础组件家族(构建于共享 Popper)与 tooltipVariants 样式配方(3 个槽、6 种尺寸)。

文字提示适合简短、不可交互的提示。丰富的悬停内容请用 hover-card;点击触发的内容请用 popover;确认请用 popconfirm。

用法

特性

  • 🧩 Aria/样式分离 — TooltipCompact 聚合 popper 触发器、定位器、弹层与箭头;STooltip 只注入样式并转发插槽/事件
  • 🖱️ 悬停 + 焦点 — 指针悬停或键盘焦点时打开;Escape 或指针离开时关闭
  • ⏱️ 延迟调节 — delayDuration(打开)与 skipDelayDuration(触发间隔),全局默认值经 ConfigProvider
  • 🎯 定位 — 完整 popper placement 控制,带碰撞避免与按侧滑入动画
  • 🔽 箭头 — showArrow 渲染定位箭头;经 arrowProps 可配置
  • 🏷️ 内容 — content prop 或默认插槽
  • ♿ 行为开关 — ignoreNonKeyboardFocus、disableHoverableContent、disableClosingTrigger、disabled
  • 📐 6 种尺寸 — xs–2xl size;逐槽 ui 覆盖
  • ♿ 无障碍 — role="tooltip"(视觉隐藏文本节点)、非模态、打开与关闭时 axe-core 零违规

组件家族

  • STooltip(样式层)— 入口包装组件;tooltipVariants 配方配合动态插槽转发
  • TooltipRoot(Aria)— 状态持有者;经 useControllableState 维护 open,提供 delayDuration/skipDelayDuration/disabled/ignoreNonKeyboardFocus,合并全局 ConfigProvider tooltip 配置
  • TooltipTrigger(Aria)— 悬停/聚焦打开提示的锚点
  • TooltipPositioner / TooltipPositionerImpl(Aria)— 定位表面(构建于 PopperPositioner)
  • TooltipPopup(Aria)— 弹层主体;暴露视觉隐藏的 role="tooltip" 文本节点供屏幕阅读器
  • TooltipArrow(Aria)— popper 箭头
  • TooltipCompact(Aria)— 聚合组件;组合触发器/定位器/弹层/箭头并暴露各插槽

演示

基础

API

Aria 层

9

Tooltip

21 属性8 事件2 插槽
属性
属性名类型默认值描述
class
ClassValue
—
弹出窗口类
size
ThemeSize
—
组件的视觉尺寸。
ui
Partial<TooltipUi>
—
该组件的按槽类重写。
content
string
—
内容。
placement
Placement
—
位置。
showArrow
boolean
—
是否显示箭头。
triggerProps
PopperAnchorProps
—
转发给触发元素的属性。
portalProps
TooltipPortalProps
—
转发给 portal 元素的属性。
positionerProps
TooltipPositionerProps
—
转发给定位器元素的属性。
popupProps
TooltipPopupProps
—
转发给弹出窗口元素的属性。
arrowProps
TooltipArrowProps
—
转发给箭头元素的属性。
defaultOpen
boolean
—
工具提示在初始渲染时的打开状态。当您无需控制其打开状态时使用此选项。
open
boolean
—
工具提示的受控打开状态。
dir
Direction
—
—
modal
boolean
—
—
disabled
boolean
—
当值为 `true` 时,禁用工具提示
delayDuration
number
150
从指针进入触发区域到工具提示打开所花费的时间。
skipDelayDuration
number
300
用户在触发延迟之前,有多少时间可以输入另一个触发条件。
disableHoverableContent
boolean
false
当设置为 `true` 时,尝试将鼠标悬停在内容上,当指针离开触发区域时,工具提示将关闭。
disableClosingTrigger
boolean
false
当值为 `true` 时,点击触发器不会关闭内容。
ignoreNonKeyboardFocus
boolean
false
通过匹配 `:focus-visible` 选择器,防止在焦点非来自键盘时打开工具提示。如果希望在切换浏览器标签页或关闭 对话框时避免打开工具提示,此方法非常有用。
事件
事件名参数描述
update:open
boolean, reason?: PopperOpenChangeReason | undefined
当工具提示的打开状态发生变化时,会调用此事件处理程序。
escapeKeyDown
KeyboardEvent
当 Esc 键被按下时触发的事件处理程序。可被阻止。
pointerDownOutside
PointerDownOutsideEvent
当 `pointerdown` 事件发生在 `DismissableLayer` 外部时调用的事件处理程序。可被阻止。
focusOutside
FocusOutsideEvent
当焦点移出 `DismissableLayer` 时触发的事件处理程序。可被阻止。
interactOutside
PointerDownOutsideEvent | FocusOutsideEvent
当在 `DismissableLayer` 外部发生交互时触发的事件处理程序。具体而言,当 `pointerdown` 事件在该区域外部发生,或焦点移出该区域时触发。此事件可被阻止。
openAutoFocus
Event
在打开页面时自动聚焦时触发的事件处理程序。可被阻止。
closeAutoFocus
Event
在关闭时自动聚焦时触发的事件处理程序。可被阻止。
placed
—
—
插槽
插槽名参数描述
default
—
默认插槽的自定义内容。
trigger
—
触发槽的自定义内容。

TooltipArrow

TooltipCompact

18 属性8 事件2 插槽
属性
属性名类型默认值描述
content
string
—
内容。
placement
Placement
—
位置。
showArrow
boolean
—
是否显示箭头。
triggerProps
PopperAnchorProps
—
转发给触发元素的属性。
portalProps
TooltipPortalProps
—
转发给 portal 元素的属性。
positionerProps
TooltipPositionerProps
—
转发给定位器元素的属性。
popupProps
TooltipPopupProps
—
转发给弹出窗口元素的属性。
arrowProps
TooltipArrowProps
—
转发给箭头元素的属性。
defaultOpen
boolean
—
工具提示在初始渲染时的打开状态。当您无需控制其打开状态时使用此选项。
open
boolean
—
工具提示的受控打开状态。
dir
Direction
—
—
modal
boolean
—
—
disabled
boolean
—
当值为 `true` 时,禁用工具提示
delayDuration
number
150
从指针进入触发区域到工具提示打开所花费的时间。
skipDelayDuration
number
300
用户在触发延迟之前,有多少时间可以输入另一个触发条件。
disableHoverableContent
boolean
false
当设置为 `true` 时,尝试将鼠标悬停在内容上,当指针离开触发区域时,工具提示将关闭。
disableClosingTrigger
boolean
false
当值为 `true` 时,点击触发器不会关闭内容。
ignoreNonKeyboardFocus
boolean
false
通过匹配 `:focus-visible` 选择器,防止在焦点非来自键盘时打开工具提示。如果希望在切换浏览器标签页或关闭 对话框时避免打开工具提示,此方法非常有用。
事件
事件名参数描述
update:open
boolean, reason?: PopperOpenChangeReason | undefined
当工具提示的打开状态发生变化时,会调用此事件处理程序。
escapeKeyDown
KeyboardEvent
当 Esc 键被按下时触发的事件处理程序。可被阻止。
pointerDownOutside
PointerDownOutsideEvent
当 `pointerdown` 事件发生在 `DismissableLayer` 外部时调用的事件处理程序。可被阻止。
focusOutside
FocusOutsideEvent
当焦点移出 `DismissableLayer` 时触发的事件处理程序。可被阻止。
interactOutside
PointerDownOutsideEvent | FocusOutsideEvent
当在 `DismissableLayer` 外部发生交互时触发的事件处理程序。具体而言,当 `pointerdown` 事件在该区域外部发生,或焦点移出该区域时触发。此事件可被阻止。
openAutoFocus
Event
在打开页面时自动聚焦时触发的事件处理程序。可被阻止。
closeAutoFocus
Event
在关闭时自动聚焦时触发的事件处理程序。可被阻止。
placed
—
—
插槽
插槽名参数描述
default
—
默认插槽的自定义内容。
trigger
—
触发槽的自定义内容。

TooltipPopup

1 属性
属性
属性名类型默认值描述
ariaLabel
string
—
默认情况下,屏幕阅读器会朗读组件内的内容。 如果描述不够详细,或者存在无法被朗读的内容,请使用 `aria-label` 作为更具 描述性的标签。

TooltipPortal

TooltipPositioner

23 属性7 事件
属性
属性名类型默认值描述
placement
Placement
undefined
浮动元素的位置。 若使用该属性,它将覆盖 `side` 和 `align` 属性。
side
Side
'bottom'
打开时优先渲染的触发器一侧。当发生碰撞且 enableAvoidCollisions 启用时,该方向将被反转。
sideOffset
number
0
距触发器的像素距离。
sideFlip
boolean
true
遇到边界时,请翻转至另一侧。
align
Align
'center'
首选与触发条件保持一致。若发生冲突,则可能调整。
alignOffset
number
0
相对于 `start` 或 `end` 对齐选项的像素偏移量。
alignFlip
boolean
true
当与边界发生冲突时,翻转对齐方式。 此情况仅在 `prioritizePosition` 为 true 时才会发生。
avoidCollisions
boolean
true
当值为 `true` 时,将覆盖“侧边”和“对齐”首选项,以避免与边界边缘发生冲突。
collisionBoundary
Element | (Element | null)[] | null
[ ]
用作碰撞边界的元素。默认情况下,该边界为视口,但您可以提供额外的 元素以纳入此检查范围。
collisionPadding
Padding
0
从边界边缘开始,碰撞检测应发生的距离(以像素为单位)。接受一个数字( 所有边均相同),或一个部分填充对象,例如:{ top: 20, left: 20 }。
arrowPadding
number
0
箭头与内容边缘之间的间距。如果您的内容使用了 border-radius,这将防止内容 溢出到角落。
hideShiftedArrow
boolean
true
当值为 `true` 时,若无法将箭头居中对齐 到引用元素上,则隐藏该箭头。
sticky
'partial' | 'always'
'partial'
在对齐轴上的“粘附”行为。`partial` 会在触发器至少部分位于边界内时将内容保留在边界内,而 “always” 则无论触发器是否位于边界内,都会将内容保留在边界内。
hideWhenDetached
boolean
false
当触发器被完全遮挡时,是否隐藏内容。
positionStrategy
'fixed' | 'absolute'
'fixed'
要使用的 CSS `position` 属性的类型。
updatePositionStrategy
'always' | 'optimized'
'optimized'
在每个动画帧中更新浮动元素位置的策略。
disableUpdateOnLayoutShift
boolean
false
当布局发生变化时,是否禁用内容的更新位置。
prioritizePosition
boolean
false
强制内容位于视口内。可能会与参考元素重叠,这可能并非预期效果。
reference
ReferenceElement
—
将作为浮动元素定位参考点的自定义元素或虚拟元素。如果 提供了该元素,它将替换默认的锚点元素。
trapFocus
boolean
modal
弹出窗口打开时,焦点是否被困在其中(Tab 键在层内循环,且 模态层的页面滚动被锁定)。
disableHoverableContent
boolean
false
当设置为 `true` 时,鼠标悬停会关闭弹出窗口而非保持其打开状态(宽限区域已禁用, 因此离开触发区域会立即关闭该层)。
onGracePointerExit
(() => void)
—
当指针最终离开宽限区域时触发的回调。允许上层组件(例如 Tooltip)在无需注册自己的第二个宽限区域的情况下,执行区域范围内的关闭逻辑。
forceMount
boolean
—
用于在需要更多控制时强制挂载。 在使用 Vue 动画库控制动画时非常有用。
事件
事件名参数描述
escapeKeyDown
KeyboardEvent
当 Esc 键被按下时触发的事件处理程序。可被阻止。
pointerDownOutside
PointerDownOutsideEvent
当 `pointerdown` 事件发生在 `DismissableLayer` 外部时调用的事件处理程序。可被阻止。
focusOutside
FocusOutsideEvent
当焦点移出 `DismissableLayer` 时触发的事件处理程序。可被阻止。
interactOutside
PointerDownOutsideEvent | FocusOutsideEvent
当在 `DismissableLayer` 外部发生交互时触发的事件处理程序。具体而言,当 `pointerdown` 事件在该区域外部发生,或焦点移出该区域时触发。此事件可被阻止。
openAutoFocus
Event
在打开页面时自动聚焦时触发的事件处理程序。可被阻止。
closeAutoFocus
Event
在关闭时自动聚焦时触发的事件处理程序。可被阻止。
placed
—
—

TooltipProvider

7 属性
属性
属性名类型默认值描述
delayDuration
number
150
从指针进入触发区域到工具提示打开所花费的时间。
skipDelayDuration
number
300
用户在触发延迟之前,有多少时间可以输入另一个触发条件。
disableHoverableContent
boolean
false
当设置为 `true` 时,尝试将鼠标悬停在内容上,当指针离开触发区域时,工具提示将关闭。
disableClosingTrigger
boolean
false
当值为 `true` 时,点击触发器不会关闭内容。
disabled
boolean
false
当值为 `true` 时,禁用工具提示
ignoreNonKeyboardFocus
boolean
false
通过匹配 `:focus-visible` 选择器,防止在焦点非来自键盘时打开工具提示。如果希望在切换浏览器标签页或关闭 对话框时避免打开工具提示,此方法非常有用。
positionerProps
TooltipPositionerProps
—
将传递给定位器的 props。当需要控制定位器时(例如在触发器禁用时禁用定位器),此功能非常有用。

TooltipRoot

11 属性1 事件
属性
属性名类型默认值描述
defaultOpen
boolean
—
工具提示在初始渲染时的打开状态。当您无需控制其打开状态时使用此选项。
open
boolean
—
工具提示的受控打开状态。
dir
Direction
—
—
modal
boolean
—
—
disabled
boolean
—
当值为 `true` 时,禁用工具提示
delayDuration
number
150
从指针进入触发区域到工具提示打开所花费的时间。
skipDelayDuration
number
300
用户在触发延迟之前,有多少时间可以输入另一个触发条件。
disableHoverableContent
boolean
false
当设置为 `true` 时,尝试将鼠标悬停在内容上,当指针离开触发区域时,工具提示将关闭。
disableClosingTrigger
boolean
false
当值为 `true` 时,点击触发器不会关闭内容。
ignoreNonKeyboardFocus
boolean
false
通过匹配 `:focus-visible` 选择器,防止在焦点非来自键盘时打开工具提示。如果希望在切换浏览器标签页或关闭 对话框时避免打开工具提示,此方法非常有用。
positionerProps
TooltipPositionerProps
—
将传递给定位器的 props。当需要控制定位器时(例如在触发器禁用时禁用定位器),此功能非常有用。
事件
事件名参数描述
update:open
boolean, reason?: PopperOpenChangeReason | undefined
当工具提示的打开状态发生变化时,会调用此事件处理程序。

TooltipTrigger

注意事项

架构与对标差异

TooltipCompact 负责触发器/定位器/弹层/箭头组合,所有基础组件保持零样式,仅由 UI 包装组件注入 tooltipVariants 类。这与 radix-ui/shadcn-ui 的 headless 分离一致,构建于共享 Popper 基础组件之上。Ant Design、Element Plus、Mantine、Naive UI 提供带 title/placement prop 的单一样式化提示;VeanUI 额外暴露逐槽 *Props、size 尺寸体系、箭头开关、带 ConfigProvider 全局默认的 delayDuration/skipDelayDuration 调节模型,以及无障碍的视觉隐藏 role="tooltip" 节点。

能力VeanUIshadcn/uiAnt Design TooltipElement Plus TooltipMantine TooltipNaive UI Tooltip
Aria/样式分离✅✅————
Popper 定位(12)✅✅✅✅✅✅
延迟调节✅✅—✅✅—
箭头✅✅————
尺寸(6)✅—————
焦点触发✅✅✅✅✅✅

— = 不支持或采用不同交互模型。

运行时注意

  • 提示在悬停与键盘焦点时打开;调节 delayDuration/skipDelayDuration(或 ConfigProvider 的 tooltip 默认)以减少误触发。
  • ignoreNonKeyboardFocus(默认)忽略非键盘焦点(如编程式),符合原生提示语义。
  • 弹层经 Portal 渲染(传送至 document.body);仅在 portalProps: { disabled: true } 时置于相对定位的祖先内。
  • showArrow 渲染箭头;arrowProps 可覆盖其位置/类。
  • 提示非模态、不陷阱焦点;Escape 或指针离开时关闭。

Roadmap

不适用——tooltip 对当前对标集已功能完备。

FAQ

如何给元素添加文字提示?

将元素包进 trigger 插槽并设置 content:

<STooltip content="删除此项">
  <template #trigger><SButton>删除</SButton></template>
</STooltip>

如何定位提示?

使用 placement:

<STooltip placement="top" content="复制">
  <template #trigger><SButton>复制</SButton></template>
</STooltip>

如何调整打开时机?

设置 delay-duration(毫秒),并用 skip-delay-duration 控制触发间隔:

<STooltip :delay-duration="150" :skip-delay-duration="50" content="保存">
  <template #trigger><SButton>保存</SButton></template>
</STooltip>

如何隐藏箭头?

设置 show-arrow={false}:

<STooltip :show-arrow="false" content="信息">
  <template #trigger><SButton>?</SButton></template>
</STooltip>

更新日志

版本记录按发布版本分组,便于快速查看这个组件在不同版本里的实际变更。

v0.20.0

2026-05-12

对比版本

优化

将 forwardedRootProps 重命名为 forwardedProps,以保持一致

范围: tooltip作者: soybeanjs查看提交ae39f

v0.19.0

2026-05-11

对比版本

新功能

添加 prioritizePosition 命题,以改进工具提示的定位

范围: tooltip作者: soybeanfe查看提交85b45

新功能

实施 TooltipCompact 组件

范围: tooltip作者: soybeanjs, CopilotKit, soybeanfe查看提交dbae3

v0.14.0

2026-04-03

对比版本

新功能

加强定位器道具和上下文整合

范围: tooltip作者: soybeanjs查看提交5ce78

v0.12.0

2026-03-07

对比版本

优化

在 TooltipPositioner 中为 avoidCollisions 添加默认道具;将 triggerProps 与 TooltipTrigger 绑定

范围: tooltip作者: soybeanjs查看提交e024c

v0.8.0

2026-02-10

对比版本

重构

简化 ariaLabel 计算并删除未使用的插槽

范围: tooltip作者: soybeanjs查看提交2fa29

v0.0.8

2026-01-01

对比版本

优化

移除 TooltipPositioner 上下文并更新相关组件,以提高清晰度和功能性

范围: tooltip作者: soybeanjs查看提交4d8da

重构

移除 TooltipContent,引入 TooltipPopup 和 TooltipPositioner 组件,并加强上下文管理以改进结构和功能

范围: tooltip作者: soybeanjs查看提交41a2d

v0.0.2

2025-11-18

对比版本

新功能

新增带提供者、触发器和内容实现的工具提示组件,以增强用户界面交互

范围: tooltip作者: soybeanjs查看提交a132b

新功能

添加滚动事件处理,以便在滚动时关闭工具提示,并优化清理管理

范围: tooltip作者: soybeanjs查看提交9b6de

新功能

实现 STooltip 组件,支持自定义定位、箭头功能和增强的主题样式

范围: tooltip作者: soybeanjs查看提交77bd5

样式

通过将 setElement 函数替换为回调处理程序,并引入 PopperContentWrapper 来优化结构,从而增强元素管理功能

范围: tooltip作者: soybeanjs查看提交13afb

样式

将 delayDuration 从 700 调整为 150,以提升工具提示的响应速度

范围: tooltip作者: soybeanjs查看提交51bbd

样式

将 TooltipProvider 替换为 TooltipOpenDelayed 上下文,并增强工具提示配置管理功能

范围: tooltip作者: soybeanjs查看提交0eda5

新功能

为提示框组件添加可选的 'content' 属性

范围: tooltip作者: soybeanjs查看提交9a5cc

新功能

新增带提供者、触发器和内容实现的工具提示组件,以增强用户界面交互

范围: tooltip作者: soybeanjs查看提交a132b

新功能

添加滚动事件处理,以便在滚动时关闭工具提示,并优化清理管理

范围: tooltip作者: soybeanjs查看提交9b6de

新功能

实现 STooltip 组件,支持自定义定位、箭头功能和增强的主题样式

范围: tooltip作者: soybeanjs查看提交77bd5

样式

通过将 setElement 函数替换为回调处理程序,并引入 PopperContentWrapper 来优化结构,从而增强元素管理功能

范围: tooltip作者: soybeanjs查看提交13afb

样式

将 delayDuration 从 700 调整为 150,以提升工具提示的响应速度

范围: tooltip作者: soybeanjs查看提交51bbd

样式

将 TooltipProvider 替换为 TooltipOpenDelayed 上下文,并增强工具提示配置管理功能

范围: tooltip作者: soybeanjs查看提交0eda5

新功能

为提示框组件添加可选的 'content' 属性

范围: tooltip作者: soybeanjs查看提交9a5cc