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 相关文章推荐
一个报数游戏js版(约瑟夫环问题)
Aug 05 Javascript
用JS实现一个TreeMenu效果分享
Aug 28 Javascript
基于jQuery实现模拟页面加载进度条
Apr 01 Javascript
jquery实现点击其他区域时隐藏下拉div和遮罩层的方法
Dec 23 Javascript
使用JS轻松实现ionic调用键盘搜索功能(超实用)
Sep 06 Javascript
利用Node.js编写跨平台的spawn语句详解
Feb 12 Javascript
微信小程序中用WebStorm使用LESS
Mar 08 Javascript
JS实现身份证输入框的输入效果
Aug 21 Javascript
巧妙运用v-model实现父子组件传值的方法示例
Apr 07 Javascript
vue实现前台列表数据过滤搜索、分页效果
May 28 Javascript
vue 二维码长按保存和复制内容操作
Sep 22 Javascript
Vue提供的三种调试方式你知道吗
Jan 18 Vue.js
微信小程序实现聊天室
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 cli模式学习(PHP命令行模式)
2013/06/03 PHP
thinkphp实现数组分页示例
2014/04/13 PHP
smarty高级特性之过滤器的使用方法
2015/12/25 PHP
Js的MessageBox
2006/12/03 Javascript
IE与Firefox在JavaScript上的7个不同写法小结
2009/09/14 Javascript
JS实现在Repeater控件中创建可隐藏区域的代码
2010/09/16 Javascript
Jquery给基本控件的取值、赋值示例
2014/05/23 Javascript
jQuery中append()方法用法实例
2014/12/25 Javascript
scrollWidth,clientWidth,offsetWidth的区别
2015/01/13 Javascript
JavaScript中消除闭包的一般方法介绍
2015/03/16 Javascript
JavaScript分页功能的实现方法
2015/04/25 Javascript
JavaScript实现网页加载进度条代码超简单
2015/09/21 Javascript
学习JavaScript事件流和事件处理程序
2016/01/25 Javascript
javascript下使用Promise封装FileReader
2016/02/19 Javascript
jQuery中animate()的使用方法及解决$(”body“).animate({“scrollTop”:top})不被Firefox支持的问题
2017/04/04 jQuery
vue插件mescroll.js实现移动端上拉加载和下拉刷新
2019/03/07 Javascript
Vue 中使用富文本编译器wangEditor3的方法
2019/09/26 Javascript
用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化
2015/04/01 Python
简单谈谈Python中的json与pickle
2017/07/19 Python
Python爬取当当、京东、亚马逊图书信息代码实例
2017/12/09 Python
python石头剪刀布小游戏(三局两胜制)
2021/01/20 Python
Python + Flask 实现简单的验证码系统
2019/10/01 Python
Python+Dlib+Opencv实现人脸采集并表情判别功能的代码
2020/07/01 Python
用HTML5中的Canvas结合公式绘制粒子运动的教程
2015/05/08 HTML / CSS
改变生活的男士内衣:SAXX Underwear
2019/08/28 全球购物
Geekbuying波兰:购买中国电子产品
2019/10/20 全球购物
德国50岁以上交友网站:Lebensfreunde
2020/03/18 全球购物
英国婴儿产品专家:Samuel Johnston
2020/04/20 全球购物
学期研究性学习个人的自我评价
2014/01/09 职场文书
房地产财务部员工岗位职责
2014/03/12 职场文书
英语课外活动总结
2014/08/27 职场文书
党支部三会一课计划
2014/09/24 职场文书
投标文件签署授权委托书范本
2014/10/12 职场文书
公司员工违纪检讨书
2015/05/05 职场文书
Python手拉手教你爬取贝壳房源数据的实战教程
2021/05/21 Python
java版 联机五子棋游戏
2022/05/04 Java/Android