n-popover 气泡
单个触发内容旁的文字提示、操作菜单或自定义内容。定位、测量、箭头、遮罩、尺寸变化与关闭动画由组件处理。多列筛选栏使用 n-dropdown,单触发器操作菜单直接使用本组件的 items。
平台兼容性
| App | H5 | 微信小程序 |
|---|---|---|
| √ | √ | √ |
API
Popover 属性
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| visible | 显隐状态,推荐 v-model:visible;交互经 update:visible 回传,外部可以延迟或拒绝更新 | boolean | false |
| content | 气泡文字;content 插槽优先,其次 items 菜单,最后显示文字 | string | "" |
| items | 操作菜单数据;传入 content 插槽时由插槽接管渲染 | NPopoverItem[] | [] |
| position | 弹出方位;top/bottom 配 -left/-right,left/right 配 -top/-bottom,auto 自动选向 | NPopoverPosition | "top" |
| show-arrow | 是否显示与气泡同色的指向箭头 | boolean | true |
| arrow-size | 箭头方块边长 px,支持 6–20;箭头尖端与触发器保持间距 | number | 10 |
| bg-color | 气泡背景,空串使用主题令牌 --n-popover-bg;箭头同色 | string | "" |
| color | 文字与菜单项颜色,空串使用 --n-popover-color;自定义插槽自行设置文字颜色 | string | "" |
| font-size | 内置文字与菜单字号 px,须大于 0 | number | 14 |
| font-weight | 内置文字与菜单字重,如 normal、bold、600 | string | "normal" |
| padding-x | 内容水平内边距 px,须非负 | number | 12 |
| padding-y | 内容垂直内边距 px,须非负 | number | 8 |
| round | 气泡圆角 px,须非负 | number | 8 |
| width | 固定宽度 px,0 按内容自适应;始终受视口与 maxWidth 限制 | number | 0 |
| max-width | 内容最大宽度 px,0 仅受视口限制;超宽自动换行,超高内部滚动 | number | 260 |
| z-index | 气泡层级,-1 使用主题令牌;显式设置时遮罩为此值减一 | number | -1 |
| duration | 出入场时长 ms,0 在测量完成后即时显隐 | number | 200 |
| disabled | 禁用触发器和菜单项点击,并降低触发器透明度;外部仍可控制 visible | boolean | false |
| show-mask | 是否渲染遮罩;关闭后外部区域可以交互 | boolean | true |
| close-on-click-mask | 是否允许点遮罩关闭,关闭时仍拦截页面交互 | boolean | true |
| close-on-click-item | 菜单选择后是否自动请求关闭 | boolean | true |
| mask-color | 遮罩颜色,空串使用 --n-popover-mask-color,默认透明 | string | "" |
| show-line | 菜单项之间是否显示分隔线 | boolean | true |
| line-color | 菜单分隔线颜色,空串使用 --n-popover-line-color | string | "" |
| content-style | 内容区域行内样式,如 border-width;背景统一使用 bgColor,尺寸统一使用 width/maxWidth | string | "" |
| item-style | 内置菜单项行内样式;间距与触控高度由组件提供 | string | "" |
| custom-class | 根节点额外类名,类须定义在组件自己的样式表内 | string | "" |
| custom-style | 根节点行内样式 | string | "" |
Popover 事件
| 事件名 | 说明 | 回调参数 |
|---|---|---|
| update:visible | 请求更新显隐,v-model:visible 接收 | boolean |
| change | 与 update:visible 同参同发 | boolean |
| click | 有效菜单项点击,默认随后请求关闭 | NPopoverClick: |
| open | 测量成功后开始显示 | - |
| opened | 入场完成;测量未完成、取消或过期请求不会触发 | - |
| close | 开始收起 | trigger / mask / item / page / api / error |
| closed | 退场完成,保留插槽状态 | - |
| error | 配置、菜单或测量失败;停止显示并请求 visible=false | NPopoverError: |
Popover 插槽
| 名称 | 说明 | 参数 |
|---|---|---|
| default | 触发内容 | |
| content | 自定义气泡内容,接管内置菜单或文字 | |
| itemIcon | 菜单项图标或图片,自定义大小和颜色 | {item, index, size},size 与内置文字行高一致 |
Popover 方法
| 方法名 | 说明 |
|---|---|
| open() | 请求 visible=true,禁用或无内容时不触发;需绑定更新通道 |
| close() | 请求 visible=false,关闭来源 api;需绑定更新通道 |
| toggle() | 请求相反显隐状态;需绑定更新通道 |
普通调用推荐 v-model:visible。自定义内容使用插槽 close,均无需实例类型声明。
实现说明
| 参考机制 | 本组件做法 | 融合理由 |
|---|---|---|
| 文字气泡的内容、配色、字号、内边距、圆角、方位、宽度、层级、时长、禁用、遮罩 | 对应 content、bgColor、color、fontSize、paddingX/Y、round、position、width/maxWidth、zIndex、duration、disabled、showMask | 保留提示形态与主题定制通道,数值尺寸统一为 px |
| 触发方式为点击触发器开合(再点、遮罩、菜单项或外部控制关闭);不提供 hover 悬停与长按触发 | 同左,未设触发方式 prop | 移动端悬停不可靠且各参考实现同为点击触发;hover 引导与长按手势由调用方在触发内容上自行组合 |
| 菜单气泡的 items、点击载荷、图标、图片、分隔线、字重 | items、click({index,item})、itemIcon 插槽、showLine、lineColor、fontWeight | 菜单由组件绘制;图标与图片使用统一插槽,无需调用方绘制整份列表 |
| 遮罩渲染、颜色与可关闭性独立配置 | showMask、maskColor、closeOnClickMask | 支持透明或自定义遮罩,也支持阻断页面但禁止点外关闭 |
| 触发内容旁的坐标、方向与三角位置维护 | 组件测量触发器和自然内容尺寸,方位拆成主方向与起止对齐,按最终钳制位置计算箭头 | 无需调用者维护 left/right/top/bottom 或箭头补偿;页面任意坐标的自由浮层属于弹层组件,不属于触发器气泡 |
| 相对定位与手动 fixed 定位 | fixed 原点排版与整数位移,测量与定位使用统一坐标;先完成测量再进入显示阶段 | 内容自然宽度不随气泡最终横坐标改变;Web 内部加入导航栏坐标差,调用方无需适配 |
| 屏幕边缘与长内容 | 限制实际宽度和滚动视口高度,并给箭头预留空间 | 钳制坐标与约束尺寸同时执行,超高内容内部滚动 |
| 展开后内容变化 | 属性变化后 nextTick 重新测量;展开期间每 100ms 检查异步插槽尺寸与触发器位置,仅几何变化时提交更新 | 无需调用者 refresh;触发器移动、消失、页面滚动或隐藏时收起并释放资源 |
| 异步测量与过渡 | 开合代次与测量序号共同取消过期回调;duration=0 仍先测量 | 快速开合不会复用旧坐标,测量失败明确报告 error,不伪造默认几何 |
| 气泡底色、文字、遮罩、分隔线和层级 | CSS 令牌 > SCSS 默认值;显式 prop 配置覆盖对应变量,customClass/customStyle 作用于根 | 空值跟随主题;contentStyle/itemStyle 定制内部节点 |
主题令牌:--n-popover-bg、--n-popover-color、--n-popover-shadow-color、--n-popover-z-index、--n-popover-mask-z-index、--n-popover-mask-color、--n-popover-line-color、--n-popover-disabled-opacity。SCSS 覆盖 bubble z-index 时默认同时推导遮罩层级;运行时 CSS 变量分别控制两层。过渡时长在每次展开或收起开始时取值,修改 duration 不改变已经开始的过渡。zIndex prop 默认为 -1(使用主题,默认气泡 999、遮罩 998),显式设置时统一调整两层。