首页前端开发其他前端知识vue项目中实现拖拽穿梭框有哪些方法,代码是什么

vue项目中实现拖拽穿梭框有哪些方法,代码是什么

时间2024-03-25 03:58:03发布访客分类其他前端知识浏览430
导读:在这篇文章中我们会学习到关于“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 拖拽组件 vuedraggable

vuedraggable 是标准的组件式封装,并且将可拖动元素放进了 transition-group 上面,过渡动画都比较好。【相关推荐:vuejs视频教程】

使用方式:

yarn add vuedraggable

import 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 --save
yarn 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>
    

感谢各位的阅读,以上就是“vue项目中实现拖拽穿梭框有哪些方法,代码是什么”的内容了,通过以上内容的阐述,相信大家对vue项目中实现拖拽穿梭框有哪些方法,代码是什么已经有了进一步的了解,如果想要了解更多相关的内容,欢迎关注网络,网络将为大家推送更多相关知识点的文章。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: vue项目中实现拖拽穿梭框有哪些方法,代码是什么
本文地址: https://pptw.com/jishu/652524.html
PHP中eval函数怎么用,如何禁止eval 如何用Go语言实现JSON解析器,方法是什么

游客 回复需填写必要信息