vue实现移动端拖动排序


Posted in Javascript onAugust 21, 2020

本文实例为大家分享了vue实现移动端拖动排序的具体代码,供大家参考,具体内容如下

效果

vue实现移动端拖动排序

代码:

<template>
 <div>
 <div class="mainDiv" id="columns">
 <div id="child"
  class="childDiv"
  v-for="(option,index) in options"
  :key="index"
 >
 {{option}}
 </div>

 <!-- <div id="test" class="test"
  @touchstart="down" @touchmove="move" @touchend="end"
 >什么都没有
 </div>-->
 </div>
 </div>
</template>
<script>
 export default {
 name: "touchMove",
 data() {
  return {
  options: ['选项1', '选项2', '选项3', '选项4'],
  columns: undefined,
  flags: false,
  position: {x: 0, y: 0},
  nx: '', ny: '', dx: '', dy: '', xPum: '', yPum: '',
  }
 },
 mounted() {
  this.columns = document.querySelectorAll('#child');
  let num = 0;
  for (let i of this.columns) {
  i.style.top = (i.offsetHeight * num) + 'px';
  i.addEventListener('touchstart', this.down);
  i.addEventListener('touchmove', this.move);
  i.addEventListener('touchend', this.end);
  num ++;
  }
 },
 methods: {
  down(e) {
  e.preventDefault();
  this.flags = true;
  var touch;
  if (e.touches) {
   touch = e.touches[0];
  } else {
   touch = e;
  }
  /*touch.clientX clientY 鼠标点击的位置与视图窗口的距离
  * e.target.offsetLeft offsetTop 鼠标点击的div与父元
  * 素的边框距离,父元素必须为定位样式,不然认为父元素为body
  * */
  this.position.x = touch.clientX;
  this.position.y = touch.clientY;
  this.dx = e.target.offsetLeft;
  this.dy = e.target.offsetTop;
  },
  move(e) {
  if (this.flags) {
   var touch;
   if (e.touches) {
   touch = e.touches[0];
   } else {
   touch = e;
   }
   this.nx = touch.clientX - this.position.x;
   this.ny = touch.clientY - this.position.y;//移动的距离
   this.xPum = this.dx + this.nx;
   this.yPum = this.dy + this.ny;
   e.target.style.left = this.xPum + 'px';
   e.target.style.top = this.yPum + 'px';
  }
  },
  end(e) {
  //处理边界问题
  let right= e.target.offsetLeft + e.target.offsetWidth;
  let bottom = e.target.offsetTop + e.target.offsetHeight;
  if(e.target.offsetLeft <= 0 || right >= e.target.offsetParent.offsetWidth){
   e.target.style.left = 0 + 'px';
  }
  if(e.target.offsetTop <= 0 || bottom >= e.target.offsetParent.offsetHeight){
   e.target.style.top = 0 + 'px';
  }
  this.dataTransfer(e);
  this.flags = false;
  },
  dataTransfer(e){
  let eleTop = e.target.offsetTop + Math.round(e.target.offsetHeight / 2);//找到当前元素的中间位置
  let arr = Array.from(this.columns);//将nodelist转为array
  let index = arr.indexOf(e.target);//找到当前元素下标
  for(let i in arr){
   //如果当前元素进入另一个元素的位置,将他们的值互换,位置还原
   if(eleTop > arr[i].offsetTop && eleTop < (arr[i].offsetTop + arr[i].offsetHeight)){
   //值互换,位置还原(保证数组的序列数据不变)
   let temp = arr[index].innerText;
   arr[index].innerText = arr[i].innerText;
   arr[i].innerText = temp;
   }
  }
  let num = 0;
  for (let i of this.columns) {
   i.style.top = (i.offsetHeight * num) + 'px';
   num ++;
  }
  }
 }
 }
</script>
<style scoped>
 .mainDiv {
 position: absolute;
 height: 500px;
 width: 100%;
 border: 3px solid red;
 border-radius: 10px;
 margin: 10px;
 }

 .mainDiv > .childDiv {
 position: absolute;
 height: 50px;
 width: 90%;
 background-color: blue;
 border: 2px solid;
 border-radius: 10px;
 margin: 1px auto;
 padding: 10px;
 text-align: center;
 }


 .test {
 position: relative;
 height: 50px;
 width: auto;
 background-color: red;
 border: 2px solid;
 border-radius: 3px;
 margin: 1px 0 1px;
 padding: 10px;
 text-align: center;
 }

</style>

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

Javascript 相关文章推荐
利用javascript解决图片缩放及其优化的代码
May 23 Javascript
JQuery中Ajax()的data参数类型实例分析
Dec 15 Javascript
EasyUI Pagination 分页的两种做法小结
Jul 09 Javascript
jQuery实现点击行选中或取消CheckBox的方法
Aug 01 Javascript
Vue.js之slot深度复制详解
Mar 10 Javascript
简述JS浏览器的三种弹窗
Jul 15 Javascript
对angular 实时更新模板视图的方法$apply详解
Oct 09 Javascript
详解webpack+ES6+Sass搭建多页面应用
Nov 05 Javascript
node.js 如何监视文件变化
Sep 01 Javascript
用js实现放大镜效果
Oct 28 Javascript
Javascript文本框脚本实现方法解析
Oct 30 Javascript
一分钟学会JavaScript中的try-catch
Dec 14 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
微信小程序以7天为周期连续签到7天功能效果的示例代码
Aug 20 #Javascript
You might like
PHP与javascript的两种交互方式
2006/10/09 PHP
php简单分页类实现方法
2015/02/26 PHP
PHP实现微信网页授权开发教程
2016/01/19 PHP
JS实现支持Ajax验证的表单插件
2016/03/24 Javascript
JavaScript代码性能优化总结(推荐)
2016/05/16 Javascript
vue2.0+webpack环境的构造过程
2016/11/08 Javascript
three.js绘制地球、飞机与轨迹的效果示例
2017/02/28 Javascript
JS设计模式之数据访问对象模式的实例讲解
2017/09/30 Javascript
VueJs 将接口用webpack代理到本地的方法
2017/11/27 Javascript
Vue 去除路径中的#号
2018/04/19 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
2018/10/10 Javascript
如何解决js函数防抖、节流出现的问题
2019/06/17 Javascript
layui动态表头的实现代码
2019/08/22 Javascript
移动端手指操控左右滑动的菜单
2019/09/08 Javascript
Element图表初始大小及窗口自适应实现
2020/07/10 Javascript
[01:15:56]2018DOTA2亚洲邀请赛3月30日 小组赛A组 TNC VS Newbee
2018/03/31 DOTA
详解Python中break语句的用法
2015/05/14 Python
Django中url的反向查询的方法
2018/03/14 Python
PyTorch上搭建简单神经网络实现回归和分类的示例
2018/04/28 Python
Python返回数组/List长度的实例
2018/06/23 Python
python判断所输入的任意一个正整数是否为素数的两种方法
2019/06/27 Python
Django实现web端tailf日志文件功能及实例详解
2019/07/28 Python
浅析PEP572: 海象运算符
2019/10/15 Python
英国最大的在线运动补充剂商店:Discount Supplements
2017/06/03 全球购物
国际贸易专业个人求职信格式
2014/02/02 职场文书
机械专业应届毕业生自荐书
2014/06/12 职场文书
体育系毕业生自荐信
2014/06/28 职场文书
教师查摆问题自查报告
2014/10/11 职场文书
商铺门面租房协议书
2014/10/21 职场文书
服务整改报告
2014/11/06 职场文书
给老婆的保证书
2015/01/16 职场文书
李强为自己工作观后感
2015/06/11 职场文书
干货:如何写好工作计划!
2019/05/17 职场文书
Javascript 解构赋值详情
2021/11/17 Javascript
JavaScript流程控制(分支)
2021/12/06 Javascript
你知道Java Spring的两种事务吗
2022/03/16 Java/Android