欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JS之拖拽与碰撞检测

程序员文章站 2024-03-15 22:22:00
...

ev

为什么事件函数中有一个参数(ev)?
因为ev是事件的参数,在ev中包含了事件触发时的参数,比如click事件中的
ev.pageX,ev.pageY,keydown事件中的ev.keyCode等
在ie中.ev是全局的,可以通过windows.event来获取,在其它浏览器中,都是作为参数传入的,所有好多事件函数都这样写
myDiv.onclick = function(ev){
    if(!ev){
        ev=window.event;
    }//if语句也可以简写成:ev=window.event||ev
}
这句话的用途:需要获取和事件相关的信息时使用,如
1.获取键盘按下或者弹起的按键
2.获取鼠标的位置坐标
3.获取事件名称
4.获取事件当前的传播阶段
5.获取事件生成的日期时间

clientX/Y

clientX 事件属性返回当事件被触发时鼠标指针向对于浏览器页面(或客户区)的水平坐标
客户区指的是当前窗口
clientY 事件属性返回当事件被触发时鼠标指针向对于浏览器页面(客户区)的垂直坐标

pageX 属性是鼠标指针的位置,相对于文档的左边缘
pageY 属性是鼠标指针的位置,相对于文档的上边缘

offsetX,offsetY 鼠标相对于被点击元素(比如div)的x坐标,y坐标

JS之拖拽与碰撞检测

拖拽代码示例

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>拖拽事件</title>
        <style type="text/css">
            .item{
                width:100px;
                height:100px;
                background-color:red;
                position:absolute;
                left:0px;
                right:0px;
            }
            body{
                height:3000px;
            }
        </style>
    </head>
    <body>
        <div class="item"></div>
    </body>
    <script>
        var item = document.getElementsByClassName("item")[0];
        document.onmousedown = function(e){
            var x = e.offsetX;
            var y = e.offsetY;
            document.onmousemove = function(ev){
                // item.style.left = ev.clientX - x + "px";
                // item.style.top = ev.clientY - y+ "px";
                item.style.left = ev.pageX - x + "px";
                item.style.top = ev.pageY - y+ "px";
            }
        }
        document.onmouseup = function(){
            document.onmousemove = null;
        }
    </script>
</html>

拖拽基础上进行碰撞检测

两个正方形,未相碰撞的时候一个红,一个蓝,碰撞时,蓝色的变成黄色
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>拖拽事件</title>
        <style type="text/css">
            .item{
                width:100px;
                height:100px;
                background-color:red;
                position:absolute;
                left:0px;
                top:0px;
            }
            .box{
                width:100px;
                height:100px;
                background-color:blue;

                margin:100px auto;
            }
            body{
                height:3000px;
            }
        </style>
    </head>
    <body>
        <div class="item"></div>
        <div class="box"></div>
    </body>
    <script>
        var item = document.getElementsByClassName("item")[0];
        var box = document.getElementsByClassName("box")[0];
        document.onmousedown = function(e){
            var x = e.offsetX;
            var y = e.offsetY;
            document.onmousemove = function(ev){
                // item.style.left = ev.clientX - x + "px";
                // item.style.top = ev.clientY - y+ "px";
                item.style.left = ev.pageX - x + "px";
                item.style.top = ev.pageY - y+ "px";
                //碰撞检测
                if(item.offsetLeft+item.offsetWidth>box.offsetLeft &&
                   item.offsetLeft<box.offsetLeft+box.offsetWidth &&
                   item.offsetTop+item.offsetHeight>box.offsetHeight &&
                   item.offsetTop<box.offsetTop+box.offsetWidth){
                    box.style.backgroundColor="yellow";
                }else{
                    box.style.backgroundColor="blue";
                }
            }
        }
        document.onmouseup = function(){
            document.onmousemove = null;
        }
    </script>
</html>
效果截图

JS之拖拽与碰撞检测
JS之拖拽与碰撞检测
JS之拖拽与碰撞检测
JS之拖拽与碰撞检测

两个圆,未碰撞时一个蓝色一个红色,碰撞后,蓝色变成绿色
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <style>
            .item{
                width:100px;
                height:100px;
                background-color:red;
                position:absolute;
                left:0px;
                right:0px;
            }
            body{
                height:3000px;
            }
            .box{
                width:150px;
                height:150px;
                background-color:blue;
                margin:100px auto;
            }
            div{
                border-radius:50%;
            }
        </style>
    </head>
    <body>
        <div class="item"></div>
        <div class="box"></div>
    </body>
    <script type="text/javascript">
        var item = document.getElementsByClassName('item')[0];
        var box = document.getElementsByClassName('box')[0];
        item.onmousedown = function(e){
            var x = e.offsetX;
            var y = e.offsetY;
            document.onmousemove = function(ev){
                item.style.left = ev.pageX - x + "px";
                item.style.top = ev.pageY - y + "px";

                var a=item.offsetLeft+item.offsetWidth/2; 
                var b=box.offsetLeft+box.offsetWidth/2;
                var ab=a - b;

                var c=item.offsetTop+item.offsetHeight/2; 
                var d=box.offsetTop+box.offsetHeight/2;
                var cd=c - d;

                var e = ab*ab + cd*cd;
                var length = Math.sqrt(e);
                if(length<=125){
                    box.style.backgroundColor="green";
                }else{
                    box.style.backgroundColor="blue";
                }

            }
        }
        document.onmouseup = function(){
            document.onmousemove = null;
        }
    </script>
</html>
效果截图

JS之拖拽与碰撞检测
JS之拖拽与碰撞检测
JS之拖拽与碰撞检测
这里写图片描述