Skyroc UI
弹层覆盖

Popover

点击触发的轻量浮层容器,用于承载表单、操作和补充内容

Popover 用于在触发元素附近展示可交互浮层。组件基于 Radix Popover 封装,提供触发器、内容容器、Portal、箭头、关闭按钮、受控状态和定位能力。

import {
  Popover,
  PopoverAnchor,
  PopoverArrow,
  PopoverContent,
  PopoverRoot,
  PopoverTrigger
} from '@skyroc/web-ui';

何时使用

  • 需要点击按钮、图标或文本后展示一块可交互内容。
  • 浮层里需要放置表单、筛选项、快捷设置或简短操作。
  • 内容和触发元素关系明确,但不需要阻断页面流程。
  • 只展示悬停信息时使用 HoverCard 或 Tooltip;需要强确认或复杂流程时使用 Dialog。

基础用法

通过 trigger 提供触发元素,children 作为浮层内容。默认内容会通过 Portal 渲染,并带有边框、阴影和进入/退出动画。

Preview
Code
Loading...
<Popover trigger={<Button>Open Popover</Button>}>
  <div>Popover content</div>
</Popover>

位置与箭头

通过 side 控制浮层位置,通过 showArrow 显示指向触发元素的箭头。sidealignsideOffset 等定位属性会传递给内容容器。

Preview
Code
Loading...
<Popover
  showArrow
  side="right"
  sideOffset={8}
  trigger={<Button>Open</Button>}
>
  <div>Content</div>
</Popover>

受控状态

通过 openonOpenChange 控制打开状态;非受控模式使用 defaultOpen

Preview
Code
Loading...
const [open, setOpen] = useState(false);

<Popover open={open} onOpenChange={setOpen} trigger={<Button>Open</Button>} />

关闭按钮

通过 closeIcon 放置自定义关闭元素。该元素会通过 Radix Close asChild 绑定关闭行为。

Preview
Code
Loading...
<Popover
  closeIcon={<Button variant="ghost">Close</Button>}
  trigger={<Button>Open</Button>}
>
  <div>Closable content</div>
</Popover>

尺寸

通过 size 调整内容区 padding、字号和箭头尺寸,从 xs2xl 共 6 个尺寸。

Preview
Code
Loading...
尺寸内容间距字号适用场景
xsp-310px紧凑说明、表格内嵌
smp-3.512px小型提示、工具设置
mdp-414px常规场景(默认)
lgp-4.516px操作表单、设置面板
xlp-518px强调内容
2xlp-5.520px大号浮层内容

API

Popover

通用属性参考:组合 Radix Popover Root、Portal 和 Content,并提供高层 triggercloseIconshowArrow 封装。

属性说明类型默认值
trigger*触发 Popover 打开的元素,主组件用法中必须提供ReactNode-
children浮层内容ReactNode-
open受控模式下的打开状态boolean-
defaultOpen非受控模式下的默认打开状态boolean-
onOpenChange打开状态变化时触发(open: boolean) => void-
modal是否使用模态交互模式boolean-
side浮层相对触发元素的位置'top' | 'right' | 'bottom' | 'left'-
align浮层相对触发元素的对齐方式'start' | 'center' | 'end'-
sideOffset浮层和触发元素之间的距离number5
alignOffset沿对齐轴偏移的距离number-
avoidCollisions是否启用碰撞检测以避免浮层超出视口booleantrue
showArrow是否显示指向触发元素的箭头booleanfalse
arrowWidth箭头宽度,透传给 PopoverArrownumber-
arrowHeight箭头高度,透传给 PopoverArrownumber-
arrowProps传递给 PopoverArrow 的额外 props,仅 showArrow 为 true 时生效PopoverArrowProps-
closeIcon自定义关闭元素,会通过 Radix Close asChild 绑定关闭行为ReactNode-
contentProps传递给 PopoverContent 的额外 propsPopoverContentProps-
anchorProps传递给 PopoverAnchor 的额外 propsPopoverAnchorProps-
containerPortal 挂载容器HTMLElement-
disabledPortal是否禁用 Portal,直接在当前位置渲染内容booleanfalse
forceMount强制挂载 Portaltrue-
forceMountPortal强制挂载 Portal 的别名字段true-
size尺寸,影响内容区 padding、字号和箭头尺寸'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl''md'
className内容容器 class;优先级高于 classNames.content 和 contentProps.classNameClassValue-
classNames各 slot 的自定义 class(anchor / content / arrow)PopoverClassNames-

结构组件

Popover 同时导出 Radix 风格结构组件,适合需要完全手动组织 Root、Trigger、Content 和 Portal 时使用。

属性说明类型默认值
PopoverRootRadix Popover Root 原语radix primitive-
PopoverTriggerRadix Popover Trigger 原语radix primitive-
PopoverPortalRadix Popover Portal 原语radix primitive-
PopoverAnchor锚点元素,用于定位但不触发打开行为PopoverAnchorProps-
PopoverContent浮层内容容器PopoverContentProps-
PopoverArrow浮层箭头PopoverArrowProps-

类型

PopoverProps

主组件属性。组合 Radix Root、Portal、Content props,并增加 trigger、箭头和关闭元素等高层封装。

字段类型说明
trigger*ReactNode触发打开的元素。
childrenReactNode浮层内容。
openboolean受控打开状态。
defaultOpenboolean默认打开状态。
onOpenChange(open: boolean) => void打开状态变化回调。
modalboolean是否使用模态交互模式。
side'top' | 'right' | 'bottom' | 'left'浮层位置。
align'start' | 'center' | 'end'浮层对齐方式。
sideOffsetnumber浮层和触发元素之间的距离。
alignOffsetnumber沿对齐轴偏移的距离。
avoidCollisionsboolean是否启用碰撞检测。
showArrowboolean是否显示箭头。
arrowWidthnumber箭头宽度。
arrowHeightnumber箭头高度。
arrowPropsPopoverArrowProps箭头组件属性。
closeIconReactNode关闭元素。
contentPropsPopoverContentProps内容容器属性。
anchorPropsPopoverAnchorProps锚点属性。
containerHTMLElementPortal 挂载容器。
disabledPortalboolean是否禁用 Portal。
forceMounttrue强制挂载 Portal。
forceMountPortaltrue强制挂载 Portal 的别名字段。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'组件尺寸。
classNameClassValue内容容器 class。
classNamesPopoverClassNamesslot class 配置。

PopoverClassNames

Popover 各 slot 的自定义 class。

字段类型说明
anchorClassValue锚点容器 class。
contentClassValue内容容器 class。
arrowClassValue箭头 class。

PopoverContentProps

浮层内容容器属性,继承 Radix Popover Content props,并增加项目尺寸和 className 类型。

字段类型说明
childrenReactNode内容节点。
classNameClassValue内容容器 class。
side'top' | 'right' | 'bottom' | 'left'浮层位置。
align'start' | 'center' | 'end'浮层对齐方式。
sideOffsetnumber浮层和触发元素之间的距离。默认 5。
alignOffsetnumber沿对齐轴偏移的距离。
avoidCollisionsboolean是否启用碰撞检测。默认 true。
collisionPaddingnumber | side padding object碰撞检测时和边界之间保留的距离。
onEscapeKeyDown(event) => void按 Escape 时触发。
onPointerDownOutside(event) => void在浮层外按下指针时触发。
onFocusOutside(event) => void焦点移出浮层时触发。
onInteractOutside(event) => void浮层外发生交互时触发。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'内容尺寸。

PopoverArrowProps

箭头属性,继承 Radix Popover Arrow props,并增加项目尺寸和 className 类型。

字段类型说明
classNameClassValue箭头 class。
widthnumber箭头宽度。
heightnumber箭头高度。
asChildboolean使用子元素替代默认箭头元素。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'箭头尺寸。

PopoverAnchorProps

锚点属性,继承 Radix Popover Anchor props,并增加项目尺寸和 className 类型。

字段类型说明
childrenReactNode锚点内容。
classNameClassValue锚点 class。
asChildboolean使用子元素作为锚点。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'类型继承字段,当前锚点样式不直接使用。

ClassValue

CSS 类名类型

string | null | undefined | Record<string, boolean> | ClassValue[]

On this page