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 相关文章推荐
jquery入门必备的基本认识及实例(整理)
Jun 24 Javascript
详解页面滚动值scrollTop在FireFox与Chrome浏览器间的兼容问题
Dec 03 Javascript
轻松实现jquery手风琴效果
Jan 14 Javascript
理解javascript中Map代替循环
Feb 26 Javascript
Javascript的动态增加类的实现方法
Oct 20 Javascript
javascript 判断用户有没有操作页面
Oct 17 Javascript
JavaScript模板引擎实现原理实例详解
Dec 14 Javascript
vue中的过滤器实例代码详解
Jun 06 Javascript
JS字符串与二进制的相互转化实例代码详解
Jun 28 Javascript
vue表单数据交互提交演示教程
Nov 13 Javascript
vue element-ui实现动态面包屑导航
Dec 23 Javascript
jQuery 常用特效实例小结【显示与隐藏、淡入淡出、滑动、动画等】
May 19 jQuery
微信小程序实现聊天室
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
配置支持SSI
2006/11/25 PHP
php中一个完整表单处理实现代码
2011/11/10 PHP
php bootstrap实现简单登录
2016/03/08 PHP
php处理复杂xml数据示例
2016/07/11 PHP
解决laravel 出现ajax请求419(unknown status)的问题
2019/09/03 PHP
UserData用法总结 lanyu出品
2010/07/01 Javascript
ie支持function.bind()方法实现代码
2012/12/27 Javascript
js获得当前时区夏令时发生和终止的时间代码
2014/02/23 Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
2014/10/07 Javascript
Javascript基础教程之比较操作符
2015/01/18 Javascript
JS+CSS实现的日本门户网站经典选项卡导航效果
2015/09/27 Javascript
xmlplus组件设计系列之按钮(2)
2017/04/26 Javascript
vue中本地静态图片路径写法
2018/03/06 Javascript
jQuery+ajax读取json数据并按照价格排序示例
2018/03/28 jQuery
vue 对axios get pust put delete封装的实例代码
2020/01/05 Javascript
基于JS实现快速读取TXT文件
2020/08/25 Javascript
python实现数据库跨服务器迁移
2018/04/12 Python
Python 编码规范(Google Python Style Guide)
2018/05/05 Python
对pandas数据判断是否为NaN值的方法详解
2018/11/06 Python
python实现矩阵打印
2019/03/02 Python
Python3.7+tkinter实现查询界面功能
2019/12/24 Python
使用Python三角函数公式计算三角形的夹角案例
2020/04/15 Python
HTML5页面直接调用百度地图API获取当前位置直接导航目的地的实现代码
2018/03/02 HTML / CSS
Bluebella德国官网:英国性感内衣和睡衣品牌
2019/11/08 全球购物
自我鉴定的范文
2013/10/03 职场文书
电子商务应届生自我鉴定
2014/01/13 职场文书
高中数学教学反思
2014/01/30 职场文书
学校万圣节活动方案
2014/02/13 职场文书
办公自动化毕业生求职信
2014/03/09 职场文书
如何写早恋检讨书
2014/09/10 职场文书
市场部经理岗位职责
2015/02/02 职场文书
手术室护士个人总结
2015/02/13 职场文书
小学数学新课改心得体会
2016/01/22 职场文书
分家协议书范本
2016/03/22 职场文书
Redis基于Bitmap实现用户签到功能
2021/06/20 Redis
用Python实现屏幕截图详解
2022/01/22 Python