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 相关文章推荐
Eclipse引入jquery报错如何解决
Dec 01 Javascript
JS实现回到页面顶部动画效果的简单实例
May 24 Javascript
javascript实现的全国省市县无刷新多级关联菜单效果代码
Aug 01 Javascript
Js遍历键值对形式对象或Map形式的方法
Aug 08 Javascript
jQuery插件之validation插件
Mar 29 jQuery
利用vscode编写vue的简单配置详解
Jun 17 Javascript
详解用webpack2搭建angular2的项目
Jun 22 Javascript
Angular 2父子组件之间共享服务通信的实现
Jul 04 Javascript
微信小程序实战篇之购物车的实现代码示例
Nov 30 Javascript
使用vue2实现购物车和地址选配功能
Mar 29 Javascript
Vuex 使用及简单实例(计数器)
Aug 29 Javascript
了解javascript中的Dom操作
May 27 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利用cookie实现访问次数统计代码
2011/05/19 PHP
用 Composer构建自己的 PHP 框架之构建路由
2014/10/30 PHP
php短信接口代码
2016/05/13 PHP
php preg_match的匹配不同国家语言实例
2016/12/29 PHP
PHP调用全国天气预报数据接口查询天气示例
2019/02/20 PHP
JSON 和 JavaScript eval使用说明
2010/06/13 Javascript
jQuery遍历Form示例代码
2013/09/03 Javascript
使用 js+正则表达式为关键词添加链接
2014/11/11 Javascript
js禁止页面刷新与后退的方法
2015/06/08 Javascript
jQuery可见性过滤器:hidden和:visibility用法实例
2015/06/24 Javascript
jquery实现多条件筛选特效代码分享
2015/08/28 Javascript
分享我的jquery实现下拉菜单心的
2015/11/29 Javascript
javascript性能优化之事件委托实例详解
2015/12/12 Javascript
jquery实现文字单行横移或翻转(上下、左右跳转)
2017/01/08 Javascript
第一次记录Bootstrap table学习笔记(1)
2017/05/18 Javascript
浅谈Vue网络请求之interceptors实际应用
2018/02/28 Javascript
puppeteer库入门初探
2019/01/09 Javascript
three.js 制作动态二维码的示例代码
2020/07/31 Javascript
用Python编写一个简单的Lisp解释器的教程
2015/04/03 Python
Django 连接sql server数据库的方法
2018/06/30 Python
python元组和字典的内建函数实例详解
2019/10/22 Python
python将数据插入数据库的代码分享
2020/08/16 Python
CSS3之2D与3D变换的实现方法
2019/01/28 HTML / CSS
资生堂美国官网:Shiseido美国
2016/09/02 全球购物
巴黎卡诗美国官方网站:始于1964年的头发头皮护理专家
2017/07/10 全球购物
荷兰牛仔裤网上商店:Jeans Centre
2018/04/03 全球购物
大学毕业生工作的自我评价
2013/10/01 职场文书
白酒市场开发计划书
2014/01/09 职场文书
企业内控岗位的职责
2014/02/07 职场文书
贺卡寄语大全
2014/04/11 职场文书
广播体操口号
2014/06/18 职场文书
第二批党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
PHP策略模式写法
2021/04/01 PHP
pytorch 如何使用batch训练lstm网络
2021/05/28 Python
Logback 使用TurboFilter实现日志级别等内容的动态修改操作
2021/08/30 Java/Android
Python软件包安装的三种常见方法
2022/07/07 Python