Skip to content

Popover 气泡卡片

点击 / 悬停 / 聚焦触发,可承载标题、正文与自定义内容的浮层面板。支持 12 向放置、双轴偏移、开合动画、portal、modal 化与嵌套浮层。

基础用法

点击触发

点击打开

放置方向

placement 支持 12 向:四基向 top / bottom / left / right 各配 -start / -end 交叉轴对齐(bottom-start 面板左缘对齐触发元素左缘,是最常见形态)。空间不足沿主轴翻转时对齐后缀保留(bottom-starttop-start),对齐后仍做视口夹取。

四个方向

12 向放置(-start / -end)

bottom-startbottom-endright-starttop-end

触发方式

trigger 控制触发方式:click(默认)/ hover / focus / contextmenu / manual,空格分隔可多选(如 "click hover")。hover 触发时 hover-delay / hover-hide-delay 控制开合防抖延时(默认 150 / 100ms,无延时 hover 会闪开闪关);悬停区域为触发元素 + 浮层面板(跨间隙移动不闪关)。manual 模式不绑定任何宿主事件,显隐完全由宿主 open 控制。

悬停触发

悬停打开点击或悬停右键打开

自定义开合延时

hover-delay=400hover-hide-delay=400

通用显隐延迟(open-delay / close-delay)

open-delay=400close-delay=400

禁用

disabled 禁用整个 popover:点击 / 悬停 / 聚焦 / 右键 / 按键触发均不响应,宿主降饱和(opacity .6)并同步 aria-disabled。禁用触发元素(如原生 disabled button)不会派发鼠标事件,可在外层包一层 span 再挂 popover(B12 兼容方案)。

整体禁用

禁用(click)禁用(hover)

宽度定制

width 控制面板宽度:数字(px)、"trigger"(与触发元素同宽)或任意 CSS 值(如 50%)。width="trigger" 适合「面板与触发控件等宽」的下拉选择形态。

宽度定制(width)

width="280"width="trigger"(220px)width="50%"

偏移与碰撞细调

offset 双轴偏移:"主轴距离""主轴距离, 交叉轴偏移"(默认 8, 0)。碰撞细调:collision-padding 视口夹取边距(默认 4px);fallback-placements 自定义回退序列(请求放不下时按序列逐一尝试);hide-when-detached 锚点完全脱离视口时隐藏面板。

双轴偏移(offset)

offset="12, 20"offset="16"

碰撞细调(collision-padding / fallback-placements / hide-when-detached)

collision-padding=20fallback-placementshide-when-detached

初始焦点与键盘

focus-on-open 打开时焦点移入面板内首个可聚焦元素;initial-focus 指定选择器精确聚焦(优先级更高,解析不到回落 focus-on-open)。trigger-keys 指定按键在触发元素聚焦时切换开合(空格分隔多键)。

指定初始焦点(initial-focus)

打开(焦点落在输入框)

打开后焦点直接进入下面的输入框:

按键打开(trigger-keys)

聚焦后按 Enter

Portal 挂载点

append-to 把面板移到宿主容器之外(body 或选择器),避免被宿主容器的 overflow: hidden / clip 裁剪;定位基于视口坐标,移出后不受影响。面板移出 shadow 后点击面板内部仍不触发外部点击关闭。

Portal 挂载(append-to)

打开 Portal 面板

箭头与视口自动调整

默认显示指向触发元素边缘的箭头;arrow="false" 隐藏箭头;arrow-point-at-center 让箭头指向触发元素中心(视口边缘避让导致面板偏移时,箭头仍指向锚点中心)。默认空间不足时自动沿主轴翻转并避让视口边缘;auto-adjust-overflow="false" 关闭自动调整,面板保持声明 placement(可能溢出视口)。

箭头显隐与指向

默认无箭头指向中心

箭头与角融合(arrow-merge)

bottom-start 融合对照

关闭自动调整

关闭自动调整

自定义内容

自定义内容(slot=content)

打开面板
通过 slot="content" 可以放置任意自定义内容。

关闭按钮与声明式关层

closable 在面板右上角显示关闭按钮(part="close"),点击关闭并还原焦点。内容里任意元素加 data-popover="close" 即声明式关层——点击它关闭 popover(适合「确定 / 知道了」类操作按钮)。

关闭按钮与声明式关层

closable面板内按钮关层
知道了

颜色变体

color 语义色变体:primary / success / warning / danger——面板 tint 底 + 语义色描边(含箭头),全部由 token 派生(dark 主题自动适配)。

颜色变体(color)

primarysuccesswarningdanger

开合动画

面板打开 / 关闭播放 fade + scale 动画,transform-origin 随放置方向感知(从「对着触发元素的那条边」向外展开,-start/-end 贴到对齐边)。prefers-reduced-motion 下自动停用动画。

开合动画(方向感知)

打开试试右侧展开

内容实时与自动关闭

默认(无 fresh)关闭时内容冻结、打开时写入最新值;fresh 开启后关闭状态也持续同步内容(受控内容场景防闪烁)。auto-close 打开后超时自动关闭(引导提示 / onboarding 场景)。

fresh:关闭时内容持续更新

内容 → v1内容 → v2(关闭中)content: -打开查看内容

auto-close:超时自动关闭

打开(3s 后自动关)

嵌套浮层

浮层内容里可以再打开子浮层(popover / tooltip):子浮层从父浮层内容触发,层级与定位自动正确;父层关闭时子层一并关闭;Esc 逐层关闭并逐层还原焦点。

嵌套浮层(卡片内再弹)

打开主卡片

父面板内再触发子浮层:

打开子卡片

虚拟触发

virtual 模式没有真实锚点(同 tooltip):由宿主通过 virtual-x / virtual-y(视口坐标)或 virtual-anchor(锚点元素选择器)指定位置,适合图表、画布上的坐标提示;设置 open 控制显隐。虚拟模式下点击触发元素与外部点击都不改变状态,生命周期完全由宿主控制。

虚拟触发(画布坐标跟随)

移动鼠标查看坐标提示

虚拟触发(锚点坐标定位)

在 (160, 90) 打开关闭open: false

虚拟触发(锚点元素跟随)

modal 把 popover 变成模态浮层:全屏遮罩 + 焦点陷阱(Tab / Shift+Tab 在面板内循环,焦点逃逸拉回,仅最上层 modal 接管)+ 滚动锁(拦截 wheel / 滚动方向键,滚动条保持可见)+ aria-modal。点击遮罩关闭并还原焦点。

Modal 化(遮罩 + 焦点锁 + 滚动锁)

打开 Modal 面板

焦点被锁在面板内:

完成取消

受控显示

open 属性受控:外部按钮设置 / 移除 open 控制显隐(点击外部 / Esc 仍会关闭)。

受控显示(open 属性)

打开关闭open: false触发元素

API

属性

属性说明类型默认值
append-toportal 挂载点:打开时面板移入目标容器(body 或 CSS 选择器),关闭移回宿主 shadow;适合面板被宿主容器裁剪(overflow)的场景string
arrow是否显示箭头(默认 true;arrow="false" 隐藏,箭头元素与 ::part(arrow) 保留)stringtrue
arrow-merge箭头与面板角融合(C1):直角三角与面板角共边融合——直角贴角点、直角边与面板两边共线(描边与面板描边共带续接),尖端正交指向锚点,对应角圆角归零;仅 -start/-end 位置生效,center placement 不触发boolean
arrow-point-at-center箭头指向触发元素中心(默认指向触发元素边缘;视口边缘避让导致面板偏移时箭头仍指向锚点中心)
auto-adjust-overflow视口边缘自动翻转与避让(默认 true;"false" 关闭,保持声明 placement,可能溢出视口)stringtrue
auto-close打开后超时自动关闭(毫秒),如 auto-close="3000";未设置不自动关闭string
closable面板右上角显示关闭按钮(part="close"),点击关闭并还原焦点到触发元素boolean
close-delay通用关闭延迟(毫秒,默认 0;非 hover 触发路径生效,hover 路径优先 hover-hide-delay)string
collision-padding视口边缘夹取边距(px,默认 4),面板贴边避让时保留的间距string
color颜色变体:primary / success / warning / danger(面板 tint 底 + 语义色描边,走 token 派生变量含 dark 变体);未设置或非法值保持默认中性面板string
content正文文本string
disabled整体禁用:click / hover / focus / contextmenu / trigger-keys 触发均不响应,宿主降饱和并同步 aria-disabledboolean
fallback-placements自定义回退序列(逗号或空格分隔,如 "left, right"):请求 placement 放不下时按序列逐一尝试 fit,首个 fit 者胜出,全不 fit 取序列末位并夹取;未设置走默认主轴翻转string
focus-on-open打开时焦点移入面板内首个可聚焦元素boolean
fresh关闭时也持续更新内容(默认关闭态冻结内容,打开时写入最新值;fresh 开启后关闭态同步写入)boolean
hide-when-detached锚点完全脱离视口时隐藏面板(打开语义保留,避免孤悬屏外)boolean
hover-delayhover 触发时打开防抖延时(毫秒,默认 150;未设置回落 open-delay)string
hover-hide-delayhover 触发时关闭防抖延时(毫秒,默认 100;未设置回落 close-delay)string
initial-focus打开时聚焦指定选择器元素(宿主 light DOM 优先,含 slot 内容;解析不到回落 focus-on-open),优先级高于 focus-on-openstring
modalmodal 化:全屏遮罩 + 焦点陷阱(Tab 面板内循环)+ 滚动锁 + aria-modal;点击遮罩关闭boolean
offset双轴偏移:"主轴距离""主轴距离, 交叉轴偏移"(px,默认 8, 0),如 offset="12, 20"
open受控显示(布尔属性,存在即显示)boolean
open-delay通用打开延迟(毫秒,默认 0;非 hover 触发路径生效,hover 路径优先 hover-delay)string
placement浮层位置(12 向:四基向 top/bottom/left/right 各配 -start/-end 交叉轴对齐)stringtop
title标题文本string
trigger触发方式:click(默认)/ hover / focus / contextmenu / manual,空格分隔可多选(如 "click hover"stringclick
trigger-keys指定按键在触发元素聚焦时切换开合(空格分隔,如 "Enter Space");未设置无按键绑定string
virtual虚拟触发模式(同 tooltip,不依赖锚点元素)boolean
virtual-anchor虚拟锚点元素选择器(virtual-x/virtual-y 未设置时生效)
virtual-x虚拟锚点 x(视口坐标,px)
virtual-y虚拟锚点 y(视口坐标,px)
width面板宽度:数字(px)/ "trigger"(与触发元素同宽)/ 任意 CSS 值(如 50%240px);未设置保持默认string

事件

事件说明
oas-open-changeopen 状态变化,detail: { open }

插槽

名称说明
默认
content

点击触发元素切换显隐,点击外部或按 Esc 关闭;role="dialog"。嵌套浮层:父关闭时级联关闭子层,Esc 逐层关闭并还原焦点到触发元素。

基于 MIT OR Apache-2.0 双许可发布