美文网首页
封装鼠标拖拽

封装鼠标拖拽

作者: 你怀中的猫 | 来源:发表于2022-04-07 15:07 被阅读0次

    1、拖拽插件的参数

    参数 参数表示的意义
    el 要被拖拽的对象
    dire "x" , "y" 不传的时候两个方向都能拖拽
    dragStart function(el,e) {} //监听拖拽开始
    dragging function(el,e) {} //监听拖拽过程
    dragEnd function(el,e) {} //监听拖拽结束

    2、鼠标拖拽js代码

    function drag(options) {
        //接收传入的参数
        var el = options.el;  //必传
        //方向
        var dire = options.dire || "";
        //监听方法
        var dragStart = options.dragStart || "";
        var dragging = options.dragging || "";
        var dragEnd = options.dragEnd || "";
    
        //1、给el绑定鼠标按下
        el.addEventListener('mousedown', function (e) {
            //获取鼠标在el中的位置
            this._x = e.pageX - getEl2Dom(el, "Left");
            this._y = e.pageY - getEl2Dom(el, "Top");
            //获取当前被拖拽对象el的起始位置(为了保证拖拽后才触发
            this._x0 = this.offsetLeft;
            this._y0 = this.offsetTop;
            //给document注册移动方法
            document.addEventListener('mousemove', move);
    
            document.addEventListener('mouseup', mouseup)
            //调用传递进来的dragStart
            if (typeof dragStart == 'function') {
                dragStart(el, e);    //对外回调,拖拽开始
            }
        })
    
        //2、给document绑定抬起事件处理函数
        function mouseup(e) {
            //拖拽结束后  鼠标移动事件处理函数
            document.removeEventListener('mousemove', move);
            //删除鼠标抬起处理函数
            document.removeEventListener('mouseup', mouseup);
            //为了保证一定是在拖拽之后执行,需要判断鼠标抬起时,盒子的位置是否
            //发生变化,如果盒子位置没变化,就不执行
            //1、获取抬起时盒子的位置
            var xend = el.offsetLeft;
            var yend = el.offsetTop;
            if (el._x0 == xend && el._y0 == yend) return;
            //回调外部传入的dragEnd
            if (typeof dragEnd == 'function') {
                dragEnd(el, e);   //对外回调,当拖拽结束后
            }
        }
    
        //3、移动过程
        function move(e) {
            //获取鼠标到被拖拽的对象,定位父级边界之间的距离
            var x = e.pageX - getEl2Dom(el.offsetParent, "Left") - (el.offsetParent ? el.offsetParent.clientLeft : 0);
            var y = e.pageY - getEl2Dom(el.offsetParent, "Top") - (el.offsetParent ? el.offsetParent.clientTop : 0);
            //计算位置
            var nowX = x - el._x;
            var nowY = y - el._y;
            //边界区域控制  X轴
            var W = el.offsetParent ? el.offsetParent.clientWidth - el.offsetWidth :
                document.documentElement.clientWidth - el.offsetWidth;
    
            nowX = nowX < 0 ? 0 : nowX;
            nowX = nowX > W ? W : nowX;
            //Y轴   
            var H = el.offsetParent ? el.offsetParent.clientHeight - el.offsetHeight :
                document.documentElement.clientHeight - el.offsetHeight;
    
            nowY = nowY < 0 ? 0 : nowY;
            nowY = nowY > H ? H : nowY;
    
            //设置样式
            if (dire != 'y') {
                el.style.left = nowX + 'px';
            }
    
            if (dire != 'x') {
                el.style.top = nowY + 'px';
            }
            //调用一下外部的回调函数
            if (typeof dragging == 'function') {
                dragging(el, e);    //移动过程中不断调用外部的 dragging函数
            }
    
        }
    
    
        //获取盒子到文档边界之间的距离()
        function getEl2Dom(el, fx) {
            if (el == null) return 0;
            //获取当前盒子的左侧定位
            var offsetLeft = el["offset" + fx];
            //获取当前盒子的定位父级
            var parent = el.offsetParent;
            //获取父级的边框宽度
            var clientLeft = parent ? parent["client" + fx] : 0;
            return offsetLeft + clientLeft + getEl2Dom(el.offsetParent, fx)
        }
    }
    

    3、鼠标拖拽示例

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <style>
            .wrap{
                width: 500px;
                height: 300px;
                border: 1px solid red;
                position: relative;
            }
            .box{
                width: 100px;
                height: 100px;
                background-color: sandybrown;
                position: absolute;
            }
            
        </style>
    </head>
    <body>
        <div class="wrap">
            <div class="box"></div>
        </div>
    </body>
    
    <!-- 引入拖拽js代码 -->
    <script src="./drag.js"></script>
    <script>
    
    
        drag({
            el : document.querySelector('.box'),
            dire : "x,y",
            dragStart : function(el,e){
                console.log("开始拖拽,第一次调用",el,e)
            } ,
            dragging : function(el,e){
                console.log("拖拽过程",el.offsetLeft)
            },
            dragEnd : function(el,e){
                console.log("拖拽结束",el,e)
            }
        })
       
    
    
    
    </script>
    </html>
    

    相关文章

      网友评论

          本文标题:封装鼠标拖拽

          本文链接:https://www.haomeiwen.com/subject/vepssrtx.html