vue实现按钮随意拖动,松开后留在当前位置

效果

如图所示,在接触到边缘时,会卡在边缘附近,不会移出屏幕,当松开时会停留到当前位置
在这里插入图片描述

实现代码

html部分代码

这里简单说一下,addScale是为了让按钮在按下时有个变大,松开变小的效果,需要在data里配一下这个值,addTop和addLeft也是data中配置的,记录按钮所在位置,addmove是一个方法,通过这个方法来调整按钮位置

<!-- 添加按钮 -->
		<image class="addBtn" src="../../static/car/icon_car_add.png" @click="addApply()" @touchmove.stop.prevent="addmove" @touchstart="addScale=120" @touchcancel="addScale=100" @touchend="addScale=100" :style="{'transform': `scale(${addScale}%, ${addScale}%)`, 'left':addLeft,'top':addTop,'z-index':9999}"></image>

script部分代码

计算屏幕宽高部分

我这里写的是组件,调用的生命周期是mounted,如果你不打算写组件,那么我觉得Ready生命周期是比较好的

data部分
data() {
			return {
				// 加号按钮大小变形,按下拖动时变大,松开变小
				addScale:100,
				
				//添加按钮位于页面顶部多少距离
				addTop:'0rpx',
				//添加按钮位于页面左边多少距离
				addLeft:'0rpx',
				// 按钮一半大小,做个偏移,让按钮在中心
				buttonSize:0,
				// 按钮可移动边距
				moveLeft:0,
				moveRight:0,
				moveTop:0,
				moveBottom:0,
			}
		},
逻辑代码部分
mounted() {
			
	if(this.addTop=='0rpx'||this.addLeft=='0rpx'){
		// 获取手机屏幕宽高,为add按钮设置大小,和初始位置
		let height = uni.getSystemInfoSync().windowHeight;
		let width = uni.getSystemInfoSync().windowWidth;
		// 设置边距
		//注意,这个是按钮大小的一半,不要配错了,配错了拖动的就不是按钮中心位置了
		this.buttonSize = (this.rpx2Px(130)/2)
		// 给
		let rpx10 = this.rpx2Px(10) 
		this.moveLeft = rpx10 + this.buttonSize
		this.moveTop = rpx10 + this.buttonSize
		this.moveRight = width - rpx10 - this.buttonSize
		this.moveBottom = height - rpx10 - this.buttonSize 
		
		// 配置add按钮初是位置
		this.addLeft=`${width - (width/4) - this.buttonSize}px`
		this.addTop=`${height - (height/4) - this.buttonSize}px`
	}
},
methods: {
	// 加号按钮拖动
	addmove(e){
		if(e.touches.length>0){
			// x轴移动限制
			let x = e.touches[0].clientX<this.moveLeft?this.moveLeft:e.touches[0].clientX>this.moveRight?this.moveRight:e.touches[0].clientX
			// y轴移动限制
			let y =  e.touches[0].clientY<this.moveTop?this.moveTop:e.touches[0].clientY>this.moveBottom?this.moveBottom:e.touches[0].clientY
			//按钮纠正,不然拖动的不是中心位置,而是左上角边缘位置
			this.addLeft=`${x-this.buttonSize}px`
			
			this.addTop=`${y - this.buttonSize}px`
		}
		
	},
	rpx2Px(rpx) {
	  const screenWidth = uni.getSystemInfoSync().screenWidth
	  return (screenWidth * Number.parseInt(rpx)) / 750
	}
}

后记

这只是完成了基本的业务需求,如果有更多需求的话,还是可以做优化修改的,另外不止是image,哪怕是video标签也可以这么搞变成一个伪小窗视频播放器,所以不要太局限自己的思考能力

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值