复制代码 代码如下: function getPosition(ele){ var left = 0; var top = 0; while (ele.offsetParent){ left += ele.offsetLeft; top += ele.offsetTop; ele = ele.offsetParent; } left += ele.offsetLeft; top += ele.offsetTop; return {x:left, y:top}; }
有了mousemove当然少不了mouseup 复制代码 代码如下: document.onmouseup = mouseUp; //鼠标松开 function mouseUp(){ if(dragObject){ if(dragObject.parentNode.style.display=="none") dragObject.parentNode.style.display="block"; dragObject.parentNode.style.border="1px solid #FFCC66"; tmpDiv.style.display="none"; //这里是判断当列里有可拖动的元素时清除前面设置的高度值20px for(var m=0;m<DragContainer.length;m++){ var colDiv=document.getElementById(DragContainer[m]); var colDivLen=colDiv.getElementsByTagName("div").length var colSty=colDiv.getAttribute("style"); if(colDivLen>0&&colSty!=null){ colDiv.removeAttribute("style"); break; } } dragObject=null; } }
看看是不是可以拖动了,当你松开鼠标左键时,拖动的元素将回到原来的位置 查看拖动页面效果
最后要做的就是让拖动元素不回到原来的位置,而是回到我们拖动的位置。 下面是mousemove事件的所有代码,看看注释就明白了 复制代码 代码如下: function mouseMove(){ ev=getEvent(); var mousePos = mouseCoords(ev); if(dragObject){ //可拖动的个数为1,说明拖动后此列就没有拖动元素,为避免此列没有高度而不见,所以设置其高度为20px if(dragDivLen==1) dragDiv.style.height="20px"; dragObject.parentNode.style.display="none"; //把拖动的元素加入到临时的tmpDiv中,并设置tmpDiv坐标 for(var i=0; i<tmpDiv.childNodes.length; i++) tmpDiv.removeChild(tmpDiv.childNodes[i]); tmpDiv.appendChild(dragObject.cloneNode(true)); tmpDiv.style.width=eleDivW+"px"; tmpDiv.style.backgroundColor="#FFFFFF"; tmpDiv.style.display="block"; tmpDiv.style.top = (mousePos.y - mouseOffset.y)+"px"; tmpDiv.style.left = (mousePos.x - mouseOffset.x)+"px"; //被拖动对象的中心点的坐标 var dragObjCntX=mousePos.x - mouseOffset.x+parseInt(dragObject.offsetWidth)/2; var dragObjCntY=mousePos.y - mouseOffset.y+parseInt(dragObject.offsetHeight)/2; //判断tmpDiv所在的列 var dragConLen=DragContainer.length; for(var i=0;i<dragConLen;i++){ var curContainer=document.getElementById(DragContainer[i]); var dcPos=getPosition(curContainer); var dcPosMinX=dcPos.x; var dcPosMinY=dcPos.y; var dcWidth=curContainer.offsetWidth; var dcHeight=curContainer.offsetHeight; var dcPosMaxX=dcPosMinX+dcWidth; var dcPosMaxY=dcPosMinY+dcHeight; if(dragObjCntX>dcPosMinX&&dragObjCntX<dcPosMaxX&&dragObjCntY>dcPosMinY&&dragObjCntY<dcPosMaxY){ var activeContainer=curContainer; break; } } } //判断tmpDiv在此列哪个区块范围内 if(activeContainer){ var beforNode=null; var sDiv=activeContainer.getElementsByTagName("div") var acChiLen=sDiv.length; for(j=acChiLen-1;j>=0;j--){ var activeDiv=sDiv[j]; if(activeDiv){ var activeDivPos=getPosition(activeDiv); var activeDivMinX=activeDivPos.x; var activeDivMinY=activeDivPos.y; var activeDivMaxX=activeDivMinX+activeDiv.offsetWidth; var activeDivMaxY=activeDivMinY+activeDiv.offsetHeight; if(activeDivMaxX>dragObjCntX&&activeDivMaxY>dragObjCntY){ //if(dragObjCntX>activeDivMinX&&dragObjCntX<activeDivMaxX&&dragObjCntY>activeDivMinY&&dragObjCntY<activeDivMaxY){ beforNode=activeDiv; } }