vue 移动端拖放元素实现浮窗滑动效果

2 篇文章 0 订阅

vue 移动端拖放元素实现浮窗滑动效果

混合开发中,项目组需求要求每个页面上有个智能客服的入口是以浮窗的形式体现的,并且原生开发不好做,那么就有前端来实现这个需求。
需求分析:
1.每个页面都需要有浮窗存在。
2.手指滑动可以随意拖放/只能在屏幕上下拖放。
3.最好进入每个页面的时候这个浮窗的位置初始化时还在上一页面停留的位置。
4.是否存在于整个项目的最高层级。

根据需求分析,我把这个浮窗封装成一个公共的组件。

<template>
	<div class="float-box" ref="floatIcon" :style="{top:floatInitTop}">
		<p>浮窗的入口</p>
	</div>
</template>
<script>
export default{
	name:"floatIcon",
	props:{},
	data(){
		return:{
			floatInitTop:"600px"
		}
	},
	mounted(){
		this.init();
	},
	methods:{
		init(){
			let element = this.$refs.floatIcon; // 获取元素
			let floatInitTop = localStorage.getItem("floatInitTop");// 获取缓存中得到Y轴的距离数据,存在数据就赋值,不存在就给一个默认的距离顶部的高度
			if(floatInitTop){
				this.floatInitTop = floatInitTop + "px";
			}else{
				this.floatInitTop = "600px";
			}
			let initTop = Number(floatInitTop);// 把初始高度去存一下,后面计算拖放要用到
			// 下面的这些数据用于存放手指拖动的一些计算
			let currentPosition = {y:0};//我这里只做了上下拖放,要做全屏的随意拖放把x相关的加进去就可以了
			let offset = {};
			let touchStartPosition = {};
			let moveFlag = false;
			element.addEventListener('touchstart',touchStart,false);
			element.addEventListener('touchmove',touchMove,false);
			element.addEventListener('touchend',touchEnd,false);
			function touchStart(e){
				let touch = e.targetTouches[0];
				touchStartPosition.y = touch.pageY;
			}
			function touchMove(e){
				moveFlag = true;
				e.preventDefault();
				let touch = e.targetTouches[0];
				offest.y = touch.pageY - touchStartPosition.y;
				move({y: currentPosition.y + offset.y});
			};
			function touchend(e){
				if(!moveFlag) return
				currentPosition.y += offset.y;
				moveFlag = false;
			};
			function move(params){
			// 计算距离顶部 / 底部的距离,然后判断Y个距离的大小
				if(params.y > (document.documentElement,clientHeight - initTop) - 60){ // 60是元素本身的高度
					params.y = document.documentElement,clientHeight - initTop - 60
				}
				if(params.y < 0 && Math.abs(params.y) > (initTop - 44)){ // 向上拉到顶之后就不要再移动了,44是我的顶部有个header的标题栏
					params.y = -(initTop - 44);
			    }
			    element.style.transform = "translate(" + params.y + "px)";
			    localStorage.setItem('floatInitTop',element.getBoundingClientRect().top);
			}
			
			
		}
	}
}
</script>
<style lang="less" scoped>
.float-box{
	position:fixed;
	right:0;
	height:60;
}
</style>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值