쓸만한 주저리

마우스로 개체 움직이기의 수정판 (2008년 3월 5일)

봄돌73 2008. 3. 5. 11:54

이전에 마우스로 개체를 움직이는 소스와 목표 개체를 설정해서 겹치게 하는 소스를 등록했었다.

이번에는 조금 더 추가하여, 목표 개체에 이미 다른 개체가 있을 경우 원래 위치로 되돌리는 기능과,

목표 개체가 아닌 곳에 갖다 놓을 경우 원래 위치로 되돌리는 기능,

그리고 z-index를 조절해서 이동한 개체가 다른 개체의 아래로 들어가는 현상을 없앴다.

 

<body oncontextmenu="return false" onselectstart="return false" ondragstart="return false">
<span id=movingspan1 style="background-color:gray;width:20px;height:20px;border:1px solid black;position:absolute;z-index:1" onmousedown=movethis(this)></span>
<span id=movingspan2 style="background-color:gray;width:20px;height:20px;border:1px solid black;position:absolute;left:40;z-index:1" onmousedown=movethis(this)></span>
<span id=targetspan1 style="background-color:skyblue;width:20px;height:20px;border:1px solid black;position:absolute;top:40;left:0;z-index:0"></span>
<span id=targetspan2 style="background-color:skyblue;width:20px;height:20px;border:1px solid black;position:absolute;top:40;left:40;z-index:0"></span>
<span id=targetspan3 style="background-color:skyblue;width:20px;height:20px;border:1px solid black;position:absolute;top:40;left:80;z-index:0"></span>

<script>
var movingspan1top=movingspan1.style.top
var movingspan1left=movingspan1.style.left
var movingspan2top=movingspan2.style.top
var movingspan2left=movingspan2.style.left

var move=false
var spanid=''
var x=0,y=0
function movespan(e){
  if(move){
    if(e){
      //불여우용
      x=e.pageX
      y=e.pageY
    }
    else{
      //ie용
      x=window.event.clientX
      y=window.event.clientY
    }
    //z-index 설정 : 현재 움직이는 놈이 상위에 온다.
    for(j=1;j<=2;j++){
      var tempobj=document.getElementById('movingspan'+j)
      if(tempobj!=null){
        tempobj.style.zIndex=1
      }
    }
    movingspanobj.style.zIndex=2
    //세로 이동
    if(y>movingspanobj.offsetHeight/2 && movingspanobj.offsetHeight+movingspanobj.offsetTop<document.body.clientHeight){
      movingspanobj.style.top=y-movingspanobj.offsetHeight/2
    }
    else if(movingspanobj.offsetHeight+movingspanobj.offsetTop>=document.body.clientHeight){
      movingspanobj.style.top=movingspanobj.offsetTop-2
    }
    else{
      movingspanobj.style.top=0
    }
    //가로 이동
    if(x>movingspanobj.offsetWidth/2 && movingspanobj.offsetWidth+movingspanobj.offsetLeft<document.body.clientWidth){
      movingspanobj.style.left=x-movingspanobj.offsetWidth/2
    }
    else if(movingspanobj.offsetWidth+movingspanobj.offsetLeft>=document.body.clientWidth){
      movingspanobj.style.left=movingspanobj.offsetLeft-2
    }
    else{
      movingspanobj.style.left=0
    }
  }
}

var targetspanid,targetspanobj,movingspanid,movingspanobj

document.onmousedown=new Function('move=true')
document.onmouseup=new Function('move=false;fixintarget()')

function movethis(spanobj){
  movingspanobj=spanobj
  movingspanobj.onmouseout=new Function('move=false;fixintarget()')
  movingspanobj.onmouseover=new Function('move=false;fixintarget()')
  movingspanobj.onmousemove=movespan
}

//찰싹붙기
function fixintarget(){
  for(i=1;i<=3;i++){
    targetspanid='targetspan'+i
    targetspanobj=null
    targetspanobj=document.getElementById(targetspanid)
    if(targetspanobj!=null){
      var targetx1=targetspanobj.offsetLeft
      var targetx2=targetspanobj.offsetLeft+targetspanobj.offsetWidth
      var targety1=targetspanobj.offsetTop
      var targety2=targetspanobj.offsetTop+targetspanobj.offsetHeight

      if(x>=targetx1 && x<=targetx2 && y>=targety1 && y<=targety2){
        movingspanobj.style.left=targetspanobj.offsetLeft
        movingspanobj.style.top=targetspanobj.offsetTop
        //기존 개체 쫓아내기
        for(j=1;j<=2;j++){
          var tempobj=document.getElementById('movingspan'+j)
          if(tempobj!=null){
            if(movingspanobj!=tempobj){
              tempx=tempobj.style.left
              tempy=tempobj.style.top
              if(tempobj.offsetLeft==targetspanobj.offsetLeft && tempobj.offsetTop==targetspanobj.offsetTop){
                tempobj.style.left=eval('movingspan'+j+'left')
                tempobj.style.top=eval('movingspan'+j+'top')
              }
            }
          }
        }
        break
      }
      //목표 지점에 도달하지 못하면 원래 자리로 돌아가기
      movingspanobj.style.left=eval(movingspanobj.id+'left')
      movingspanobj.style.top=eval(movingspanobj.id+'top')
    }
  }
}
</script>

move_object.html
0.0MB