js 拖拽事件升级版(母生儿,母在家,儿四处飘~)

前言

js 拖拽元素,生成新元素,新元素跟着鼠标动,松开书标,新元素停在鼠标松开时的位置,再次点击该新元素,该新元素本身被拖拽,换新位置(母生儿,母在家,儿四处飘~)

做这个的目的是为了以后自己搞一下拖拽的海报生成器或者小程序H5装修之类,类似ps操作,开源项目有,但是太复杂了,我就想搞个简单版,能满足自己需求就可以了,不需要太多花里胡哨的功能。

所以先拿拖拽打个基础。

知识点

1 DOM 事件对象 onmousedown onmousemove onmouseup

HTML DOM 事件对象 | 菜鸟教程

2 DOM Document 对象

HTML DOM Document 对象 | 菜鸟教程

效果

代码

<!doctype html>
<html>

<head>
    <metacharset="utf-8">
        <title>index</title>
        <style>
            * {
                margin: 0px;
                padding: 0px;
            }

            #box1 {
                width: 100px;
                height: 100px;
                background: rgba(255, 0, 0, 1);
                position: absolute;
            }

            .box {
                width: 100px;
                height: 100px;
                background: rgba(255, 0, 0, 0.5);
                position: absolute;
            }
        </style>
</head>

<body>
    <div id="box1"></div>
    <script>
        /*
            鼠标拖拽分为3个阶段:
            1、当鼠标在元素上方按下时,拖拽开始(onmousedown)
            2、当鼠标移动时元素跟随鼠标移动,拖拽进行中(onmousemove)
            3、当鼠标松开时,拖拽停止,元素固定在最后所在位置(onmouseup)
        */
        //获取元素
        var oBox = document.getElementById("box1");
        //1、鼠标按下
        oBox.onmousedown = function (event) {
            console.log('onmousedown')
            var parent = document.getElementsByTagName('body')
            var drag = document.createElement('div')
            parent[0].appendChild(drag)
            //事件对象
            event = event || window.event;
            //计算鼠标与盒子左侧和上方的距离
            //左侧距离 = 鼠标水平坐标-盒子左侧偏移距离(offsetLeft)
            //上方距离 = 鼠标垂直坐标-盒子上方偏移距离(offsetTop)
            var lf = event.clientX - oBox.offsetLeft;
            var tp = event.clientY - oBox.offsetTop;
            //2、鼠标移动,盒子随着鼠标移动而移动
            document.onmousemove = function (event) {
                event = event || window.event;
                //获取鼠标水平&垂直方向的坐标
                var mouseLeft = event.clientX;
                var mouseTop = event.clientY;
                drag.setAttribute('class', 'box')
                //设置盒子的left&top值,注意:要为元素加上定位
                drag.style.left = mouseLeft - lf + "px";
                drag.style.top = mouseTop - tp + "px";
                /*
                    当我们拖拽一个网页中的内容时,浏览器会默认去搜索引擎中搜索内容,此时会导致拖拽功能异常,这是浏览器提供的默认行为,如果不希望发生这个行为,则可以通过return false 来取消默认行为
                    但是这个对IE8一下不起作用
                */
                return false;
            }
        }
        //3、松开鼠标,盒子停止
        document.onmouseup = function () {
            console.log('onmouseup')
            //取消鼠标移动事件
            document.onmousemove = null;
            var list = document.getElementsByClassName('box')
            // HTMLCollection 看起来像数组但不是数组,不能使用数组的方法
            // list.forEach(element => {
            //     element.style.background = 'rgba(255, 0, 0, 1)'
            // });
            for (i = 0; i < list.length; i++) {
                list[i].style.background = 'rgba(255, 0, 0, 1)'
                console.log(list[i])
                // 这个item变量一定要定义的,后面的事件才能找得到本体
                let ietm = list[i]
                ietm.onmousedown = function (event) {
                    console.log('onmousedown')
                    //事件对象
                    event = event || window.event;
                    //计算鼠标与盒子左侧和上方的距离
                    //左侧距离 = 鼠标水平坐标-盒子左侧偏移距离(offsetLeft)
                    //上方距离 = 鼠标垂直坐标-盒子上方偏移距离(offsetTop)
                    var lf = event.clientX - ietm.offsetLeft;
                    var tp = event.clientY - ietm.offsetTop;
                    //2、鼠标移动,盒子随着鼠标移动而移动
                    document.onmousemove = function (event) {
                        event = event || window.event;
                        //获取鼠标水平&垂直方向的坐标
                        var mouseLeft = event.clientX;
                        var mouseTop = event.clientY;
                        console.log(ietm)
                        //设置盒子的left&top值,注意:要为元素加上定位
                        ietm.style.left = mouseLeft - lf + "px";
                        ietm.style.top = mouseTop - tp + "px";
                        /*
                            当我们拖拽一个网页中的内容时,浏览器会默认去搜索引擎中搜索内容,此时会导致拖拽功能异常,这是浏览器提供的默认行为,如果不希望发生这个行为,则可以通过return false 来取消默认行为
                            但是这个对IE8一下不起作用
                        */
                        return false;
                    }
                }
            }
        }
    </script>
</body>

</html>

参考

js拖拽事件_yanjin_xiaoxiao的博客-CSDN博客_js拖拽事件

猜你喜欢

转载自blog.csdn.net/weixin_43991241/article/details/127335631
今日推荐