2011-02-24 5 views
2

나는 많은 것을 게시하는 것에 사과드립니다. 아직도 배우고 있습니다! 그래서, 나는 드래그 앤 드롭 아무 문제없이 HTML의 첫 번째 요소; 그러나 두 번째 드래그 앤 드롭을 시도하면 마우스 아래에이라는 숫자가 표시됩니다. 마우스를 움직일 때마다 여전히 드래그되지만, 아래에서는 훨씬 그렇습니다. 뭐가 문제 야?자바 스크립트에서 비교적 위치가 지정된 요소에 드래그 앤 드롭을 구현하십시오.

/* CSS Document */ 

.square { 
    position: relative; 
    width: 100px; 
    height: 100px; 
    background: red; 
} 

p { 
    padding: 0px; 
    margin: 0px; 
} 

이 시간 내 주셔서 모두 감사합니다 :

여기
<body> 

<p class="square">Thing One</p> 
<p class="square">Thing Two</p> 

</body> 

는 CSS입니다 :

여기
// JavaScript Document 

var posX; 
var posY; 
var element; 

document.addEventListener("mousedown", drag, false); 

function drag(event) { 
    if(event.target.className == "square") { 
     element = event.target; 
     posX = event.clientX -parseInt(element.offsetLeft); 
     posY = event.clientY -parseInt(element.offsetTop); 
     document.addEventListener("mousemove", move, false); 
    } 
} 

function move(event) { 

    if (typeof(element.mouseup) == "undefined") 
     document.addEventListener("mouseup", drop, false); 
    //Prevents redundantly adding the same event handler repeatedly 

    element.style.left = event.clientX - posX + "px"; 
    element.style.top = event.clientY - posY + "px"; 
}  

function drop() { 
    document.removeEventListener("mousemove", move, false); 
    document.removeEventListener("mouseup", drop, false); 
    //alert("DEBUG_DROP"); 
}  

는 HTML입니다 : 여기

는 자바 스크립트입니다! 나는 그것을 매우 감사한다!

답변

2

여기에서 고려해야 할 두 개의 문제가 있습니다

  1. 가 어떻게 페이지 요소의 위치를 ​​얻을 수 있나요?
  2. lefttop 스타일 속성에 새 값을 할당하면 어떻게됩니까?

첫 번째 질문에 대한 대답은 element.offsetLeftelement.offsetTop의 이해에 의존합니다. 이러한 속성은 element.offsetParent에 대한 오프셋을 제공하며 defined as "가장 가까운 (포함 계층에서 가장 가까운) 위치 요소를 포함하는 위치"입니다.

문서에서 이것은 <body> 요소이므로 예상대로 작동합니다. 다른 요소 안에 사각형을 놓는다면 코드가 작동을 멈추는 것을 알 수 있습니다.에 필요한 두 번째 질문에 대답

var pos= findPos(element); 
posX = event.clientX - pos.x; 
posY = event.clientY - pos.y; 

:

function findPos(obj) { 
    var curleft = curtop = 0; 
    if (obj.offsetParent) { 
     do { 
      curleft += obj.offsetLeft; 
      curtop += obj.offsetTop; 
     } while (obj = obj.offsetParent); 
     return { x: curleft, y: curtop }; 
    } 
} 

과 같이 사용합니다 : 당신이 필요로하는 것 것은 포함하는 요소의 트리를 걸어 오프셋을 각각 요약하는 기능, like this입니다 상대적으로 위치 된 요소에 대한 이해. 상대적으로 위치 된 요소는 상대 위치에 일반적으로 페이지에 나타나는 위치에 상대적으로 나타납니다. topleft에 값을 할당하면 절대 값을 제공하지 않습니다. 레이아웃에서 요소의 원래 위치와 관련하여 처리되는 위치를 제공하고 있습니다. 이것은 상대 위치 지정의 기능이지 버그가 아닙니다. 대신 position: absolute;을 사용하고 싶을 것입니다.

+0

그래서 포지셔닝을'position : absolute;';로 바꿨을 때 작업을 시작했습니다. 그러나 중첩 된 요소가 상위 요소에 따라 위치를 변경하기 때문에 다른 요소에 중첩 된 경우에도 여전히 함수가 필요할 것이라고 말하고있는 것입니다. – Dbz

+0

맞습니다. 두 번째 이슈를 수정하면 즉각적인 문제가 해결되지만, 둘 모두를 고쳐 쓰면 훨씬 더 미래가 보장 될 것입니다. –

1

어딘가에 상대 위치 지정을 사용하는 경우 요소의 오프셋은 문서의 왼쪽 상단을 기준으로하지 않을 수 있습니다.

요소의 절대 오프셋을 찾아야합니다.

+0

어떻게 요소의 절대 위치를 찾도록 제안 하시겠습니까? 나는 단지 며칠 동안 javascript-ing하고 있었고, Google은 나를 많이 도와주지 않습니다. – Dbz

+0

며칠간 자바 스크립트를 해본 적이 있다면 jQuery를 네이티브 자바 스크립트로 다이빙하는 대신 사용하는 것이 좋습니다. 그것은 이런 종류의 일을 돕는 기능을 가지고 있습니다.하지만 어쨌든 - 그 질문에 대한 답변은 다음과 같습니다. http://www.codingforums.com/showthread.php?t=11799 –

+2

글쎄, 나는 정확한 이유 때문에 jQuery를 사용하고 싶지 않다! 나는 오히려 라이브러리에 뛰어 들기 전에 언어에 대한 좋은 느낌을 가지기를 바랄 것이다 (지름길 등). 특히 다른 이유로 다른 라이브러리로 전환하면 더욱 그렇습니다. 그들이 (codingforums) 제공하는 기능을 설명 할 수 있습니까? 드래그 이벤트에서 내가 한 것과 어떻게 다른가요? – Dbz

관련 문제