当前位置: 首页 > ops >正文

记录前端菜鸟的日常——小程序内嵌H5页面自定义分享按钮

一个新的小需求,客户想把某一个页面(在H5里写的)的右上角的三个点分享禁掉,改成用悬浮在页面某个位置且可拖动的按钮进行分享

我之前只知道两种方式可以进行分享:onShareAppMessage和button按钮上的open-type="share"

一、自定义分享按钮

最开始想的是h5来写这个按钮,然后向小程序原生用postMessage发送消息,小程序进行监听并且触发分享,但是后来发现监听完之后也只能是修改消息内容,并不能触发分享事件,然后我就想在小程序原生里把按钮给加上,用open-type="share"的方式

如果是直接写的话都会被webview的优先级把页面写的内容都覆盖掉

h5的页面使用webview内嵌进来的,问了chat和看一位大佬的文章了解到cover-view组件优先级比webview要高https://blog.csdn.net/m0_47791238/article/details/133789009?ops_request_misc=%257B%2522request%255Fid%2522%253A%25229557455c43ea01001c42aa6e36b05764%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=9557455c43ea01001c42aa6e36b05764&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-1-133789009-null-null.142^v102^pc_search_result_base4&utm_term=cover-view%E5%92%8Cwebview&spm=1018.2226.3001.4187

cover-view功能描述:

这里面还能写button真是天助我也,不过需要注意cover-view的样式我本来用的是absolute结果真机调试的时候不出现,用了fixed才好,不过fixed也是不影响按钮拖动的(本地看不见按钮必须真机调试)

二、按钮拖动效果

按钮出现之后就是拖动功能了,先上代码

wxml:

<view><web-view src="{{currentDetailUrl}}" bindmessage="handleWebviewMessage"></web-view><cover-view class="draggable-btn" style="left: {{btnLeft}}px; top: {{btnTop}}px;"bindtouchstart="onTouchStart"bindtouchmove="onTouchMove"bindtouchend="onTouchEnd"><button class="text" open-type="share">分享</button></cover-view>
</view>

js:

data: {// 初始位置(单位:px)btnLeft: 30,   // 距离左边btnTop: 100,   // 距离顶部// 当前拖动状态startX: 0,startY: 0,isMoving: false},
// 触摸开始
onTouchStart(e) {const { clientX, clientY } = e.touches[0];this.setData({startX: clientX - this.data.btnLeft,startY: clientY - this.data.btnTop,isMoving: true});
},// 触摸移动
onTouchMove(e) {if (!this.data.isMoving) return;if (this.throttle) return;this.throttle = true;setTimeout(() => {this.throttle = false;}, 16);const { clientX, clientY } = e.touches[0];let left = clientX - this.data.startX;let top = clientY - this.data.startY;const { windowWidth, windowHeight } = wx.getSystemInfoSync();const btnWidth = 60;const btnHeight = 40;left = Math.max(10, Math.min(left, windowWidth - btnWidth - 10));top = Math.max(80, Math.min(top, windowHeight - btnHeight - 10));this.setData({btnLeft: left,btnTop: top});
},// 触摸结束
onTouchEnd() {this.setData({isMoving: false});
},onLoad(options) {// wx.hideShareMenu()this.setData({btnLeft: 30,btnTop: 100});

我画了一个图片帮助理解,字不好看不过应该能看懂

这里的30和100都是初始按钮所在的位置,e.touches[0]是第一个触摸点,这个点能拿到手指与手机左上角的距离,分别一减就是手指与按钮左上角的距离,拿到这个距离之后按钮就能跟着你手指头跑了,只要能拿到你手指头距离左上角,我就可以计算出按钮应该top多少、left多少

这里还需要注意不要让按钮超出手机可视区域,得到手机视宽/高

  left = Math.max(10, Math.min(left, windowWidth - btnWidth - 10));
  top = Math.max(80, Math.min(top, windowHeight - btnHeight - 10));

以left为例,这句代码是让按钮位于距左侧10到windowWidth-btnWidth-10之间,如果在中间的话,left是多少就是多少(10是为了美观,不让按钮那么贴边)

这样做完之后性能不太好,移动按钮的时候会卡顿,我让chat帮我做了下优化用节能锁不频繁赋值但是效果不大,cover-view可包含的标签太少,高级组件不能用,所以性能方面先这样

最后就是我本来疑问e.touches[0]为什么一直是0,我以为第二次触摸的话就是1,后来搜了一下知道n的意思是同时有多少根手指在屏幕上移动,所以这里就一直是0

撒花~

(做完之后还被领导夸了,因为上一个离职的同事说不能在这页自定义按钮分享领导以为不能实现,小小开心一下继续加油!)

http://www.xdnf.cn/news/18383.html

相关文章:

  • 深入解析HashMap的存储机制:扰动函数、哈希计算与索引定位
  • 信息收集4----(收集网站指纹信息)
  • 20250821 圆方树总结
  • 一、部署LNMP
  • 实现自己的AI视频监控系统-第一章-视频拉流与解码3
  • mac的m3芯使用git
  • 18维度解密·架构魔方:一览无遗的平衡艺术
  • LT8712SX,Type-C/DP1.4 /eDP转 DP1.4/HD-DVI2.0 带音频
  • AXI GPIO S——ZYNQ学习笔记10
  • Java项目:基于SpringBoot和VUE的在线拍卖系统(源码+数据库+文档)
  • K 均值聚类(K-Means)演示,通过生成笑脸和爱心两种形状的模拟数据,展示了无监督学习中聚类算法的效果。以下是详细讲解:
  • 【typenum】 19 类型相同检查(type_operators.rs片段)
  • JavaWeb前端03(Ajax概念及在前端开发时应用)
  • SD 节点学习
  • ZStack Zaku替代VMware Tanzu:六项对比、构建虚拟机+容器一体化架构
  • HTTP 403 错误:后端权限校验机制深度解析
  • Matplotlib数据可视化实战:Matplotlib高级使用技巧与性能优化
  • 用OpencvSharp编写视频录制工具
  • Matplotlib数据可视化实战:Matplotlib数据可视化入门与实践
  • 【Android】悬浮窗清理
  • Pytorch基础学习--张量(生成,索引,变形)
  • 从系统漏洞归零到候诊缩短20%:一个信创样本的效能革命
  • 机器学习聚类与集成算法全解析:从 K-Means 到随机森林的实战指南
  • CRMEB私域电商系统后台开发实战:小程序配置全流程解析
  • 贪吃蛇游戏(纯HTML)
  • 什么是区块链?从比特币到Web3的演进
  • 图像中物体计数:基于YOLOv5的目标检测与分割技术
  • 十分钟速通堆叠
  • 智慧城市SaaS平台/市政设施运行监测系统之空气质量监测系统、VOC气体监测系统、污水水质监测系统及环卫车辆定位调度系统架构内容
  • 终结开发混乱,用 Amazon Q 打造AI助手