您好,欢迎访问一九零五行业门户网

Vue如何实现拖拽穿梭框功能?四种方式分享(附代码)

vue项目中如何实现拖拽穿梭框功能?下面本篇文章给大家分享vue实现拖拽穿梭框功能四种方式,希望对大家有所帮助!
一、使用原生js实现拖拽点击打开视频讲解更加详细
<html>    <head>      <meta charset="utf-8" />      <title>lazyload</title>      <style>        .drag {          background-color: skyblue;          position: absolute;          line-height: 100px;          text-align: center;          width: 100px;          height: 100px;        }      </style>    </head>    <body>      <!-- left和top要写在行内样式里面 -->      <div style="left: 0; top: 0">按住拖动</div>      <script src="./jquery-3.6.0.min.js"></script>      <script>        // 获取dom元素        let dragdiv = document.getelementsbyclassname('drag')[0]        // 鼠标按下事件 处理程序        let putdown = function (event) {          dragdiv.style.cursor = 'pointer'          let offsetx = parseint(dragdiv.style.left) // 获取当前的x轴距离          let offsety = parseint(dragdiv.style.top) // 获取当前的y轴距离          let innerx = event.clientx - offsetx // 获取鼠标在方块内的x轴距          let innery = event.clienty - offsety // 获取鼠标在方块内的y轴距          // 按住鼠标时为div添加一个border          dragdiv.style.borderstyle = 'solid'          dragdiv.style.bordercolor = 'red'          dragdiv.style.borderwidth = '3px'          // 鼠标移动的时候不停的修改div的left和top值          document.onmousemove = function (event) {            dragdiv.style.left = event.clientx - innerx + 'px'            dragdiv.style.top = event.clienty - innery + 'px'            // 边界判断            if (parseint(dragdiv.style.left) <= 0) { dragdiv.style.left = '0px' } if (parseint(dragdiv.style.top) <= 0) { dragdiv.style.top = '0px' } if ( parseint(dragdiv.style.left) >=              window.innerwidth - parseint(dragdiv.style.width)            ) {              dragdiv.style.left =                window.innerwidth - parseint(dragdiv.style.width) + 'px'            }            if (              parseint(dragdiv.style.top) >=              window.innerheight - parseint(dragdiv.style.height)            ) {              dragdiv.style.top =                window.innerheight - parseint(dragdiv.style.height) + 'px'            }          }          // 鼠标抬起时,清除绑定在文档上的mousemove和mouseup事件          // 否则鼠标抬起后还可以继续拖拽方块          document.onmouseup = function () {            document.onmousemove = null            document.onmouseup = null            // 清除border            dragdiv.style.borderstyle = ''            dragdiv.style.bordercolor = ''            dragdiv.style.borderwidth = ''          }        }        // 绑定鼠标按下事件        dragdiv.addeventlistener('mousedown', putdown, false)      </script>    </body>  </html>
二、vue使用js实现拖拽穿梭框<template>  <div>    <h3 style="text-align: center">拖拽穿梭框</h3>    <div id="home" @mousemove="mousemove($event)">      <div class="tree-select-content">        <span class="select-content" :id="'mouse' + index" v-for="(item, index) in leftdata" :key="item.id" @mousedown="mousedown(index, 1)" @mouseup="mouseup(item, 1, index)" >          <span class="select-text">{{ item.label }}</span>          <span class="select-text-x" @click="handerclickx(item, index, 1)" >x</span >        </span>      </div>      <div class="tree-select-content">        <span class="select-content" :id="'deletemouse' + index" v-for="(item, index) in rightdata" :key="item.id" @mousedown="mousedown(index, 2)" @mouseup="mouseup(item, 2, index)" >          <span class="select-text">{{ item.label }}</span>          <span class="select-text-x" @click="handerclickx(item, index, 2)" >x</span >        </span>      </div>    </div>  </div></template><script>export default {  name: home,  data() {    return {      leftdata: [        { label: 首页, id: 1 },        { label: 咨询, id: 2 },        { label: 生活, id: 3 },        { label: 财富, id: 4 },        { label: 我的, id: 5 },      ],      rightdata: [{ label: 世界, id: 6 }],      ismovetrue: false,      ismove: false,      moveid: ,    };  },  mounted() {},  components: {},  methods: {    mousedown(index, val) {      this.ismovetrue = true;      if (val == 1) {        this.moveid = mouse + index;      } else {        this.moveid = deletemouse + index;      }    },    mousemove(event) {      if (this.ismovetrue) {        this.ismove = true;        document.getelementbyid(this.moveid).style.position = absolute;        document.getelementbyid(this.moveid).style.top = event.clienty + px;        document.getelementbyid(this.moveid).style.left = event.clientx + px;        document.getelementbyid(this.moveid).style.transform =          translate(-50%,-50%);      }    },    mouseup(item, val, index) {      if (!this.ismove) {        this.ismovetrue = false;        this.moveid = ;      }      if (this.ismovetrue && val == 2) {        this.$nexttick(() => {          this.rightdata.splice(index, 1);          this.leftdata.push(item);        });      } else if (this.ismovetrue && val) {        this.leftdata.splice(index, 1);        this.rightdata.push(item);      }      document.getelementbyid(this.moveid).style.display = none;      this.ismovetrue = false;      this.ismove = false;      this.moveid = ;    },    handerclickx(item, index, val) {      if (val == 1) {        this.leftdata.splice(index, 1);        this.rightdata.push(item);      } else {        this.rightdata.splice(index, 1);        this.leftdata.push(item);      }    },  },};</script><style scoped>#home {  display: flex;  justify-content: space-around;}.tree-select-content {  width: 40%;  height: 300px;  background: #f9faff;  border: 1px solid #dee0ec;  border-radius: 4px;  display: flex;  flex-wrap: wrap;  align-content: baseline;}.select-content {  width: max-content;  height: 20px;  padding: 1.6%;  border: 1px solid #d6dbed;  margin: 2% 1% 0;  background: #ffffff;  box-shadow: 0 0 8px 0 rgba(72, 119, 236, 0.1);  border-radius: 4px;}.select-content:hover span {  color: #4877ec;}.select-content:hover {  cursor: pointer;  background: #f8faff;  border: 1px solid #3e75f4;}.select-text {  font-size: 15px;  color: #2e2f36;  text-align: center;  font-weight: 400;}.select-text-x {  font-size: 15px;  color: #4877ec;  letter-spacing: 0;  font-weight: 400;  margin-left: 12px;  cursor: pointer;}</style>
效果图:
三、vue 拖拽组件 vuedraggablevuedraggable 是标准的组件式封装,并且将可拖动元素放进了 transition-group 上面,过渡动画都比较好。【相关推荐:vuejs视频教程】
使用方式:
yarn add vuedraggableimport vuedraggable from 'vuedraggable';
在使用的时候,可以通过 v-model 来双向绑定本地 data,如果需要更新或者是触发父组件监听的事件,可以在 updated() 中去 emit。
案例:
<template>  <div>    <div>{{ drag ? 拖拽中 : 拖拽停止 }}</div>    <!--使用draggable组件-->    <draggable v-model="myarray" chosenclass="chosen" forcefallback="true" group="people" animation="1000" @start="onstart" @end="onend" >      <transition-group>        <div class="item" v-for="element in myarray" :key="element.id">          {{ element.name }}        </div>      </transition-group>    </draggable>    <div class="color-list">      <div class="color-item" v-for="color in colors" v-dragging="{ item: color, list: colors, group: 'color' }" :key="color.text" >        {{ color.text }}      </div>    </div>  </div></template>  <style scoped>/*被拖拽对象的样式*/.item {  padding: 6px;  background-color: #fdfdfd;  border: solid 1px #eee;  margin-bottom: 10px;  cursor: move;}/*选中样式*/.chosen {  border: solid 1px #3089dc !important;}</style>  <script>//导入draggable组件import draggable from vuedraggable;export default {  //注册draggable组件  components: {    draggable,  },  data() {    return {      drag: false,      //定义要被拖拽对象的数组      myarray: [        { people: cn, id: 10, name: www.itxst.com },        { people: cn, id: 20, name: www.baidu.com },        { people: cn, id: 30, name: www.taobao.com },        { people: us, id: 40, name: www.yahoo.com },      ],      colors: [        {          text: aquamarine,        },        {          text: hotpink,        },        {          text: gold,        },        {          text: crimson,        },        {          text: blueviolet,        },        {          text: lightblue,        },        {          text: cornflowerblue,        },        {          text: skyblue,        },        {          text: burlywood,        },      ],    };  },  methods: {    //开始拖拽事件    onstart() {      this.drag = true;    },    //拖拽结束事件    onend() {      this.drag = false;    },  },};</script>
四、awe-dnd指令封装vue-dragging 的 npm 包的名字是 awe-dnd ,并不是 vue-dragging,这个库的特点是封装了 v-dragging 全局指令,然后通过全局指令去数据绑定等。
相比及 vuedraggable 来说, awe-dnd 是没有双向绑定(这里没有双向绑定并不是很严谨,准确的来说没有暴露双向绑定的方式),因此提供了事件,在拖拽结束的时候用来更新列表(不需要手动更新列表,其实内部是实现了双向绑定的)或者是去触发父组件监听的事件。
安装依赖:
npm install awe-dnd --saveyarn add awe-and
main.js
import vuednd from 'awe-dnd'vue.use(vuednd)
案例:
<template>  <div>    <div class="color-list">      <div class="color-item" v-for="color in colors" v-dragging="{ item: color, list: colors, group: 'color' }" :key="color.text" >        {{ color.text }}      </div>    </div>  </div></template><style scoped>/*被拖拽对象的样式*/.item {  padding: 6px;  background-color: #fdfdfd;  border: solid 1px #eee;  margin-bottom: 10px;  cursor: move;}/*选中样式*/.chosen {  border: solid 1px #3089dc !important;}</style><script>export default {  data() {    return {      drag: false,      colors: [        {          text: aquamarine,        },        {          text: hotpink,        },        {          text: gold,        },        {          text: crimson,        },        {          text: blueviolet,        },        {          text: lightblue,        },        {          text: cornflowerblue,        },        {          text: skyblue,        },        {          text: burlywood,        },      ],    };  },  methods: {},};</script>
若对您有帮助,请点击跳转到b站一键三连哦!感谢支持!!!
(学习视频分享:web前端开发、编程基础视频)
以上就是vue如何实现拖拽穿梭框功能?四种方式分享(附代码)的详细内容。
其它类似信息

推荐信息