2013-07-11 34 views
0

对不起,如果这已经在那里,但我一直在寻找一段时间,并没有发现任何东西。我想知道是否有办法,给定页面上绝对定位元素的x和y坐标/偏移量,将该元素更改为相对定位的元素,但让它保留在相同的视觉位置,更改它的位置在DOM中的位置。例如,假设这个网站将绝对定位转换为相对定位

<div id="divOne"></div> 
<div id="divTwo"></div> 
<div id="divThree"></div> 

如果divOne是绝对定位和它的位置正好在视觉上落divTwo和divThree之间,是有我的X转换的方式,Y位置,以便我能告诉jQuery将它放在divOne之后和divTwo之前的DOM中?我对Javascript和jQuery非常熟悉,我只是在寻找一种我可能不知道的方法,或者从以前可能遇到过的人那里得到答案。

+1

愚蠢的问题警示:为什么不只是保持绝对的? – aldux

+0

因为我将它改为绝对定位,以便在屏幕上拖动它。我希望能够释放鼠标按钮,无论我释放它,它都会在适当的位置重新插入DOM。我已经写了拖动脚本。我只需要回到DOM部分。 –

+0

@SamuelReid如何让他们在拖拽后保持绝对定位伤害任何东西? – Rooster

回答

0

通过删除拖动的div的绝对位置,您必须将其标记放置在dom中的不同位置以重新定位它。

例如,如果你拖动#divOne,使其在视觉和#divTwo之间#divThree移动你应该做的是去除#divOne的绝对定位和移动其他两个div之间出现的标签:

<div id="divTwo"></div> 
<div id="divOne"></div> 
<div id="divThree"></div> 

如果你有一个明确的网格,这将工作。

如果我是你,我会做的是给我的网格中的任何div一个标准的类,我想重新安排。例如,班级“可安排”。当拖动火灾时,我会使用以下公式计算我的拖动div必须放置在dom中的位置:

拖动的div应移动到dom上的其他位置。将会发生的事情是,拖动的div将取代现有的拖动div,并在其后面“推”现有的拖动div。例如,通过在#divTwo和#divThree之间拖动#divOne,#divOne代替#divThree并将其推后。假设用户停止拖动并释放鼠标左键,当拖动的div覆盖现有div的位置将被采用(让我们将其命名为“delayedDiv”),那么您所要做的就是识别推送的DIV ,从dom中取出被拖动的那个,放置在被识别的之前并使其位置相对。

为了实现这是pushedDiv你可以使用这个程序:

//on drag end, where mouse has x and y coords: 
var pushedDiv; 
$(".arrangeable").each(function(index,value){ 
    var theoffset = $(this).offset(); 
    if(x >= theoffset .left && x <= theoffset .left + $(this).width() && y >= theoffset .top && y <= theoffset .top + $(this).height()){ 
     pushedDiv = $(this); 
    } 
}); 
// if pushedDiv is still null then the user didn't release the left click over a div of class "arrangeable". Else, the pushedDiv will be the one we are looking for 
+0

'你必须将它的标签放在ordeer的dom中的不同位置以重新定位'这正是我想要做的。我喜欢你的解决方案。实际上很多。不幸的是,我认为这是不够的,因为如果鼠标在divTwo和divThree之间的父元素上释放,放置将不起作用,在这种情况下,它仍然应该放置元素。为此,我认为在释放鼠标时,我必须沿着计算最接近鼠标元素的方向做一些事情,然后,如您所说,将其替换并将替换的元素放置在放下的元素之后。 –