天天看點

拖拽和拉伸div元素功能分析與實作

綜述:綜合考察對于元素的拖動相關API的使用和邏輯思維能力,非常有用的一個實作思路,後期可以将其封裝成一個可以複用的元件積累下來

1.實作拖拽和四個方向拉伸元素的實作方法

<!DOCTYPE html>
<html >
<head>
    <meta charset="UTF-8">
    <title>js實作拖拽和拉伸</title>
</head>
<body>
<div id="test" style="position:absolute;left:0;top:0;width:600px;height:600px; border:1px solid #adadad;">
    我是測試的可拉伸,拖動的元素
</div>
<script>
    var clickBox = document.getElementById('test');
    /**
     *time/author:2019/5/9 "mouyao"
     *desc:當在目前元素上按下滑鼠時,就觸發拖動和拉伸操作
     */
    clickBox.onmousedown = function(e){
        e=e||event;  //相容ie和其他浏覽器的寫法
        var mouseDownX = e.clientX;
        var mouseDownY = e.clientY;
        var clickBoxLeft = clickBox.offsetLeft;
        var clickBoxTop = clickBox.offsetTop;
        var clickBoxWeight = clickBox.offsetWidth;
        var clickBoxHeight = clickBox.offsetHeight;

        var direction = 0;
        if (mouseDownX<clickBoxLeft+30) {
            direction='left';
        } else if (mouseDownX >clickBoxLeft+clickBoxWeight - 30){
            direction='right';
        }

        if (mouseDownY<clickBoxTop+30){
            direction = 'top';
        } else if (direction < clickBoxTop + clickBoxHeight - 30) {
            direction = 'bottom';
        }
        if ((clickBoxLeft + clickBoxWeight-30)< mouseDownX&&mouseDownX< (clickBoxLeft + clickBoxWeight) && (clickBoxTop+clickBoxHeight-30)<mouseDownY&& mouseDownY<(clickBoxTop+clickBoxHeight)) {
            direction = 'rightBottomCorner';
        }else if((clickBoxLeft +30)< mouseDownX&&mouseDownX< (clickBoxLeft + clickBoxWeight-30) && (clickBoxTop+30)<mouseDownY&& mouseDownY<(clickBoxTop+clickBoxHeight-30)){     //如果是在中間位置,則實作拖動功能
            direction="drag";
        }

        /**
         *time/author:2019/5/9 "mouyao"
         *desc:當滑鼠開始華東的時候,根據滑鼠的移動方向去調整他的X,Y坐标和長寬
         */
        document.onmousemove = function(e) {
            e = e || event; //是要是使用原生js給我們提供的e回調參數,這存儲了很多有用的資訊
            var xx = e.clientX;
            var yy = e.clientY;
            if (direction==='left') {
                clickBox.style.width = clickBoxWeight + mouseDownX - xx + 'px'
                clickBox.style.left = xx + 'px';
            } else if (direction==='right') {
                clickBox.style.width = clickBoxWeight + xx - mouseDownX + 'px'
            }

            if (direction==='top'){
                clickBox.style.height = clickBoxHeight + mouseDownY - yy + 'px';
                clickBox.style.top = yy + 'px';
            } else if (direction==='bottom'){
                clickBox.style.height = clickBoxHeight + yy - mouseDownY + 'px';
            }
            if (direction==='rightBottomCorner'){
                clickBox.style.width = clickBoxWeight +xx-mouseDownX+'px'
                clickBox.style.left =clickBoxLeft+'px';
                clickBox.style.height = clickBoxHeight +yy-mouseDownY+'px';
                clickBox.style.top =clickBoxTop+'px';
            }else if(direction==="drag"){
                clickBox.style.left =xx-mouseDownX+clickBoxLeft+ 'px';
                clickBox.style.top =yy-mouseDownY+clickBoxTop+ 'px';
            }
            //return false; //這裡為了避免抖動
        };
        document.onmouseup = function() {
            document.onmousemove = null;
            document.onmouseup = null;
        };
        if (e.preventDefault){
            e.preventDefault();
        }
    };
    /**
     *time/author:2019/5/9 "mouyao"
     *desc:在拉伸的過程中,實作居中狀态長存,有時間将其做成一個插件公布出來,供大家使用
     */


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