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

Popover

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

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

快速跳转

同分类组件

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

弹出层

概述

用于在 portal 中展示与触发元素相关联的丰富内容,由按钮触发。SPopover 组合 Aria PopoverRoot/PopoverTrigger/PopoverPositioner/PopoverPopup/PopoverArrow/PopoverClose 基础组件家族(构建于共享 Popper + dialog 式可关闭/焦点层之上)与 popoverVariants 样式配方(5 个槽、6 种尺寸)。

弹出层适合非关键、上下文相关的丰富内容(操作菜单、设置、帮助)。导航菜单请用 dropdown-menu;小的悬停提示请用 tooltip;阻塞性确认请用 popconfirm 或 dialog。

用法

特性

  • 🧩 Aria/样式分离 — PopoverCompact 聚合 popper 定位器、弹层、箭头与关闭;SPopover 只注入样式并转发插槽/事件
  • 🎯 定位 — 完整 popper placement 控制(12 个方向),带碰撞避免与按侧滑入动画
  • 🎭 模态切换 — modal 控制外部指针拦截、useHideOthers、body 滚动锁定与焦点陷阱
  • 🔽 箭头 — showArrow 渲染定位箭头;经 arrowProps 可配置
  • ❌ 可关闭 — 可选 close 插槽,内置 lucide:x 图标;Escape 与外部交互关闭
  • 📐 6 种尺寸 — xs–2xl size;逐槽 ui 覆盖
  • ♿ 无障碍 — role="dialog"、焦点陷阱 + 循环、带 aria-label 的关闭按钮、axe-core 零违规

组件家族

  • SPopover(样式层)— 入口包装组件;popoverVariants 配方配合动态插槽转发
  • PopoverRoot(Aria)— 状态持有者;经 useControllableState 维护 open,提供 dir/modal/disabled 与 popper root
  • PopoverTrigger(Aria)— 切换弹出层的 Button
  • PopoverPositioner / PopoverPositionerImpl(Aria)— 焦点陷阱、可关闭、定位表面(构建于 PopperPositioner)
  • PopoverPopup(Aria)— 弹层主体
  • PopoverArrow(Aria)— popper 箭头
  • PopoverClose(Aria)— 关闭 <button>,发出 close 并切换 open
  • PopoverCompact(Aria)— 聚合组件;组合定位器/弹层/箭头/关闭并暴露各插槽

演示

基础

API

Aria 层

10

Popover

16 属性8 事件3 插槽
属性
属性名类型默认值描述
class
ClassValue
—
弹出窗口类
size
ThemeSize
—
组件的视觉尺寸。
ui
Partial<PopoverUi>
—
该组件的按槽类重写。
placement
import("@/index").Placement
—
位置。
showArrow
boolean
—
是否显示箭头。
triggerProps
PopoverTriggerProps
—
转发给触发元素的属性。
portalProps
PopoverPortalProps
—
转发给 portal 元素的属性。
positionerProps
PopoverPositionerProps
—
转发给定位器元素的属性。
popupProps
PopoverPopupProps
—
转发给弹出窗口元素的属性。
arrowProps
PopoverArrowProps
—
转发给箭头元素的属性。
closeProps
PopoverCloseProps
—
转发至 close 元素的属性。
dir
Direction
—
—
open
boolean
—
—
defaultOpen
boolean
—
—
modal
boolean
—
—
disabled
boolean
—
—
事件
事件名参数描述
update:open
boolean
当对话框的打开状态发生变化时调用的事件处理程序。
escapeKeyDown
KeyboardEvent
当 Esc 键被按下时触发的事件处理程序。可被阻止。
pointerDownOutside
PointerDownOutsideEvent
当 `pointerdown` 事件发生在 `DismissableLayer` 外部时调用的事件处理程序。可被阻止。
focusOutside
FocusOutsideEvent
当焦点移出 `DismissableLayer` 时触发的事件处理程序。可被阻止。
interactOutside
PointerDownOutsideEvent | FocusOutsideEvent
当在 `DismissableLayer` 外部发生交互时触发的事件处理程序。具体而言,当 `pointerdown` 事件在该区域外部发生,或焦点移出该区域时触发。此事件可被阻止。
openAutoFocus
Event
在打开页面时自动聚焦时触发的事件处理程序。可被阻止。
closeAutoFocus
Event
在关闭时自动聚焦时触发的事件处理程序。可被阻止。
placed
—
—
插槽
插槽名参数描述
default
{ open: boolean; close: () => void; }
默认插槽的自定义内容。
trigger
—
触发槽的自定义内容。
close
—
close 插槽的自定义内容。

PopoverAnchor

PopoverArrow

PopoverClose

4 属性1 事件
属性
属性名类型默认值描述
type
ButtonType
'button'
按钮元素的类型。可以是 'button'、'submit' 或 'reset' 之一。
disabled
boolean
—
该组件是否已禁用。
asChild
boolean
—
将默认渲染元素替换为作为子元素传递的元素,并合并两者的属性及行为。
as
AsTag | Component
'div'
该组件应渲染为的元素或组件。可通过 `asChild` 进行覆盖。
事件
事件名参数描述
close
PointerEvent
在关闭时触发。

PopoverCompact

13 属性8 事件3 插槽
属性
属性名类型默认值描述
placement
import("@/index").Placement
—
位置。
showArrow
boolean
—
是否显示箭头。
triggerProps
PopoverTriggerProps
—
转发给触发元素的属性。
portalProps
PopoverPortalProps
—
转发给 portal 元素的属性。
positionerProps
PopoverPositionerProps
—
转发给定位器元素的属性。
popupProps
PopoverPopupProps
—
转发给弹出窗口元素的属性。
arrowProps
PopoverArrowProps
—
转发给箭头元素的属性。
closeProps
PopoverCloseProps
—
转发至 close 元素的属性。
dir
Direction
—
—
open
boolean
—
—
defaultOpen
boolean
—
—
modal
boolean
—
—
disabled
boolean
—
—
事件
事件名参数描述
update:open
boolean
当对话框的打开状态发生变化时调用的事件处理程序。
escapeKeyDown
KeyboardEvent
当 Esc 键被按下时触发的事件处理程序。可被阻止。
pointerDownOutside
PointerDownOutsideEvent
当 `pointerdown` 事件发生在 `DismissableLayer` 外部时调用的事件处理程序。可被阻止。
focusOutside
FocusOutsideEvent
当焦点移出 `DismissableLayer` 时触发的事件处理程序。可被阻止。
interactOutside
PointerDownOutsideEvent | FocusOutsideEvent
当在 `DismissableLayer` 外部发生交互时触发的事件处理程序。具体而言,当 `pointerdown` 事件在该区域外部发生,或焦点移出该区域时触发。此事件可被阻止。
openAutoFocus
Event
在打开页面时自动聚焦时触发的事件处理程序。可被阻止。
closeAutoFocus
Event
在关闭时自动聚焦时触发的事件处理程序。可被阻止。
placed
—
—
插槽
插槽名参数描述
default
{ open: boolean; close: () => void; }
默认插槽的自定义内容。
trigger
—
触发槽的自定义内容。
close
—
close 插槽的自定义内容。

PopoverPopup

PopoverPortal

PopoverPositioner

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
—
—

PopoverRoot

5 属性1 事件
属性
属性名类型默认值描述
dir
Direction
—
—
open
boolean
—
—
defaultOpen
boolean
—
—
modal
boolean
—
—
disabled
boolean
—
—
事件
事件名参数描述
update:open
boolean
当对话框的打开状态发生变化时调用的事件处理程序。

PopoverTrigger

4 属性
属性
属性名类型默认值描述
type
ButtonType
'button'
按钮元素的类型。可以是 'button'、'submit' 或 'reset' 之一。
disabled
boolean
—
该组件是否已禁用。
asChild
boolean
—
将默认渲染元素替换为作为子元素传递的元素,并合并两者的属性及行为。
as
AsTag | Component
'div'
该组件应渲染为的元素或组件。可通过 `asChild` 进行覆盖。

注意事项

架构与对标差异

PopoverCompact 负责定位器/弹层/箭头/关闭组合,所有基础组件保持零样式,仅由 UI 包装组件注入 popoverVariants 类。这与 radix-ui/shadcn-ui 的 headless/样式分离一致,构建于共享 Popper 基础组件之上。Ant Design、Element Plus、Mantine、Naive UI 提供带 placement/trigger/width prop 的单一样式化弹出层;VeanUI 额外暴露逐槽 *Props、size 尺寸体系、箭头开关与单包库弹出层通常缺失的 modal 模式。

能力VeanUIshadcn/uiAnt Design PopoverElement Plus PopoverMantine PopoverNaive UI Popover
Aria/样式分离✅✅————
Popper 定位(12)✅✅✅✅✅✅
箭头✅✅————
模态模式✅✅————
关闭按钮✅✅————
尺寸(6)✅—————
焦点陷阱 + 循环✅✅————

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

运行时注意

  • PopoverRoot 默认模态(true):打开时拦截外部指针事件并锁定 body 滚动。传 modal={false} 获得轻量、非阻塞的弹出层。
  • 弹层经 Portal 渲染(传送至 document.body);仅在 portalProps: { disabled: true } 时置于相对定位的祖先内。
  • showArrow 渲染箭头;arrowProps 可覆盖其位置/类。
  • 提供 close 插槽以显示关闭控件;默认使用 lucide:x 图标。
  • 与 tooltip 不同,弹出层不会在指针离开时自动关闭;它会保持打开直至被关闭。

Roadmap

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

FAQ

如何定位弹出层?

使用 placement(来自 popper),例如 top、bottom-start、right-end:

<SPopover placement="top">
  <template #trigger><SButton>信息</SButton></template>
</SPopover>

如何添加关闭按钮?

提供 close 插槽:

<SPopover>
  <template #trigger><SButton>更多</SButton></template>
  <template #close>关闭</template>
</SPopover>

如何制作非阻塞弹出层?

设置 modal={false}:

<SPopover :modal="false">
  <template #trigger><SButton>打开</SButton></template>
</SPopover>

如何控制打开状态?

用 v-model 绑定 open 或使用 defaultOpen:

<SPopover v-model:open="open">
  <template #trigger><SButton>打开</SButton></template>
</SPopover>

更新日志

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

v0.50.0

2026-10-02

对比版本

新功能

为 avoidCollisions 和 prioritizePosition 添加默认属性

范围: popover作者: soybeanjs查看提交f86de

新功能

为 avoidCollisions 和 prioritizePosition 添加默认属性

范围: popover作者: soybeanjs查看提交f86de

v0.19.0

2026-05-11

对比版本

新功能

添加 prioritizePosition 命题,改进定位控制

范围: popover作者: soybeanfe查看提交0bc99

修复

将 slotProps 与 PopoverCompact 模板中的插槽绑定

范围: popover作者: soybeanfe查看提交ba82c

优化

简化弹出窗口组件结构,增强关闭功能

范围: popover作者: soybeanfe查看提交f9d63

优化

简化 PopoverTrigger 中的组件结构

范围: popover作者: soybeanfe查看提交f1764

v0.17.0

2026-05-03

对比版本

优化

增强弹出式组件的上下文和道具

范围: popover作者: soybeanjs查看提交f6666

v0.16.0

2026-05-01

对比版本

新功能

为 Card、Popover、Editable、HoverCard、NavigationMenu、Pagination 和 Stepper 实现紧凑型组件

范围: components作者: soybeanjs查看提交6cbdc

v0.12.0

2026-03-07

对比版本

新功能

添加 PopoverCloseEmits 和 beforeClose 命题;更新 PopoverPositioner 默认命题

范围: popover作者: soybeanjs查看提交08e1c

v0.0.17

2026-01-19

对比版本

修复

为 PopoverPositionerImpl 添加 disable-outside-pointer-events 绑定

范围: popover作者: soybeanjs查看提交1c945

v0.0.8

2026-01-01

对比版本

优化

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

范围: popover作者: soybeanjs查看提交de4b4

重构

移除 PopoverContent,引入 PopoverPositioner 和 PopoverPopup 组件,并加强上下文管理以改进结构和功能

范围: popover作者: soybeanjs查看提交2eb9c

v0.0.2

2025-11-18

对比版本

新功能

新增 Popover 组件,支持触发器、内容及上下文管理,以增强 UI 交互体验

范围: popover作者: soybeanjs查看提交b14c6

新功能

引入 SPopover 组件,支持自定义定位和主题样式

范围: popover作者: soybeanjs查看提交902c0

新功能

添加 close 方法并将其传递给插槽,以改进弹出框控件

范围: popover作者: soybeanjs查看提交d4520

新功能

为 popper-content 组件新增 'sideFlip' 和 'alignFlip' 属性

范围: popover作者: soybeanjs查看提交d8115

重构

集成 useBodyScrollLock 以改进模态框行为,并增强焦点管理

范围: popover作者: soybeanjs查看提交2c757

重构

通过 onWatcherCleanup 优化组件导入并增强清理管理

范围: popover作者: soybeanjs查看提交78af9

重构

通过将 setElement 函数替换为支持回调的方式,简化弹出框上下文和组件中的元素处理流程

范围: popover作者: soybeanjs查看提交4bba4

新功能

新增 Popover 组件,支持触发器、内容及上下文管理,以增强 UI 交互体验

范围: popover作者: soybeanjs查看提交b14c6

新功能

引入 SPopover 组件,支持自定义定位和主题样式

范围: popover作者: soybeanjs查看提交902c0

新功能

添加 close 方法并将其传递给插槽,以改进弹出框控件

范围: popover作者: soybeanjs查看提交d4520

新功能

为 popper-content 组件新增 'sideFlip' 和 'alignFlip' 属性

范围: popover作者: soybeanjs查看提交d8115

重构

集成 useBodyScrollLock 以改进模态框行为,并增强焦点管理

范围: popover作者: soybeanjs查看提交2c757

重构

通过 onWatcherCleanup 优化组件导入并增强清理管理

范围: popover作者: soybeanjs查看提交78af9

重构

通过将 setElement 函数替换为支持回调的方式,简化弹出框上下文和组件中的元素处理流程

范围: popover作者: soybeanjs查看提交4bba4