Popover 使用手册
v3.1.1 · @snowui-design-system/components
许可阅读:首次阅读组件文档、源码或 npm 使用流程,先读完整 LICENSE;同任务同版本去重。公开 API 配置与内部实现修改分别按许可处理;全部组件使用统一运行包,源码权益以许可为准。
组件介绍
在触发器附近展示补充内容或操作,支持不同尺寸与触发方式,适合快捷操作和轻量交互面板。
使用选择
用于与触发锚点相关的浮层内容。短文本提示用 Tooltip,需要对话框焦点流程用 Dialog;关闭行为使用公开 closeOn。
as="popover" 放在触发宿主内可自动关联锚点;静态模式可用 bind:open 手动控制。
trigger 控制触发方式,closeOn 控制关闭策略;需要持续显示的交互示例可设置 closeOn="manual"。
快速开始
以下示例展示推荐的基本组合。更多场景与组合限制见后文。
API
未重新声明的继承能力请查所属基础组件文档;本表只列本组件源码具名公开属性。
使用边界与详细说明
三种模式 (Modes)
Popover 同时支持三种使用模式:面板模式 (Panel)、内嵌模式 (Inline)、模版模式 (Template)。
1. 面板模式 (Panel Mode) — 默认
不带 as 也不带 template,Popover 直接作为面板渲染。适用于自由组合搜索浮层、菜单浮层等场景(SP-02 风格)。
2. 内嵌模式 (Inline Mode) — 推荐用于"按钮即触发"场景
as="popover" 标记后放入任意宿主元素(Button / Frame / Icon 等)内,Popover 自动:
找到父元素作为 anchor
按
trigger="click|hover"绑定父元素事件Portal 渲染浮层到 body,带 8px offset 和视口避让
无需 id,无需 data-popover-target,无需手写事件回调。参考 Tooltip A1 写法。
3. 模版模式 (Template Mode) — 用于跨组件激活 / 多触发器共享
通过 template + id 注册,再用 showPopover(id, anchorEl) 或声明式属性 data-popover-target="id" 激活。触发按钮独立于 Popover,通过 ID 关联(参考 Toast TS-10)。
模式选择速查
布局模型
主布局模型:复合管理布局。
模版模式:仅承载注册和 Portal 浮层渲染;触发器由调用方独立提供。
静态模式:Popover 作为面板自身渲染。
面板内容默认
column纵向排列,gap: 0,由用户自由组合内容(MenuItem、Text、Frame 等)。浮层位置、层级、显隐、视口碰撞避让属于组件私有管理逻辑。
浮层结构(固定头部 + 独立滚动 body)
Popover 与 Listbox 共用同一套 header + scroll-body 结构,所有浮层视觉与滚动行为保持一致:
通过
LISTBOX_HEADER_PORTAL_KEYcontext 暴露headerEl;<Input as="search">与<SearchInput>(默认as="search")挂载后由 Input 自身的$effect自动appendChild至 header,不参与下方滚动。浮层根
SnowFrame显式传enableAutoLayout={false}:面板自身负责display:flex; flex-direction:column; gap:0,不接入[data-auto-layout]的默认gap-2,确保 header→body 间距完全由 headerpadding-bottom控制(4px)。header 内有内容时由共享基类
.snowui-quick-action-panel-header:not(:empty)提供padding-bottom: var(--padding-1)(4px),作为搜索框与列表的视觉间距;禁止在组件内再写margin/gap复制该 4px。body
flex: 1; min-height: 0,滚动 viewport 复用.snowui-overlay-scrollbar-viewport(overflow:scroll + scrollbar-width:none);Thumb 通过useOverlayScrollbarhook 计算位置。头部输入框样式:Input 内统一选择器
:where(.snowui-quick-action-panel-header > .snowui-input, ...)注入紧凑padding/gap/radius并在:focus-within关闭外环(--snowui-field-focus-ring-width: 0rem);用户无需在外部覆盖。浮层滚动条 thumb 右边缘距面板内边框 4px(滚动条规范)。由于 scrollbar 在 body 内绝对定位且面板
box-sizing: border-box,offset 需抵消面板自身padding:sm padding=12 → right:-8px、md padding=16 → right:-12px、lg padding=24 → right:-20px。三档 size 已在组件内分别声明,新增 size 时需同步。
尺寸
触发(模版模式)
click(默认):点击触发器切换 Popover 显隐
hover:hover 触发器后延迟
450ms出现;移出触发器和浮层后80ms关闭。首次 hover 延迟与 Tooltip 统一;Popover 不参与 Tooltip 的300ms快速切换窗口。
关闭
closeOn="outside"(默认):点击 Popover 外区域关闭closeOn="manual":仅由 Popover 内按钮调用hidePopover(id)或bind:open=false关闭Escape:
closeOnEscape={true}(默认)时无论哪种关闭模式都可按 Escape 关闭
定位
默认首选方位 bottom,距触发器 8px。未配置 placement 或发生视口碰撞时,按 首选 → 相反方向 → 垂直/水平候选 顺序选择可见方位,确保浮层不会出现在可视区域外。
命令式 API
定义在 ../logic/popover.svelte.ts,完整文档见 ../logic/popover.md(源码参考:components/src/logic/popover.md)。
模版 + 点击触发
模版 + hover 触发 + 中尺寸
模版 + 手动关闭
静态模式(SP-02 风格搜索浮层组合)
合并说明
QuickAction 与 SearchPopup 源码组件已删除;SP-02 示例迁移到 组件示例中保留为搜索浮层组合参考。
2026-10-07 新增的 区块 SearchPopup 是基于 Popover 的搜索输入与分组结果组合,不恢复旧 SearchPopup 浮层实现;SP-02 现在消费该区块。
1. 模版宿主(模版模式)
<Popover template id="X">不渲染任何 DOM,仅向 store 注册配置和内容通过
showPopover(id, anchorEl)或data-popover-target="id"激活同一 id 同时只能有一个活跃实例;后续 show 调用替换 anchor
2. 浮层面板 .snowui-popover
复用
.snowui-quick-action-panelposition: fixed,z-index: 1000gap: 0,内容由用户自由组合padding/border-radius按 size 切档
3. 触发器约定
触发器为任意可交互元素(Button、Icon、Frame 等),不再由 Popover 包裹
通过
data-popover-target="id"或onclick={() => showPopover(id, e.currentTarget)}关联
连续 Hover
continuousHover 默认 true,作用于滚动内容区的直接 MenuItem。单一背景层在 菜单项之间连续移动;false 恢复 MenuItem 原有逐项 hover。嵌套 Listbox 使用自己 最近的连续 hover 容器,不由 Popover 越界接管。
Popover 样式覆盖
先阅读 完整 LICENSE;同任务、同版本、同范围去重。
优先用组件公开 Props 匹配合适样式,尽可能保留原有视觉。确需改写时按 样式选择与改写顺序 使用自己的 class(含项目已有 Tailwind)或实例 style。以下名称来自源码实际消费的公开 override;先核对目标作用域,不修改私有 DOM。采用 SnowUI Token 时选择正确类别,外部应用不被要求安装一方 utilities。
Popover 类型与状态
必填属性:无具名必填属性。
可双向绑定:bind:open。
继承声明:Omit<FrameProps, "children">。继承能力以基类公开文档为准;Omit 中的字段已排除,不能按基类原样使用。
以下为公开属性实际引用的类型声明,来自源码;Svelte Snippet 表示内容片段,ComponentProps 表示对应组件的 Props。
PopoverSize
来源:components/src/logic/popover.svelte.ts
PopoverTrigger
来源:components/src/logic/popover.svelte.ts
PopoverPlacement
来源:components/src/logic/popover.svelte.ts
PopoverCloseMode
来源:components/src/logic/popover.svelte.ts