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

记录前端菜鸟的日常——小程序内嵌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.dtcms.com/a/343114.html

相关文章:

  • 环形子数组的最大和
  • Ubuntu24.04 交叉编译libuv库(已编译好的) 之undefined reference to `pthread_getname_np‘解决
  • VMware Workstation里的Ubuntu22.04找不到共享文件夹
  • Ubuntu Server 安装 gvm 管理 Go 语言开发环境
  • 代码随想录Day58:图论(拓扑排序精讲、最短路算法dijkstra朴素版精讲)
  • Android焦点窗口变化导致遥控键值监听失效问题分析
  • AI编程避坑指南:常见错误与解决策略
  • 年化42%,最大回撤18%,卡玛比率2.3的策略可查看参数 | 全A股市场构建技术方案
  • 数据库审计是什么?主要功能详解与厂商解析
  • 第7章 区分鸟和飞机:从图像学习
  • 【网络运维】初见Shell:Shell 变量基础知识
  • Vue图解!!!Vue的生命周期管理【7】
  • MFC中使用libtorch的实例
  • 【一分钟教程】用ZMC600E实现关节机器人±180度精准转动
  • Ubuntu网络图标消失/以太网卡显示“未托管“
  • 人工智能之数学基础:随机变量和普通变量的区别?
  • 什么是测度?
  • 实践题:智能客服机器人设计
  • 魔乐开发者教程 | 基于openMind实现大模型微调指南(二):大模型微调实操
  • 图像边缘检测
  • Spring AI 入门学习指南
  • 2025.8.21总结
  • CMake使用【c/c++】
  • 2025Java面试红皮书:1000道BAT真题详解
  • plc与plc无线通讯实现PLC1200和ET200SP无线通讯解决方案实践
  • uniapp 懒加载图片
  • 力扣面试150(62/150)
  • SAP FIORI Elements深度定制:注解扩展与审批流程增强完全指南
  • 软件工程 + AI 不是 “硬凑”,3 步走通落地关键环节
  • es6新语法