美文网首页
拖拽,碰撞检测

拖拽,碰撞检测

作者: ErrorCode233 | 来源:发表于2018-07-19 09:42 被阅读48次

    1. 拖拽

    1.1 拖拽原理

    鼠标拖拽效果的实现,就是在鼠标摁下和移动的时候,修改元素的定位值的效果。

    1.1.1 鼠标按下(mousedown)

    获取到鼠标的坐标距离元素左边和上边的距离

    鼠标坐标距离元素左边的距离:

    disX = ev.clientX - 元素.offsetLeft;
    

    鼠标坐标距离元素左边的距离:

    disY = ev.clientY - 元素.offsetTop;
    

    1.1.2 鼠标移动(mousemove)

    如果想要多次移动,那么这里的mousemove事件需要添加给document
    需要获取到元素在移动的时候的正确位置
    首先拿到鼠标的坐标:ev.clientX/ev.clientY
    然后计算元素的正确位置:
    元素的Left值:

    left = ev.clientX - disX;
    

    元素的Top值:

    top = ev.clientY - disY;
    

    1.1.3 鼠标松开(mouseup)

    清除掉鼠标移动的事件

    元素.onmouseup =  function(){
        document.onmousemove = null;
    }
    

    一个完整的鼠标拖拽一个元素

    //HTML
    <div id="box"></div>
    //JS
    window.onload=function(){
        var box=document.getElementById("box");
        var disX;
        var disY;
        //鼠标按下
        box.onmousedown=function(ev){
            disX=ev.clientX-this.offsetLeft;
            disY=ev.clientY-this.offsetTop;
                    
            //鼠标移动
            document.onmousemove=function(ev){
                var l=ev.clientX-disX;
                var t=ev.clientY-disY;
                        
                box.style.left=l+'px';
                box.style.top=t+'px';
            };
                    
            //鼠标抬起
            document.onmouseup=function(){
                document.onmousemove=null;
            };
                    
            return false;
        }
    };
    

    1.4 限制边缘

    当拖拽的时候,不可能会让它去无限制的拖拽,需要限制一个拖拽边缘。
    我们浏览器的边缘为:

    left:       0px
    top:        0px
    right:      document.documentElement.clientX px
    bottom :    document.documentElement.clientY px
    

    元素的可以动区域为:

    left:       0px
    top:        0px
    right:      浏览器边缘的值 - 元素的自身的宽度
    bottom:    浏览器的边缘值 - 元素自身的高度
    

    那么判断元素的 topleft 值,就可以判断它是否移动到了边缘,就可以进行处理了。

    边缘吸附也是相同的道理

    2.碰撞检测

    碰撞检测示意图:

    碰撞检测

    如图所示,如果我们拖拽的元素不碰到这个蓝色方块的时候,也就意味着碰撞没有发生,换句话说,当我们拖拽的元素碰撞到了这个蓝色的方块儿的时候,证明发生了碰撞。

    我们使用getBoundingClientRect()来获取鼠标拖拽的元素和蓝色元素的属性

    var boxMes = box.getBoundingClientRect();
    var blueMes = box.getBoundingClientRect();
    

    判断碰撞

    //如果
    boxMes.bottom < blueMes.top
    boxMes.left > blueMes.right
    boxMes.top > blueMes.bottom
    boxMes.right < blueMes.left 
    //满足这4个条件的任意一个时候,说明没有发生碰撞,那么相反就是发生了碰撞。
    

    相关文章

      网友评论

          本文标题:拖拽,碰撞检测

          本文链接:https://www.haomeiwen.com/subject/qqmzpftx.html