vue中三种方式实现元素鼠标拖动效果代码

vue中二种方式实现元素鼠标拖动效果代码

鼠标拖动的原理就是实时计算鼠标移动的相对位置,改变元素对象的位置,那么浏览器窗体的一些属性我们先了解下

clientY 指的是距离可视页面左上角的距离

pageY 指的是距离可视页面左上角的距离(不受页面滚动影响)

screenY 指的是距离屏幕左上角的距离

layerY 指的是找到它或它父级元素中最近具有定位的左上角距离

offsetY 指的是距离它自己左上角的距离

一张图带大家简单了解了解

vue中二种方式实现元素鼠标拖动效果代码

vue中二种方式实现元素鼠标拖动效果代码

拖动效果如上,我们来通过二种方式实现拖动效果

一、vue自定义指令directive方式

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>BFW NEW PAGE</title>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/vue.2.2.min.js"></script>

    <style>
    </style>
</head>
<body>
    <div id="box">
        位置
        <br>x:{{val.x}} <br>y:{{val.y}}
        <div v-drag="greet" id="drag" :style="style">
            注意这里要通过指令绑定函数将当前元素的位置数据传出来
        </div>
    </div>
        <script type="text/javascript">
      
            Vue.directive('drag', //自定义指令

                {
                    bind: function (el, binding) {
                        let oDiv = el; //当前元素
                        let self = this; //上下文
                        oDiv.onmousedown = function (e) {
                            //鼠标按下,计算当前元素距离可视区的距离
                            let disX = e.clientX - oDiv.offsetLeft;
                            let disY = e.clientY - oDiv.offsetTop;

                            document.onmousemove = function (e) {
                                //通过事件委托,计算移动的距离
                                let l = e.clientX - disX;
                                let t = e.clientY - disY;
                                //移动当前元素
                                oDiv.style.left = l + 'px';
                                oDiv.style.top = t + 'px';
                                //将此时的位置传出去
                                binding.value({
                                    x: e.pageX, y: e.pageY
                                })
                            };
                            document.onmouseup = function (e) {

                                document.onmousemove = null;
                                document.onmouseup = null;
                            };
                        };
                    }
                }
            );
            window.onload = function () {
                let vm = new Vue({
                    el: '#box',
                    data: {
                        val: '123',
                        style: {
                            width: '100px',
                            height: '100px',
                            background: 'aqua',
                            position: 'absolute',
                            right: '30px',
                            top: 0
                        }
                    },
                    methods: {
                        //接受传来的位置数据,并将数据绑定给data下的val
                        greet(val) {
                            vm.val = val;
                        }
                    },
                });
            }

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

二、计算鼠标偏移量

<!DOCTYPE html>
<html>
<head>
    ...

点击查看剩余70%

{{collectdata}}

网友评论0