vue实现移动端触屏拖拽功能


Posted in Javascript onAugust 21, 2020

vue实现移动端可拖拽浮球,供大家参考,具体内容如下

1 首先创建一个div

<div class="floatball" id="floatball"
 @mousedown="down" @touchstart.stop="down"
 @mousemove="move" @touchmove.stop="move"
 @mouseup="end" @touchend.stop="end" @click="showRewardDesc"
 :style="{top:position.y+'px', left:position.x+'px'}">
 奖励规则
</div>

2 给 div 附上样式

<style>
 .floatball{
 color:white;
 height:50px;
 width: 50px;
 padding: 5px;
 z-index: 990;
 position: fixed;
 top: 60px;
 right: 320px;
 border-radius: 50%;
 background-color: rgba(29, 157, 237,0.8);
 }

</style>

3 给 div 附上事件

准备四个变量

1)、屏幕长

var screenHeight = window.screen.height

2)、屏幕宽

var screenWidth = window.screen.width

3)、初始触控点 距离 div 左上角的横向距离 dx

4)、初始触控点 距离 div 左上角的竖向距离 dy

vue实现移动端触屏拖拽功能

在开始拖拽时,计算出鼠标点(初始触控点)和 div左上角顶点的距离

down(event){
 this.flags = true;
 var touch ;
 if(event.touches){
 touch = event.touches[0];
 }else {
 touch = event;
 }
 console.log('鼠标点所在位置', touch.clientX,touch.clientY)
 console.log('div左上角位置', event.target.offsetTop,event.target.offsetLeft)
 dx = touch.clientX - event.target.offsetLeft
 dy = touch.clientY - event.target.offsetTop
},

拖拽进行时,将触控点的位置赋值给 div

// 定位滑块的位置
this.position.x = touch.clientX - dx;
this.position.y = touch.clientY - dy;
// 限制滑块超出页面
// console.log('屏幕大小', screenWidth, screenHeight)
if (this.position.x < 0) {
 this.position.x = 0
} else if (this.position.x > screenWidth - touch.target.clientWidth) {
 this.position.x = screenWidth - touch.target.clientWidth
}
if (this.position.y < 0) {
 this.position.y = 0
} else if (this.position.y > screenHeight - touch.target.clientHeight) {
 this.position.y = screenHeight - touch.target.clientHeight
}

拖拽结束

//鼠标释放时候的函数
end(){
 console.log('end')
 this.flags = false;
},

全部代码

<template>
 <div class="floatball" id="floatball"
 @mousedown="down" @touchstart.stop="down"
 @mousemove="move" @touchmove.stop="move"
 @mouseup="end" @touchend.stop="end"
 :style="{top:position.y+'px', left:position.x+'px'}">
 奖励规则
 </div>
</template>

<script>
// 鼠标位置和div的左上角位置 差值
var dx,dy
var screenWidth = window.screen.width
var screenHeight = window.screen.height

export default {
 data() {
 return {
 flags: false,
 position: {
 x: 320,
 y: 60
 },
 }
 },
 

 methods: {
 // 实现移动端拖拽
 down(event){
 this.flags = true;
 var touch ;
 if(event.touches){
 touch = event.touches[0];
 }else {
 touch = event;
 }
 console.log('鼠标点所在位置', touch.clientX,touch.clientY)
 console.log('div左上角位置', event.target.offsetTop,event.target.offsetLeft)
 dx = touch.clientX - event.target.offsetLeft
 dy = touch.clientY - event.target.offsetTop
 },
 move() {
 if (this.flags) {
 var touch ;
 if (event.touches) {
 touch = event.touches[0];
 } else {
 touch = event;
 }
 // 定位滑块的位置
 this.position.x = touch.clientX - dx;
 this.position.y = touch.clientY - dy;
 // 限制滑块超出页面
 // console.log('屏幕大小', screenWidth, screenHeight )
 if (this.position.x < 0) {
 this.position.x = 0
 } else if (this.position.x > screenWidth - touch.target.clientWidth) {
 this.position.x = screenWidth - touch.target.clientWidth
 }
 if (this.position.y < 0) {
 this.position.y = 0
 } else if (this.position.y > screenHeight - touch.target.clientHeight) {
 this.position.y = screenHeight - touch.target.clientHeight
 }
 //阻止页面的滑动默认事件
 document.addEventListener("touchmove",function(){
 event.preventDefault();
 },false);
 }
 },
 //鼠标释放时候的函数
 end(){
 console.log('end')
 this.flags = false;
 },

 }
 
}
</script>

<style>
 .floatball{
 color:white;
 height:50px;
 width: 50px;
 padding: 5px;
 z-index: 990;
 position: fixed;
 top: 60px;
 right: 320px;
 border-radius: 50%;
 background-color: rgba(29, 157, 237,0.8);
 }

</style>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
14个有用的Jquery技巧分享
Jan 08 Javascript
JavaScript处理解析JSON数据过程详解
Sep 11 Javascript
jquery实现一个简单的表单验证实例
Mar 30 Javascript
js仿支付宝多方框输入支付密码效果
Sep 27 Javascript
ReactNative Image组件使用详解
Aug 07 Javascript
vue源码学习之Object.defineProperty对象属性监听
May 30 Javascript
详解Vue CLI3配置解析之css.extract
Sep 14 Javascript
JQuery+Bootstrap 自定义全屏Loading插件的示例demo
Jul 03 jQuery
React+TypeScript+webpack4多入口配置详解
Aug 08 Javascript
解决vue初始化项目时,一直卡在Project description上的问题
Oct 31 Javascript
Vue 构造选项 - 进阶使用说明
Aug 14 Javascript
uniapp电商小程序实现订单30分钟倒计时
Nov 01 Javascript
vue实现移动端拖动排序
Aug 21 #Javascript
微信小程序实现聊天室
Aug 21 #Javascript
vue实现折线图 可按时间查询
Aug 21 #Javascript
Vue按时间段查询数据组件使用详解
Aug 21 #Javascript
js绘制一条直线并旋转45度
Aug 21 #Javascript
AJAX XMLHttpRequest对象创建使用详解
Aug 20 #Javascript
基于vue.js仿淘宝收货地址并设置默认地址的案例分析
Aug 20 #Javascript
You might like
利用curl 多线程 模拟 并发的详解
2013/06/14 PHP
PHP连接MySQL的2种方法小结以及防止乱码
2014/03/11 PHP
php经典算法集锦
2015/11/14 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
2016/05/19 PHP
再谈PHP中单双引号的区别详解
2016/06/12 PHP
js innerHTML 的一些问题的解决方法
2008/06/22 Javascript
jquery.validate使用攻略 第三部
2010/07/01 Javascript
Javascript基础教程之while语句
2015/01/18 Javascript
jQuery中noconflict函数的实现原理分解
2015/02/03 Javascript
JavaScript 实现完美兼容多浏览器的复制功能代码
2015/04/28 Javascript
ashx文件获取$.ajax()方法发送的数据
2016/05/26 Javascript
使用Ajax生成的Excel文件并下载的实例
2016/11/21 Javascript
webstorm中vue语法的支持详解
2018/05/09 Javascript
jQuery实现输入框的放大和缩小功能示例
2018/07/21 jQuery
解决JavaScript中0.1+0.2不等于0.3问题
2018/10/23 Javascript
jQuery实现简单弹幕效果
2019/11/28 jQuery
解决Vue大括号字符换行踩的坑
2020/11/09 Javascript
[02:04]2014DOTA2国际邀请赛 DK一个时代的落幕
2014/07/21 DOTA
Python、Javascript中的闭包比较
2015/02/04 Python
Python验证企业工商注册码
2015/10/25 Python
python Matplotlib画图之调整字体大小的示例
2017/11/20 Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
2018/01/10 Python
Python3 Post登录并且保存cookie登录其他页面的方法
2018/12/28 Python
PyCharm导入python项目并配置虚拟环境的教程详解
2019/10/13 Python
Python开发之pip安装及使用方法详解
2020/02/21 Python
TensorFlow固化模型的实现操作
2020/05/26 Python
Python文件操作模拟用户登陆代码实例
2020/06/09 Python
美国南加州的原创极限运动潮牌:Vans(范斯)
2016/08/05 全球购物
澳大利亚新奇小玩意网站:Yellow Octopus
2017/12/28 全球购物
全球最大的房车租赁市场:Outdoorsy
2018/09/19 全球购物
Python如何实现单例模式
2016/06/03 面试题
个人求职信范文分享
2013/12/13 职场文书
银行办理业务介绍信
2014/01/18 职场文书
护士长2014年终工作总结
2014/11/11 职场文书
表扬稿范文
2015/01/17 职场文书
教师党员个人自我评价
2015/03/04 职场文书