Popover

气泡卡片,点击/悬停/聚焦触发元素时弹出富内容浮层。封装 Tooltip(对齐 Semi 继承链),支持标题、12 方位 position、SVG 箭头、间距、custom 完全受控与 condition 条件触发,浮层命令式定位。

设计文档

如何引入

import { Popover } from '@chenzy-design/svelte';

基础使用

将触发器作为 children 用 Popover 包裹,浮层内容通过 content 传入,可承载比 Tooltip 更复杂的内容。

悬停此处

弹出位置

通过 position 设置浮层弹出方向,共支持 12 个方位。

TL
Top
TR
LT
Left
LB
RT
Right
RB
BL
Bottom
BR

受控显示

设置 trigger='custom',此场景下 Popover 的显示与否完全受 visible 控制。

condition 条件触发

condition={false} 时不响应 hover/click/focus 触发(custom 不受影响)。

condition

显示小三角

通过 showArrow 让 Popover 展示一个指向触发器的小三角,此模式下浮层有默认样式。

TL
Top
TR
BL
Bottom
BR

指向元素中心

showArrow=true 下传入 arrowPointAtCenter 使小三角始终指向元素中心。

TL
Top
TR

设置浮层背景色

通过 style 与 arrowStyle 定制浮层与小三角的背景色、边框色。

Colorful Popover

初始化弹出层焦点位置

click 触发的 dialog 模式打开后焦点自动进入浮层首个可交互元素(焦点陷阱)。

API 参考

Popover

Props

属性说明类型默认值
content浮层内容;Snippet 可接收 { initialFocusRef } 入参,绑定到浮层内元素打开时自动聚焦(对齐 Semi content 函数)string | Snippet<[{ initialFocusRef }]>undefined
title标题,提供则渲染标题区与下边框string | Snippetundefined
visible受控显隐(配合 trigger=custom)booleanundefined
defaultVisible非受控初始显隐booleanfalse
trigger触发方式;custom 完全受控(仅 visible + onVisibleChange);contextMenu 右键触发。click/custom → dialog role,hover/focus/contextMenu → tooltip role'hover'|'click'|'focus'|'custom'|'contextMenu''hover'
position弹出方位(Semi 12 方位命名 + 2 Over)'top'|'topLeft'|'topRight'|'left'|'leftTop'|'leftBottom'|'right'|'rightTop'|'rightBottom'|'bottom'|'bottomLeft'|'bottomRight'|'leftTopOver'|'rightTopOver''bottom'
autoAdjustOverflow视口溢出时翻转到对侧booleantrue
showArrow是否显示 SVG 小三角(对齐 Semi 默认 false)booleanfalse
arrowPointAtCenter小三角是否指向元素中心(需 showArrow)booleantrue
arrowStyle箭头颜色定制(border/bg/opacity){ borderColor?; backgroundColor?; borderOpacity? }undefined
spacing浮层与触发器距离(px),缺省按 showArrow 取 10 / 4(对齐 Semi SPACING_WITH_ARROW / SPACING)number | { x: number; y: number }showArrow ? 10 : 4
margin计算溢出翻转时增加的冗余安全边距number | { marginLeft; marginTop; marginRight; marginBottom }0
mouseEnterDelayhover 进入延迟(ms)number50
mouseLeaveDelayhover 离开延迟(ms)number50
conditionfalse 时不响应 hover/click/focus 触发(custom 不受影响)booleantrue
clickToHide点击浮层及内部任一元素时自动关闭booleanfalse
keepDOM关闭时保留浮层 DOM 不销毁(--hidden 隐藏)booleanfalse
disableFocusListenerhover 触发时不响应键盘 focus 显隐booleanfalse
disabled禁用触发booleanfalse
motion是否展示进出场动画,reduced-motion 退化booleantrue
getPopupContainer浮层挂载容器,缺省回退 ConfigProvider 全局,再回退 body() => HTMLElement | null | undefinedundefined
zIndex浮层 z-index(缺省走 token --cd-z-popover = 1030)numberundefined
closeOnEscEsc 关闭浮层booleantrue
guardFocus焦点处于浮层内时 Tab 是否循环(缺省随 dialog 模式)booleanrole==='dialog'
returnFocusOnClose关闭后焦点归还触发器(仅 guardFocus 时生效)booleantrue
stopPropagation阻止浮层上的点击事件冒泡booleanfalse
rePosKey更新该值手动触发浮层重新定位string | numberundefined
class浮层自定义类名string''
style浮层自定义内联样式string''
onVisibleChange显隐切换回调(visible: boolean) => voidundefined
onClickOutSide点击浮层与触发器外部的回调(仅 custom/click)(e: MouseEvent) => voidundefined
afterClose浮层完全关闭后的回调() => voidundefined
children触发元素(必填)Snippetundefined

Accessibility

ARIA roledialog | tooltip
键盘交互EscapeTabShift+Tab
  • role 派生:trigger=click/custom → dialog(承可交互富内容,aria-modal=false,有标题 aria-labelledby、无标题兜底 aria-label Popover.dialogLabel);hover/focus → tooltip
  • 触发元素在 dialog 模式承载 button 角色 + aria-haspopup=dialog / aria-expanded / aria-controls;tooltip 模式为纯 span + aria-describedby
  • click/custom 触发用 useDismiss 处理 Escape(closeOnEsc)与外部点击(onClickOutSide)关闭
  • dialog 模式 guardFocus 用 useFocusTrap 陷入焦点循环 Tab,关闭后 returnFocusOnClose 归还触发器
  • content 函数形态可将初始焦点落到 initialFocusRef 指定元素;condition=false 禁止一切自动触发(custom 不受影响)
  • 定位/触发/焦点/dismiss 复用 Tooltip(prefixCls=cd-popover 切换整套浮层类名前缀),对齐 Semi Popover extends Tooltip;箭头为 Popover 独立双 path SVG(描边+背景,8px),与 Tooltip 单 path 解耦

设计变量

变量默认值用法
--cd-color-popover-arrow-bg var(--cd-color-bg-3)箭头默认背景色
--cd-color-popover-arrow-border var(--cd-color-border)箭头描边颜色
--cd-color-popover-bg-default var(--cd-color-bg-3)默认背景色
--cd-color-popover-border-default var(--cd-color-border)默认描边颜色