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>
相关推荐
qiyi.sky2 分钟前
JavaWeb——Vue组件库Element(3/6):常见组件:Dialog对话框、Form表单(介绍、使用、实际效果)
前端·javascript·vue.js
煸橙干儿~~5 分钟前
分析JS Crash(进程崩溃)
java·前端·javascript
哪 吒7 分钟前
华为OD机试 - 几何平均值最大子数(Python/JS/C/C++ 2024 E卷 200分)
javascript·python·华为od
我是陈泽10 分钟前
一行 Python 代码能实现什么丧心病狂的功能?圣诞树源代码
开发语言·python·程序员·编程·python教程·python学习·python教学
安冬的码畜日常15 分钟前
【D3.js in Action 3 精译_027】3.4 让 D3 数据适应屏幕(下)—— D3 分段比例尺的用法
前端·javascript·信息可视化·数据可视化·d3.js·d3比例尺·分段比例尺
优雅的小武先生21 分钟前
QT中的按钮控件和comboBox控件和spinBox控件无法点击的bug
开发语言·qt·bug
虽千万人 吾往矣27 分钟前
golang gorm
开发语言·数据库·后端·tcp/ip·golang
创作小达人30 分钟前
家政服务|基于springBoot的家政服务平台设计与实现(附项目源码+论文+数据库)
开发语言·python
郭二哈32 分钟前
C++——list
开发语言·c++·list
杨荧33 分钟前
【JAVA开源】基于Vue和SpringBoot的洗衣店订单管理系统
java·开发语言·vue.js·spring boot·spring cloud·开源