uni-app需自行封装tooltip组件,因官方及uview、uni-ui均未提供;核心用view包裹文字,@tap触发,uni.createselectorquery()动态定位,max-width+word-break处理换行,加遮罩和关闭按钮完善交互。

uni-app 里没有原生 Tooltip 组件,得自己封装
uni-app 官方组件库(uView、uni-ui)均未提供标准 Tooltip(悬停/点击文字显示气泡提示),尤其在小程序端,hover 行为受限,必须用「点击触发 + 手动控制显隐」。直接套用 Web 的 title 或 CSS :hover 在 App 和小程序里基本无效。
核心思路是:用 view 包裹文字,监听 @tap,通过 v-if 或 v-show 控制气泡层,再用 getBoundingClientRect() 动态计算位置,避免遮挡或出界。
点击定位不准?用 uni.createSelectorQuery() 替代 getBoundingClientRect()
Web 端可用 element.getBoundingClientRect(),但在微信小程序和 App 端,节点可能尚未渲染完成或跨层级,直接调用常返回 {top: 0, left: 0}。必须用 uni.createSelectorQuery() 做异步查询。
- 给触发文字加唯一
ref,比如ref="triggerEl" - 在
@tap回调中调用:uni.createSelectorQuery() .select('#triggerEl') .boundingClientRect() .exec(res => { const rect = res[0] if (rect) { this.tooltipStyle = { top: `${rect.bottom + 8}px`, left: `${rect.left + rect.width / 2 - 60}px` // 气泡宽约120px,居中对齐 } this.showTooltip = true } }) - 注意:
exec()必须带回调,不能链式 await(uniAPI 不支持 Promise 化,除非自行封装)
气泡内容换行、长文本溢出怎么处理
默认 view 内文字不换行,且 max-width 缺失会导致气泡撑宽、错位。小程序 Canvas 渲染下,white-space: normal 也不总生效。
- 气泡容器设固定
max-width: 200px(推荐 180–240px,兼顾阅读与屏幕宽度) - 内部文字用
text标签而非view,并加样式:.tooltip-text { word-break: break-word; white-space: normal; padding: 6px 12px; } - 避免在
tooltip中放rich-text或图片——小程序端z-index层级混乱,极易被遮挡
关闭逻辑容易漏:点击空白处收起 + 手动关闭按钮
只靠再次点击文字关闭,体验差;不加外部点击收起,用户无法主动退出,气泡会一直挂着。
- 在气泡外层加透明遮罩(
cover-view在小程序中更可靠,view在 H5/App 可用),监听@tap触发this.showTooltip = false - 气泡右上角加小叉号按钮,绑定
@tap.stop="showTooltip = false"(.stop防止冒泡触发遮罩关闭) - 慎用
setTimeout自动隐藏——用户可能正在读长提示,硬性 2s 关闭反而打断操作流
真要兼容多端,cover-view + cover-image 是小程序 tooltip 定位和遮罩的底线方案,H5 可退化为普通 view + z-index,但别试图一套代码通吃所有平台——位置计算逻辑、事件穿透、动画支持差异太大。











