最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
uni-app怎么实现类似于微信的消息长按菜单 uni-app气泡弹窗实现代码
时间:2026-07-06 11:26:52 编辑:袖梨 来源:一聚教程网
直接用 uni-popup 配合手动定位 + 箭头计算可复现微信长按气泡菜单;需绕过 position 属性,用 absolute + touch 坐标动态设置 left/top,伪元素箭头居中指向,遮罩 pointer-events: none,H5/App 分别禁用系统长按。
直接用 uni-popup 配合手动定位 + 箭头计算,就能复现微信长按气泡菜单的核心交互;但要注意它默认不支持“贴着目标元素自动对齐+箭头指向”,必须自己补位置逻辑和遮罩穿透处理。
uni-popup 默认 position="bottom" 为什么点不准、遮不住目标元素?
微信那种气泡是“紧贴触发点、箭头正对点击位置”的,而 uni-popup 的 position="bottom" 实际是固定在视口底部区域弹出,和目标元素无关。它只做方向分类(top/bottom/left/right/center),不读取触发元素坐标。
- 触发点在屏幕中间时,
position="bottom"仍会把弹窗塞到底部,导致用户要抬头找菜单 - 遮罩层默认会拦截所有点击,长按后松手可能误触遮罩关闭菜单,而不是点中菜单项
-
uni-popup的z-index是硬编码的(如1075),在复杂页面里容易被其他组件盖住
怎么让气泡真正“锚定”在长按位置?
得绕过 position 属性,改用绝对定位 + 动态计算:left 和 top 基于 touchstart 事件的 clientX/clientY,再减去弹窗宽高做居中或偏移对齐。
- 监听
longpress或touchstart + setTimeout模拟长按,拿到e.touches[0]坐标 - 用
uni.createSelectorQuery()查弹窗自身尺寸(宽高),避免写死数值 - 箭头位置靠伪元素 +
transform: translate(-50%, 0)实现居中指向,不要用rotate(45deg)——它在不同缩放下易错位 - 关键:给弹窗容器加
pointer-events: auto,遮罩层设pointer-events: none(否则手指松开瞬间会触发遮罩 click)
// 示例:动态设置弹窗位置const showAt = (e) => { const x = e.touches[0].clientX; const y = e.touches[0].clientY; // 减去弹窗宽高的一半,实现“中心对准点击点” that.popupStyle = { left: `${x - 80}px`, top: `${y - 120}px`, position: 'absolute' }; that.show = true;};
长按菜单如何避免和原生长按冲突(尤其 H5 和 App)?
uni-app 的 longpress 在 H5 上不触发,在 iOS App 上可能被系统截获显示“复制/搜索”菜单,必须主动禁用。
- H5 端:给目标元素加
style="user-select: none; -webkit-user-select: none;" - App 端(iOS):在
manifest.json → iOS 设置 → “禁用系统长按菜单”打钩(对应配置项是ios.userLongPressMenu) - 统一做法:在
touchstart里立刻调用e.preventDefault(),并用setTimeout启动菜单,避免和滚动冲突 - 别用
@longpress直接绑定,改用@touchstart.stop.prevent+ 手动计时器更可控
箭头始终“指不准”?检查这三点
气泡箭头偏移是最常被忽略的细节,问题几乎都出在定位基准没对齐。
- 父容器是否设置了
position: relative?如果没设,absolute会相对于视口定位,箭头就飘了 - 箭头伪元素的
top或left是基于弹窗容器左上角算的,不是基于触发点——所以必须同步调整弹窗left/top和箭头left/top - 使用 rpx 单位时,务必在
onReady后再计算尺寸,否则 rpx 转换未生效,宽高取值为 0
真正在意体验的话,别省那几行坐标计算——微信菜单之所以顺手,是因为它连手指抬起的微小偏移都做了容错判断,而不仅是“显示在点击处”。
相关文章
- 快影名人堂查看方式 07-06
- 快影名人堂入选指引 07-06
- 影之刃绝影连招秘诀 07-06
- 影之刃3绝影速成玩法 07-06
- 快影使用指南:功能介绍轻松查看 07-06
- 快影去字教学 07-06