js拖拽功能的实现

529 阅读1分钟

实现一个拖拽功能,那么必须使用三个事件,并且这三个事件的使用顺序不能颠倒。

事件

  • onmousedown: 鼠标按下事件
  • onmousemove: 鼠标移动事件
  • onmouseup: 鼠标抬起事件

原理

拖拽的基本原理就是根据鼠标的移动来移动被拖拽的元素。鼠标的移动也就是x、y坐标的变化;元素的移动就是style.position的top和left的改变。当然,并不是任何时候移动鼠标都要造成元素的移动,而应该判断鼠标左键的状态是否为按下状态,是否是在可拖拽的元素上按下的。

拖拽状态 = 0鼠标在元素上按下的时候{
      拖拽状态 = 1
      记录下鼠标的x和y坐标
      记录下元素的x和y坐标
}

鼠标在元素上移动的时候{
      如果拖拽状态是0就什么也不做。
      如果拖拽状态是1,那么
      元素y = 现在鼠标y - 原来鼠标y + 原来元素y
      元素x = 现在鼠标x - 原来鼠标x + 原来元素x
}

鼠标在任何时候放开的时候{
       拖拽状态  = 0
}
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <div class="drag" style="left:0;top:0;width:200px;height:200px">按住拖动</div>
    <style>
        .drag {
            background-color: rgb(234, 242, 157);
            position: absolute;
            line-height: 200px;
            text-align: center;
        }
    </style>

</body>
<script>
    // 获取DOM元素  
    let dragDiv = document.getElementsByClassName("drag")[0];
    // 鼠标按下事件 处理程序
    let putDown = function (event) {
        dragDiv.style.cursor = "pointer";
        let offsetX = parseInt(dragDiv.style.left); // 获取当前的x轴距离
        let offsetY = parseInt(dragDiv.style.top); // 获取当前的y轴距离
        let innerX = event.clientX - offsetX; // 获取鼠标在方块内的x轴距
        let innerY = event.clientY - offsetY; // 获取鼠标在方块内的y轴距
        // 按住鼠标时为div添加一个border
        dragDiv.style.borderStyle = "solid";
        dragDiv.style.borderColor = "pink";
        dragDiv.style.borderWidth = "3px";
        // 鼠标移动的时候不停的修改div的left和top值
        document.onmousemove = function (event) {
            dragDiv.style.left = event.clientX - innerX + "px";
            dragDiv.style.top = event.clientY - innerY + "px";
            // 边界判断
            if (parseInt(dragDiv.style.left) <= 0) {
                dragDiv.style.left = "0px";
            }
            if (parseInt(dragDiv.style.top) <= 0) {
                dragDiv.style.top = "0px";
            }
            if (parseInt(dragDiv.style.left) >= window.innerWidth - parseInt(dragDiv.style.width)) {
                dragDiv.style.left = window.innerWidth - parseInt(dragDiv.style.width) + "px";
            }
            if (parseInt(dragDiv.style.top) >= window.innerHeight - parseInt(dragDiv.style.height)) {
                dragDiv.style.top = window.innerHeight - parseInt(dragDiv.style.height) + "px";
            }
        }
        // 鼠标抬起时,清除绑定在文档上的mousemove和mouseup事件
        // 否则鼠标抬起后还可以继续拖拽方块
        document.onmouseup = function () {
            document.onmousemove = null;
            document.onmouseup = null;
            // 清除border
            dragDiv.style.borderStyle = "";
            dragDiv.style.borderColor = "";
            dragDiv.style.borderWidth = "";
        }
    }
    // 绑定鼠标按下事件
    dragDiv.addEventListener("mousedown", putDown, false);
</script>

</html>