最近公司项目需要在H5页面上悬浮一个按钮,同时要求按钮是可以拖动的并且需要可以自动贴边,无奈前端小伙伴不怎么给力,无奈只能我顶上了。我觉得这种情况应该可以抽出一个组件,这次就仔细探讨一下悬浮按钮的实现原理吧。

因为平时我在开发过程中,手机端的开发我都推荐公司小伙伴使用uniapp进行,这次的自然也是在uniapp的环境下开发的组件,uniapp本身使用了小程序rpx作为单位。对于之前从来没使用过的小伙伴来说应该有点陌生,那我先解释一下这个rpx的单位是什么。

rpx单位一开始是微信小程序主推的,目的其实也很简单,因为手机屏幕有大有小,为了适应不同的屏幕才导致这个单位的出现。具体是这么定义的:规定屏幕宽为750rpx。如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则750rpx = 375px = 750物理像素,1rpx = 0.5px = 1物理像素。

有了定义以后,也就有了计算的算法了,最终就得到了1rpx=0.5px,接下来就来说说悬浮按钮的实现过程吧。

首先,先使用一个view标签,也就是pc端的div,view是uniapp自己定义的一个标签,最终H5会编译成div小程序会编译成view。接下来自然就是view标签的css样式,其实也简单,因为整个view只是盒子而已。

整个盒子的z-index赋值为1000,也就浮在了最上层了。同时使用了固定定位整个盒子,因为之后要动态去修改整个盒子的位置,实现拖动效果。同时盒子使用flex布局,将内部的其他标签居中。我现在的做法是在内部放一个GIF图片,也算是满足需求了。

要怎么计算位置?

一开始,我给view使用的是绝对定位,因此只需要将每次拖动图标是的x,y轴的位置动态赋值给整个view,那么就实现了移动,xy分别赋值给top和left。我们在手机端的时候H5view标签有几个方法我们可以使用,一个是touchmove一个是touchend。

touchmove方法就是手指按着view然后移动触发的方法,它有一个形参,形参有一堆参数,你看:

其实,我们只需要使用touches数据的第一个数据即可,这里的clientX就是x轴的值,clientY就是y轴的值。只要手指移动,这个函数就会被触发。因此我要去绑定这个方法,动态去修改top和left的值,动态给view的style赋值以后,自然它就跟着手指移动了。

当然,我在定义组件的时候还动态给整个组件赋值了一些margin-top的值什么的,自然是需要加上去的。最终实现的效果就是:

在移动view以后,万一用户将整个view移出了屏幕了怎么办?只要移出去以后就再也移不回来了。因此,就必须要说另一个方法touchend了。

touchend这个方法会在用户长按拖动并释放后触发,为了防止用户将整个view拖的无影无踪,因此必须要用户拖放结束后去人为计算用户的拖动是不是超出了边界,如果超出了边界就将top和left赋值成我们能接受的最大值。自然,在判断的过程中,要去计算X轴也必须计算Y轴,看是什么轴超出了就给置为最大的能接受值就能防止用户将整个view拖出视野,当然,我们在做着一切的时候必须要做一件事!那就是获取当前手机屏幕的xy的最大值,手机是有大有小,那怎么去获取呢?

我们使用uniapp的API:uni.getSystemInfoSync(),将整个屏幕的安全区域赋值给xy轴最大的能接受的值。

在touchend触发后这个函数也有个形参,参数和move是一样的,那么我们去计算就可以了

通过计算后复制,那么用户永远也不能将整个盒子拖出安全区域了。

最后说说贴边

因为就目前来说,需要贴边的其实也就贴左边或者贴右边。因此只需要在touchend函数中去判断,如果超过了屏幕宽度的一半那么就贴右边,小于一半就贴左边即可。

h5可拖动悬浮按钮_手机端H5悬浮按钮怎么实现的呢?相关推荐

  1. h5适配华为手机_手机端H5页面适配 踩坑

    这两天在公司做手机端H5页面,第一次开发没什么经验,对rem, pt, ppi, dpr这些概念完全不懂,看了很多博客,现总结如下. 对于不同像素宽度的手机,如何做到每一个元素自动缩放? rem: f ...

  2. h5精准定位_手机端H5地理定位结合腾讯地图API实现精准定位!

    最近项目需求,需要精准定位,但是网上搜了好久都没有解决办法,当然微信定位的方案还是可行的,手机H5 就没有这方面的教程了. 捣鼓好久啊,花了一早上的时间研究出来了.这里有个大坑,要开启手机的定位才能获 ...

  3. h5适配华为手机_手机端h5适配mete标签

    使用viewport meta标签可以提升页面在设备上的表现效果,典型地,你可以设置视口(viewport)的宽度和初始缩放比例. 举个例子来说,如果页面的宽度小于980px,你可以设置视口的宽度以适 ...

  4. pc网站和手机端h5网站开发接入微信支付

    有关支付类开发,现在比以前要简单很多了,微信和支付宝两大支付巨头早已经给出了非常详细的接入文档,并且迭代了好多版本,但在实际开发中其实文档的可读性还是有些磕磕绊绊的,而且也有一些坑需要注意.以微信支付 ...

  5. 手机端H5开发,屏幕不同尺寸适配方法(屏幕自适应)

    最近在接触手机端H5开发,然后设计师将设计图发给我们进行开发,对于第一次接触详细设计图开发的我来说,觉得很新颖毕竟一直没有接触这么正规的设计图(字体样式,颜色,大小等等),之后再开发的时候,就遇到了一 ...

  6. 奔图无线版的打印机_手机端WPS打印文档的操作步骤

    奔图无线版的打印机_手机端WPS打印文档的操作步骤 操作思路: 1. 先到打印机上打印出一份打印机自己内部的热点WiFi名称和密码: 2. 然后手机端连接这个热点WiFi(会整个手机断开网络的哦,连流 ...

  7. java手机界面太小_手机端页面在项目中遇到的一些问题及解决办法

    原标题:手机端页面在项目中遇到的一些问题及解决办法 来源:键盘上的眼泪 segmentfault.com/a/1190000015178877 1.解决页面使用overflow: scroll在iOS ...

  8. JS实现视频试看提示付费功能 手机端 H5网页

    手机端 网页 JS实现视频试看功能,到时间自动停止播放 H5 场景:视频播放 对未付费的用户只播放两分钟 付费的用户可正常播放 思路:监听视频播放时间,到达预定时间的时候, 暂停视频播放, 同时关闭大 ...

  9. kali安装卡在最后一步_手机端(安卓)安装 Kali Linux 系统详细教程

    前言 之前写有文章介绍过关于 Kali Linux 系统安装的详细教程,不过是在电脑端真机或虚拟机中的安装步骤,那么作为平时使用最多并且能方便携带的智能手机端,是否有方法或技术来实现安装呢?还确实有, ...

最新文章

  1. mysql多字段数据统计_超详细的mysql元数据sql统计--information_schema
  2. 8款帅酷的HTML5/CSS3 3D动画、图片、菜单应用
  3. linux命令--df命令du命令
  4. robotframwork接口测试(五)—接口分层测试粗解
  5. 存储IOPS参数结合实例详解
  6. python秒杀商品 多线程_Python——多线程
  7. 计算机图形学画圆和直线代码,计算机图形学作业(中点法画直线和八分画圆法).doc...
  8. loadrunner性能测试---添加windows多台压力机
  9. GWT HTTP请求替代
  10. Android 上传图片实例,java上传图片接口
  11. 计算机c语言二级试题及答案,计算机c语言二级考试试题及其答案.doc
  12. debian uefi legacy 区别_电脑硬盘格式有Legacy与UEFI,选择哪一个好?千万别选错了!...
  13. 5大主流主链排行版出炉; 以太坊新生合约数持续3周下跌; 各大榜单均现“黑马”冲榜!| 数据周榜...
  14. Atitit 互联网行业如何提升收入 经济学概论读后感 attilax总结 1. 收入“四 位一体”的理论(工资、利润、利息、地租) 1 2. 提升收入,就要提升这4个象限的收入 1 3. 如
  15. Android模拟器不支持蓝牙
  16. 《管理的常识》7-“什么是计划”读后感及读书笔记
  17. matlab 创建网格图和曲面图
  18. JavaScript(JS) date.getDate()
  19. Unity 用什么IDE比较好?
  20. 树 —— 线索二叉树

热门文章

  1. 应急管理系统 应急指挥管理系统功能
  2. 厉害了,工信部推出 “一键解绑” 手机号绑定的互联网账号,堪称神器
  3. 《678辅助网SEO改善》微调网站的益处
  4. 学习的网站 ——经典推荐
  5. 下载Python特别慢怎么办?
  6. 2019华科计算机考研经历
  7. C. Banknotes(思维
  8. MapStruct - Consider defining a bean of type in your configuration.
  9. 程序员2016年5月:走进VR开发世界
  10. 电机测试那些事---定子绕线篇