美文网首页
图片碰撞

图片碰撞

作者: YT_Zou | 来源:发表于2017-01-20 17:10 被阅读0次

效果图

html文件:

![](img/3.jpg)
![](img/6.jpg)
![](img/8.jpg)

css文件:

body{ background: #000;}
img{
  width:150px;
  height: 100px; 
  position: absolute;
  cursor: pointer;
  border: 3px #fff solid;
}
#box1{left: 50px;top:20px;}
#box2{left:300px;top:20px;}
#box3{left: 50px;top:200px;}
.abc{border: 3px red solid; opacity: 0.5;filter: alpha(opacity=50);}

js文件

        var oBox=document.getElementById("box1");
        var oBox2=document.getElementById("box2");
        var oBox3=document.getElementById("box3");
        var aImg=document.getElementsByTagName("img");
        drag(oBox);
        drag(oBox2);
        drag(oBox3);
        function drag(obj){
            //声明两个用于储存固定位置的变量。
            var disX;    //水平固定
            var disY;    //垂直固定
            var newObj=null;
            obj.onmousedown=function(ev){
                for(var i=0;i<aImg.length;i++){
                    aImg[i].style.transition="";
                    aImg[i].style.zIndex="1";
                }
                obj.style.zIndex="999";
                var e=ev||event;    //做一个事件对象的兼容
                disX=e.clientX-this.offsetLeft;    //获取水平方向固定距离。
                disY=e.clientY-this.offsetTop;   //获取垂直方向的固定距离。
                if(e.preventDefault){
                    e.preventDefault()
                }else{
                    e.returnValue=false;
                }
                //保存最初的obj的位置。
                var firstL=obj.offsetLeft;
                var firstT=obj.offsetTop;
                //在document上移动鼠标触发这个事件。
                document.onmousemove=function(ev){
                    var e=ev||event;
                    var valueX=e.clientX-disX;
                    var valueY=e.clientY-disY;
                    var maxL=document.documentElement.clientWidth-obj.offsetWidth;
                    var maxT=document.documentElement.clientHeight-obj.offsetHeight;
                    //三目运算符,能简化判断的代码。
                    valueX=valueX<0?0:valueX;
                    valueX=valueX>maxL?maxL:valueX;
                    valueY=valueY<0?0:valueY;
                    valueY=valueY>maxT?maxT:valueY;
                    //让一个实时变化的鼠标的坐标减去一个固定距离,就可以得到实时刷新的的坐标
                    obj.style.left=valueX+"px";
                    obj.style.top=valueY+"px";
                    //碰撞检测
                    newObj=null;
                    var arr=[];   //建立数组用于存储碰撞上的图片。
                    for(var i=0;i<aImg.length;i++){
                      if(aImg[i]!=obj){
                        if(hitTest(aImg[i],obj)){
                            arr.push(aImg[i])
                        }
                      }
                    }
                    //遍历数组                                                      
                    var min=Infinity;
                    for(var i=0;i<arr.length;i++){
                        var a=arr[i].offsetLeft-obj.offsetLeft;
                        var b=arr[i].offsetTop-obj.offsetTop;
                        var valueZ=a*a+b*b;   //平方和
                        if(min>valueZ){
                            min=valueZ;
                            newObj=arr[i];
                        }
                    }
                  }
              document.onmouseup=function(){
                  document.onmouseup=document.onmousemove=null;
                  if(newObj){
                    obj.style.transition="0.5s";
                    obj.style.left=newObj.offsetLeft+"px";
                    obj.style.top=newObj.offsetTop+"px";
                    newObj.style.transition="0.5s"
                    newObj.style.top=firstT+"px";
                    newObj.style.left=firstL+"px";
                  }else{
                    obj.style.transition="0.5s"
                    obj.style.left=firstL+"px";
                    obj.style.top=firstT+"px";
                    obj.style.zIndex="1";
                  }
                }
            }
        //碰撞检测的函数
         function hitTest(obj,obj2){
            //先把obj的一系列位置获取掉。
            var objL=obj.offsetLeft;
            var objT=obj.offsetTop;
            var objW=obj.offsetWidth;
            var objH=obj.offsetHeight;
            //再获取obj2的一系列位置。
            var obj2L=obj2.offsetLeft;
            var obj2T=obj2.offsetTop;
            var obj2W=obj2.offsetWidth;
            var obj2H=obj2.offsetHeight;
            if(objL+objW<obj2L||objT+objH<obj2T||obj2L+obj2W<objL||obj2T+obj2H<objT){
                   return false;
            }else{
                return true
            }
           }
        }

相关文章

  • 图片碰撞

    效果图 html文件: css文件: js文件

  • canvas版像素碰撞

    canvas像素碰撞思路: 创建两个图片 将第一张图片拷贝到canvas中,带该图片加载完毕之后 拖动第二张图片,...

  • 11_tanks_war

    Sprite来控制图片内容 要有碰撞效果的话,两个都要有碰撞器,运动的一方有刚体,如果经常不运动的话,刚体就会休眠...

  • 君威正面25%偏置碰撞后,气囊不弹出?

    近日,C-IASI中国保险汽车安全指数公布了别克君威的正面25%偏置碰撞现场图片。 25%偏置碰撞后,别克君威的A...

  • 我是粉色你是蓝色

    图片发自简书App 我喜欢粉色,也喜欢蓝色,更喜欢粉色与蓝色一起,碰撞出俏皮可爱。 图片发自简书App 我喜...

  • MD5碰撞的一些例子

    MD5作为文件校验方法已经不可靠了,可以人为制造碰撞。 JPEG图片样本 简书会对上传的图片进行压缩,参考链接(需...

  • 20170524关于图片的贝塞尔、CGContext圆角裁剪

    这种裁剪只能裁剪png格式图片,请注意。个人能力不足,希望大家一起思维碰撞。 #import @interface...

  • nidejs基础知识及服务器搭建。纯干货。抓紧收藏

    今天学习的内容 1:复习昨天重点 2:大鱼喂小鱼;首页 大鱼喂小鱼: 大鱼碰撞小鱼,小鱼吃饱,小鱼身体图片...

  • 碰撞算法

    碰撞检测算法:点和矩形碰撞、点和圆形碰撞、矩形碰撞、圆形碰撞 点和矩形碰撞 /** * * @para...

  • 中国青海·行走(6)

    【图片为原拍】 一个人的荒原, 那怕很短暂, 体味心与原始的碰撞, 然后变得崇高、伟岸……

网友评论

      本文标题:图片碰撞

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