div collision

Requirements: Drag the two elements, when the four edges of the collision, div style change

<!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>
    <style>
        div {
            width: 200px;
            height: 200px;
            border: 1px solid black;
            position: absolute;
        }
        #div1 {
            background: red;
            top: 20px;
            left: 50px;
        }
        #div2 {
            background: green;
            top: 200px;
            left: 500px;
        }
    </style>
</head>
<body>
<div id="div1"></div>
<div id="div2"></div>
<script>
{
    //需求:拖动div1或者div2,两者碰到其中一个div颜色就变化
    /*
        没有碰到的情况:
            div1.right < div2.left ||
            div1.bottom < div2.top ||
            div1.left > div2.right ||
            div1.top > div.bottom
        碰到的情况:
            div1.right > div2.left &&
            div1.bottom > div2.top &&
            div1.left < div2.right &&
            div1.top < div.bottom
    */
    let div1 = document.querySelector("#div1");
    let div2 = document.querySelector("#div2");

    //获取/设置元素的样式
    function css(el,attr,val){
        if(arguments.length == 3){
            el.style[attr] = val;
        }else{
            return parseInt(getComputedStyle(el)[attr]);
        }
    }

    let isConcat = (el1,el2) =>{
        //判断是否碰撞
        let div1Dis = el1.getBoundingClientRect();
        let div2Dis = el2.getBoundingClientRect();
        if(div1Dis.right < div2Dis.left ||
            div1Dis.bottom < div2Dis.top ||
            div1Dis.left > div2Dis.right ||
            div1Dis.top > div2Dis.bottom){
                css(div2,"background","green");
                
        }else{
            css(div2,"background","yellow");
        }
    }
    //封装拖拽方法
    function drag(el1,el2){
        el1.addEventListener("mousedown",function(e){
            //获取鼠标起始位置
            let startPos = {};
            startPos.x = e.clientX;
            startPos.y = e.clientY;
            let top = css(el1,"top");
            let left = css(el1,"left");

            //鼠标移动时,获取移动时鼠标的当前位置
            function move(e){
                let curPos = {};
                curPos.x = e.clientX;
                curPos.y = e.clientY;
                //解决超出边界问题
                let t = curPos.y - startPos.y + top;
                let l = curPos.x - startPos.x + left;
                t = Math.max(0,t);
                l = Math.max(0,l);
                let maxL = document.documentElement.clientWidth - el1.offsetWidth;
                let maxT = document.documentElement.clientHeight - el1.offsetHeight;

                t = Math.min(t,maxT);
                l = Math.min(l,maxL);

                //通过 鼠标当前位置 - 起始位置 + div的起始top/left 得到当前div的位置
                el1.style.top = t + 'px';
                el1.style.left = l + 'px';
                isConcat(el1,el2);
                e.preventDefault();
            }
            document.addEventListener("mousemove",move);
            //鼠标放开时,清除移动
            document.addEventListener("mouseup",function(){
                document.removeEventListener("mousemove",move);
            },{
                once:true
            });

        });
    }
    //拖动div1
    drag(div1,div2);

    //拖动div2
    drag(div2,div1);
    
}
</script>
</body>
</html>

 

Published 95 original articles · won praise 115 · views 120 000 +

Guess you like

Origin blog.csdn.net/qq_34569497/article/details/99682656