使用js写一个简单的元素拖拽移动功能

方文锋  2021-09-07 09:44:07  1758  首页学习JavaScript

使用js写一个简单的元素拖拽移动功能,按下鼠标左键然后移动元素,鼠标左键弹起移动停止。上代码:

 <!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>拖拽移动元素 - 演示 | 方文锋的个人网站</title>
    <style type="text/css">
        .position {
            position: fixed;
            left: 100px;
            top: 50px;
            z-index: 9999;
        }

        #drag {
            min-width: 300px;
            min-height: 200px;
            max-width: 600px;
            max-height: 400px;
            background: #269abc;
        }
    </style>
</head>
<body>
<div id="drag" class="position"></div>
<script type="text/javascript">
    /**
     * 获取css样式
     * @param obj
     * @param style_attr
     * @return {string}
     */
    function getCSS(obj, style_attr) {
        return window.getComputedStyle ? getComputedStyle(obj)[style_attr] : obj.currentStyle[style_attr];
    }

    /**
     * 拖拽移动元素
     * @param  {string|object} ele  元素标签或元素id属性值
     * @param  {object} event    [事件对象]
     * @param  {boolean} m_offset
     * @return {object}
     */
    function drag_ele(ele, event, m_offset) {
        typeof ele === "string" && (ele = document.getElementById(ele));
        //是否停止移动
        if (ele.is_up === true) {
            return false;
        }
        var e = event || window.event;
        var W = document.documentElement.clientWidth || window.innerWidth || window.screen.width;
        var H = document.documentElement.clientHeight || window.innerHeight || window.screen.height;
        //左侧和顶部边界允许超出的值
        if (typeof ele.is_mode === "number" && ele.is_mode > 1) {
            ele.proportionX = ele.offsetWidth / ele.is_mode;
            ele.proportionY = ele.offsetHeight / ele.is_mode;
        } else {
            ele.proportionX = 0;
            ele.proportionY = 0;
        }
        //距离左侧最大距离
        var maxX = W - ele.offsetWidth + ele.proportionX;
        //距离顶部最大距离
        var maxY = H - ele.offsetHeight + ele.proportionY;
        //距离左侧最小距离
        var minX = -ele.proportionX;
        //距离顶部最小距离
        var minY = -ele.proportionY;
        //获取鼠标的坐标
        var mX = e.clientX;
        var mY = e.clientY;
        //鼠标相对与元素的左边和顶部偏移量(鼠标按下的时候获取)
        if (m_offset) {
            //当前距离左侧的距离
            var X = parseInt(getCSS(ele, "left"), 10);
            //当前距离顶部的距离
            var Y = parseInt(getCSS(ele, "top"), 10);
            ele.dX = mX - X;
            ele.dY = mY - Y;
        }
        //元素左边和顶部偏移量
        var offsetX = mX - ele.dX;
        var offsetY = mY - ele.dY;
        //边界判断
        (offsetX >= maxX) && (offsetX = maxX);
        (offsetY >= maxY) && (offsetY = maxY);
        (offsetX < minX) && (offsetX = minX);
        (offsetY < minY) && (offsetY = minY);
        //设置元素样式
        ele.style.left = offsetX + "px";
        ele.style.top = offsetY + "px";
        //停止移动
        (typeof ele.stop === "function") || (ele.stop = function (ev, fn) {
            var e = ev || window.event;
            (typeof fn === "function") && fn.call(ele, e);
            ele.is_up = true;
            return ele;
        });
        //继续移动
        (typeof ele.continue === "function") || (ele.continue = function (ev, fn) {
            var e = ev || window.event;
            (typeof fn === "function") && fn.call(ele, e);
            var mX = e.clientX;
            var mY = e.clientY;
            var X = parseInt(getCSS(ele, "left"), 10);
            var Y = parseInt(getCSS(ele, "top"), 10);
            ele.dX = mX - X;
            ele.dY = mY - Y;
            ele.is_up = false;
            return ele;
        });
        /**
         * @param {number} n 设置运行超出边界的部分值比例(1/n)
         */
        (typeof ele.mode === "function") || (ele.mode = function (n, ev, fn) {
            var e = ev || window.event;
            (typeof fn === "function") && fn.call(ele, e);
            ele.is_mode = typeof n === "number" ? n : 0;
            return ele;
        });
        return ele;
    }

    (function () {
        var ele = document.getElementById("drag");
        ele.onmousedown = function (e) {
            drag_ele(ele, e, true);
            ele.continue(e).mode(3, e);
            ele.style.cursor = "move";
        };
        ele.onmouseup = function (e) {
            ele.stop(e);
            ele.style.cursor = "default";
        };
        window.onmousemove = function (e) {
            drag_ele(ele, e, false);
        };
    })();
</script>
</body>
</html> 


演示地址