js中实现vue2-org-tree添加自定义拖拽功能

一. 主要思路

1.1通过绑定自定义的指令,获取需要拖动的父子元素,

1.2.添加鼠标按下事件onmousedown,计算出鼠标的相对位置odiv.offsetLeft与odiv.offsetTop,

1.3.鼠标移动事件onmousemove当鼠标移动时触发,移动的时候相对位置加上偏移距离得到对应的坐标点,

1.4.odiv.style.left与 odiv.style.top动态给对应的元素添加位置样式,

1.5.onmouseup():鼠标抬起事件。当鼠标抬起触发,// 移除对鼠标移动事件的监听

document.onmousemove = null; document.onmouseup = null;

1.6.切换页面初始化加载坐标位置保持页面垂直居中对齐// 初始化初始坐标

二. 分布实施

2.1 template结构,cursor:move->鼠标移动上变成可拖拽的样式,绑定唯一ID 获取初始化坐标原点
html 复制代码
<template>
  <div>
    <div class="AllTree">
            <!-- cursor:move->鼠标移动上变成可拖拽的样式 -->
            <!-- 通过绑定唯一ID 获取初始化坐标原点 -->
            <vue2-org-tree
            style="#fafafa;cursor:move"
            v-drag
            id="dragFather"
            :data="treeData"
           />
        </div>
  </div>
</template>
2.2 数据结构
javascript 复制代码
data() {
    return {
      // 数据
      treeData: {
                id: 0,
                name: "",
                children: []
            },
    };
  },
2.3 activated()切换页面初始化加载坐标位置保持页面垂直居中对齐,获取id
javascript 复制代码
// 切换页面初始化加载坐标位置保持页面垂直居中对齐
  activated() {
      // 初始化初始坐标
      const dialogHeaderEl = document.querySelector('#dragFather')
      dialogHeaderEl.style.left=0 + 'px';
      dialogHeaderEl.style.top=0 + 'px';
  },
2.4 自定义拖拽指令
javascript 复制代码
// 开启拖拽的指令
      directives: {
        drag: {
            // 指令的定义
            bind: function (el) {
                var odiv = el // 获取当前元素
                let isMouseDown=false;//鼠标按下标记
                // onmousedown():鼠标按下事件。当鼠标按下时触发。
                odiv.onmousedown = (e) => {
                    if(e.button===0&&!isMouseDown){
                        // 算出鼠标相对元素的位置
                        let offsetLeft = odiv.offsetLeft
                        let offsetTop = odiv.offsetTop
                        var disX = e.clientX
                        var disY = e.clientY
                        // onmosemove():鼠标移动事件。当鼠标移动时触发
                        document.onmousemove = (e) => {
                            // 用鼠标的位置减去鼠标相对元素的位置,得到元素的位置
                            // 结构沿X轴发生翻转X轴坐标变成从左到右计算的时候相反计算,
                            var left = disX - e.clientX 
                            var top = e.clientY - disY
                            // 移动当前元素
                            odiv.style.left = (left + offsetLeft) + 'px'
                            odiv.style.top = (top + offsetTop) + 'px'
                        }
                        isMouseDown=true
                    }
                     // onmouseup():鼠标抬起事件。当鼠标抬起触发
                    //  e.button===0代表点击左键
                    document.onmouseup = (e) => {
                        if(e.button===0){
                            isMouseDown=false;
                            // 移除对鼠标移动事件的监听
                            document.onmousemove = null
                            document.onmouseup = null
                        }
                    }
                }
            }
        }
    },
2.5 style样式
css 复制代码
<style scoped>
::-webkit-scrollbar {
    /*隐藏滚轮*/
    display: none !important;
    }
</style>
<style lang="less" >
// 整体的结构设置
.AllTree {
    font-size: 12px;
    transform: rotateY(180deg);
    overflow: auto;             
    // 修改组件内置的样式
    .org-tree-node-label .org-tree-node-label-inner {
        cursor: pointer;
        padding: 0;
    }
    // 子节点
    .org-tree-container {
        position: relative;     /*定位*/
        display: flex;
        justify-content: center;
        align-items: center;
        min-height: 600px;
    }
}

// 节点样式
.ReNode {
    height: 40px;
    min-width: 50px;
    transform: rotateY(180deg);
    background-color: rgb(238, 244, 246);
    display: flex;
    line-height: 40px;
    padding: 0 10px;
}

</style>

三. 特别注意

由于此图结构是从右到左展示,市面上的树形结构一般是由从左到右,从上到下;要求的结构是从右到左所以在进行编写的时候利用 transform: rotateY(180deg);进行了翻转x轴发生了变化所以此处对于坐标的计算有所不同

四.代码汇总

html 复制代码
<template>
  <div>
    <div class="AllTree">
            <!-- cursor:move->鼠标移动上变成可拖拽的样式 -->
            <!-- 通过绑定唯一ID 获取初始化坐标原点 -->
            <vue2-org-tree
            style="#fafafa;cursor:move"
            v-drag
            id="dragFather"
            :data="treeData"
           />
        </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      // 数据
      treeData: {
                id: 0,
                name: "",
                children: []
            },
    };
  },
  // 切换页面初始化加载坐标位置保持页面垂直居中对齐
  activated() {
      // 初始化初始坐标
      const dialogHeaderEl = document.querySelector('#dragFather')
      dialogHeaderEl.style.left=0 + 'px';
      dialogHeaderEl.style.top=0 + 'px';
  },
      // 开启拖拽的指令
      directives: {
        drag: {
            // 指令的定义
            bind: function (el) {
                var odiv = el // 获取当前元素
                let isMouseDown=false;//鼠标按下标记
                // onmousedown():鼠标按下事件。当鼠标按下时触发。
                odiv.onmousedown = (e) => {
                    if(e.button===0&&!isMouseDown){
                        // 算出鼠标相对元素的位置
                        let offsetLeft = odiv.offsetLeft
                        let offsetTop = odiv.offsetTop
                        var disX = e.clientX
                        var disY = e.clientY
                        // onmosemove():鼠标移动事件。当鼠标移动时触发
                        document.onmousemove = (e) => {
                            // 用鼠标的位置减去鼠标相对元素的位置,得到元素的位置
                            // 结构沿X轴发生翻转X轴坐标变成从左到右计算的时候相反计算,
                            var left = disX - e.clientX 
                            var top = e.clientY - disY
                            // 移动当前元素
                            odiv.style.left = (left + offsetLeft) + 'px'
                            odiv.style.top = (top + offsetTop) + 'px'
                        }
                        isMouseDown=true
                    }
                     // onmouseup():鼠标抬起事件。当鼠标抬起触发
                    //  e.button===0代表点击左键
                    document.onmouseup = (e) => {
                        if(e.button===0){
                            isMouseDown=false;
                            // 移除对鼠标移动事件的监听
                            document.onmousemove = null
                            document.onmouseup = null
                        }
                    }
                }
            }
        }
    },
};
</script>

<style scoped>
::-webkit-scrollbar {
    /*隐藏滚轮*/
    display: none !important;
    }
</style>
<style lang="less" >
// 整体的结构设置
.AllTree {
    font-size: 12px;
    transform: rotateY(180deg);
    overflow: auto;             
    // 修改组件内置的样式
    .org-tree-node-label .org-tree-node-label-inner {
        cursor: pointer;
        padding: 0;
    }
    // 子节点
    .org-tree-container {
        position: relative;     /*定位*/
        display: flex;
        justify-content: center;
        align-items: center;
        min-height: 600px;
    }
}

// 节点样式
.ReNode {
    height: 40px;
    min-width: 50px;
    transform: rotateY(180deg);
    background-color: rgb(238, 244, 246);
    display: flex;
    line-height: 40px;
    padding: 0 10px;
}

</style>
相关推荐
m0_748236114 分钟前
Calcite Web 项目常见问题解决方案
开发语言·前端·rust
倔强的石头10612 分钟前
【C++指南】类和对象(九):内部类
开发语言·c++
Watermelo61717 分钟前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
半盏茶香1 小时前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
Evand J2 小时前
LOS/NLOS环境建模与三维TOA定位,MATLAB仿真程序,可自定义锚点数量和轨迹点长度
开发语言·matlab
LucianaiB2 小时前
探索CSDN博客数据:使用Python爬虫技术
开发语言·爬虫·python
一个处女座的程序猿O(∩_∩)O2 小时前
小型 Vue 项目,该不该用 Pinia 、Vuex呢?
前端·javascript·vue.js
Ronin3052 小时前
11.vector的介绍及模拟实现
开发语言·c++
计算机学长大白3 小时前
C中设计不允许继承的类的实现方法是什么?
c语言·开发语言
PieroPc4 小时前
Python 写的 智慧记 进销存 辅助 程序 导入导出 excel 可打印
开发语言·python·excel