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>
相关推荐
时光の尘9 分钟前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
以后不吃煲仔饭23 分钟前
Java基础夯实——2.7 线程上下文切换
java·开发语言
进阶的架构师24 分钟前
2024年Java面试题及答案整理(1000+面试题附答案解析)
java·开发语言
前端拾光者28 分钟前
利用D3.js实现数据可视化的简单示例
开发语言·javascript·信息可视化
程序猿阿伟30 分钟前
《C++ 实现区块链:区块时间戳的存储与验证机制解析》
开发语言·c++·区块链
傻啦嘿哟1 小时前
如何使用 Python 开发一个简单的文本数据转换为 Excel 工具
开发语言·python·excel
大数据编程之光1 小时前
Flink Standalone集群模式安装部署全攻略
java·大数据·开发语言·面试·flink
初九之潜龙勿用1 小时前
C#校验画布签名图片是否为空白
开发语言·ui·c#·.net
Dola_Pan1 小时前
C语言:数组转换指针的时机
c语言·开发语言·算法
ExiFengs1 小时前
实际项目Java1.8流处理, Optional常见用法
java·开发语言·spring