[ 详细注释 ] VUE实现鼠标拖动DOM代码

```
<!DOCTYPE html>
<html lang="en">
<head>

    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <title>鼠标拖动</title>
    <style>
        .div-window1, .div-window2 {
            margin: 0;
            padding: 0;
            position: absolute;
        }

        .div-window1 {
            top: 200px;
            left: 200px;
            background-color: gray;
            width: 100px;
            height: 100px;
        }

        .div-window1:hover {
            background-color: red;
        }

        .div-window2 {
            top: 350px;
            left: 350px;
            background-color: green;
            width: 100px;
            height: 100px;
        }

        .div-window2:hover {
            background: red;
        }
    </style>
</head>
<body>
    <div id="app">
        <div id="window1" class="div-window1" 
            v-on:mousedown="onMouseDown('window1', $event)"
            v-on:mousemove="onMouseMove($event)"
            v-on:mouseout="onMouseOut('window1')"
            >
        </div>

        <div id="window2" class="div-window2" 
            v-on:mousedown="onMouseDown('window2', $event)"
            v-on:mousemove="onMouseMove($event)"
            v-on:mouseout="onMouseOut('window2')"
        >
        </div>
    </div>

    <script>
        window.onload = function () {
            var vm = new Vue({
                el: '#app',
                data: {
                    isDebug: true,  // debug开关, 打开则在Console输出相关日志
                    choiceDom: null,  // 鼠标选中的DOM
                    mouse: {  // 鼠标相关属性
                        init: {  // 鼠标移动前的位置属性, 如果鼠标还未Click过, 则为空
                            x: null,  // 鼠标x轴定位
                            y: null,  // 鼠标y轴定位
                        }
                    },
                },
                methods: {
                    onMouseOut: function (domID) {  
                    // 鼠标若移动太快, 则会划出DIV, 本方法即对此事件的处理
                        if (this.choiceDom === null) {  // 如果尚未选中DOM
                            return;  // 立即退出方法
                        }

                        if (this.choiceDom.id === domID) {  // 如果离开的DOM是当前选中的DOM
                            this.choiceDom = null;  // 则将选中的DON置空
                        }
                    },

                    onMouseDown: function (domID, event) {  // 当鼠标按下某DOM
                        this.choiceDom = document.getElementById(domID);  // 获取dom object
                        this.choiceDom.cursor = "move"  // 修改鼠标指针样式
                        this.mouse.init.x = event.clientX;  // 获取鼠标X轴定位
                        this.mouse.init.y = event.clientY;  // 获取鼠标Y轴定位

                        if (this.isDebug) {
                            console.log(`鼠标已选中[ ${domID} ]`);
                            console.log(`鼠标初始位置为X:${event.clientX}px, Y:${event.clientY}px`);
                        }
                    },

                    onMouseUp: function () {  // 鼠标左键弹起处理
                        this.choiceDom = null;  // 置空选中元素
                        console.log(`鼠标已被放开`);
                    },

                    onMouseMove: function (event) {
                        if (this.choiceDom === null) {  // 如果没有选中的元素
                            return;  // 立即结束
                        }

                        let domLeft = this.choiceDom.offsetLeft + event.clientX - this.mouse.init.x; 
                        // 当前DIV的X轴位置 + 当前鼠标x轴位置 - 鼠标移动前的位置,
                        // 后两者减法计算即为计算鼠标X轴偏移量

                        let domTop = this.choiceDom.offsetTop + event.clientY - this.mouse.init.y;
                        // 当前DIV的Y轴位置 + 当前鼠标y轴位置 - 鼠标移动前的位置, 
                        // 后两者减法计算即为计算鼠标Y轴偏移量

                        this.mouse.init.x = event.clientX // 更新鼠标X轴位置
                        this.mouse.init.y = event.clientY // 更新鼠标Y轴位置

                        this.choiceDom.style.left = `${domLeft}px`;  // DIV Y轴位置赋值, 即Y轴移动
                        this.choiceDom.style.top = `${domTop}px`;  // DIV X轴位置赋值, 即X轴移动
                    }
                },

                mounted: function () {
                    window.onmouseup = this.onMouseUp;  // 设置监听全窗口鼠标弹起事件
                }
            })
        }

    </script>
</body>
</html>
```

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容