微信小程序悬浮按钮组件主要用到微信官方提供的movable-area 和 movable-view 两个组件实现。
效果如下

我们介绍一下这两个组件的作用:
movable-area:可移动的区域movable-view:可移动的视图容器,在页面中可以拖拽滑动。movable-view必须在 movable-area 组件中,并且必须是直接子节点,否则不能移动。
现在知道了两个组件的作用我们再来说说具体实现方案:
1,可移动的区域:悬浮按钮的可移动区是整个窗口,同时组件movable-area不能覆盖页面组件。采用固定定位解决方案,将movable-area组件固定在整个窗口,并将组件pointer-events属性设为none(用户点击页面元素时movable-area组件不做任何反应)
2,可移动的容器:将组件pointer-events属性设为auto,使他可以自由拖动。并设置容器初始位置,可以通过参数x和y设置。按钮拖动后需要将按钮重新移动回左边或者右边,即按钮拖动结束后自动回到屏幕的左边或者右边,这一步可以通过绑定拖动结束事件来改变可移动容器的x轴和y轴坐标来实现。具体代码如下:
wxml代码:
<movable-area class="movable_area" ><movable-view direction="{{direction}}" class="movable_view" x='{{btn_x}}' y="{{btn_y}}" bindtouchend="touchEnd"><buttonform-type="{{form_type}}"class="btn x-class"hover-class="btn-hover" catchtap="{{url?'handleTap':''}}" open-type="{{ openType }}" data-index="{{index}}" disabled="{{disabled}}"app-parameter="{{ appParameter }}" hover-stop-propagation="{{ hoverStopPropagation }}"session-from="{{ sessionFrom }}" send-message-title="{{ sendMessageTitle }}"send-message-path="{{ sendMessagePath }}" send-message-img="{{ sendMessageImg }}" show-message-card="{{ showMessageCard }}"catchcontact="bindcontact" catchgetphonenumber="bindgetphonenumber" binderror="binderror" plain="true"><image wx:if="{{button_img}}" src="{{button_img}}" class="movable_img" style="width: {{button_img_width}}rpx;height: {{button_img_height}}rpx;"></image><slot></slot></button></movable-view></movable-area>
wxss代码:
.movable_area{position: fixed;top: 0;left: 0;width: 100%;height: 100%; 将移动区域设为整个窗口pointer-events: none; //对点击事件不做任何反应z-index: 1111111; //防止页面组件遮挡}.movable_view{pointer-events: auto; //让可移动视图自由拖动//高度和宽度自动根据内容的变化而变化(可移动的按钮可能是一个icon或者文字)height: auto;width: auto;}
js代码如下
// buttonBehavior:封装好的button相关的js代码,有点击事件,可放功能事件等)var buttonBehavior = require('../common/button_behaior.js');Component({behaviors: [buttonBehavior],/*** 组件的属性列表*/properties: {//可移动的方向direction:{type:String,value:'all'},//按钮的iconbutton_img:{type:String,value:'/static/wodekaquan.png'},//按钮图片的宽度,单位rpxbutton_img_width:{type:Number,value:150},//按钮图片的高度,单位rpxbutton_img_height:{type:Number,value:150},//移动按钮的初始x轴坐标btn_x:{type:String,value:'580rpx'},//移动按钮的初始y轴坐标btn_y:{type:String,value:'750rpx'}},lifetimes: {created: function() {//获取设备宽度wx.getSystemInfo({success: (result) => {this.data.screenWidth = result.screenWidth;this.data.btn_origin_x = this.data.btn_x;},})}},/*** 组件的初始数据*/data: {//移动按钮的初始x轴坐标btn_origin_x:0,//屏幕的宽度,用于计算移动结束后,按钮是往左还是往右悬浮screenWidth:375},/*** 组件的方法列表*/methods: {touchEnd(e){this.createSelectorQuery().select('.movable_view').boundingClientRect((res)=>{if(res.left<this.data.screenWidth/2){return this.setData({btn_x:'0px',btn_y:res.top+'px'})}this.setData({btn_x:this.data.btn_origin_x,btn_y:res.top+'px'});}).exec();}}})
文章转载自编程经验共享,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




