2013-05-05 71 views
2

我在JQuery中有一个可拖动的元素,如果您将它拖到某个区域上,它有一个网格,并且如果您将它拖到另一个区域上,则它没有网格(或者网格设置为[1,1],同样的事情)。这里是我的代码:JQuery ...调整网格偏移中拖动

$('#draggableThing').draggable({ 
     drag:function(){ 
      if (isOverRegionWthGrid()) 
      { 
       $(this).draggable('option','grid',[1,20]) 
      } 
      else 
      { 
       $(this).draggable('option','grid',[1,1]) 
      }}}) 

迄今为止工作很好。唯一的问题是,当我从无网格区域拖到具有网格的区域时,网格的“偏移”不一致。我需要它与每次拖动时不会上下变换几个像素的网格对齐。看来,JQuery通过可拖动元素的初始位置来定义网格。有没有任何意见给电网绝对的位置,或任何解决方法?

谢谢!

+2

您可以发布[的jsfiddle(HTTP://的jsfiddle 。净)? – apaul 2013-05-13 01:22:19

+0

当拖动开始时,您可以查看[drag start event](http://api.jqueryui.com/draggable/#event-start)将元素移动到网格上。 – 2013-05-13 15:38:48

+0

http://jsfiddle.net/ECyUa/1/ – 2013-05-18 17:46:46

回答

0

使用CSS,定位网格元素并将其设置为绝对定位?

+0

有一个网格元素?我不知道底层代码是如何工作的。 – 2013-05-18 17:23:18

0

我会建议,当切换回到1,20时,您将可拖动的可拖动对象移动到要使用模分割的网格中的坐标。例如:(currentX - gridOriginX)%cellWidth,(currentY - gridOriginY)%cellHeight。

在下面的示例中,我只是使用可拖动元素的原始位置来确定网格应为的位置。我也使用可拖动的“over”事件来代替“drag”事件。

HTML:

<div id="thing"> 
<div id="draggable5" class="draggable ui-widget-content"> 
    <p>Drag Me</p> 
</div> 
</div> 
<div id="thing2"> 
</div> 

CSS:

#draggable5 { 
    width: 100px; 
    height: 100px; 
    border: 1px solid #999; 
} 
#thing { 
    height: 150px; 
    border: 1px solid #900; 
} 
#thing2 { 
    height: 150px; 
    border: 1px solid #00F; 
} 

的Javascript:

$(document).ready(function() { 

    var obj = $("#draggable5"); 
    obj.draggable({ 
     grid: [ 1, 20 ], 
    }).data("init", obj.offset()); 

    $("#thing").droppable({ 
     over: function(e, ui) { 
      obj = ui.draggable; 
      var init = obj.data("init"); 
      var here = obj.offset(); 
      here.top = init.top + Math.floor((here.top - init.top)/20) * 20; 
      here.left = init.left + Math.floor((here.left - init.left)/1) * 1; 
      obj.offset(here); 
      obj.draggable("option", "grid", [ 1, 20 ]); 
     } 
    }); 
    $("#thing2").droppable({ 
     over: function(e, ui) { 
      obj = ui.draggable; 
      obj.draggable("option", "grid", [ 1, 1 ]); 
     } 
    }); 
}); 

小提琴:http://jsfiddle.net/qaqDz/3/

+0

谢谢,终于有人企图回答!稍后我会更仔细地看看这一点,但乍一看似乎并不幸运。当我用[1,1]网格将区域中的元素放下时,然后将其拾取并移动到[1,20]网格,网格再次关闭。这正是我的问题。它可以正常工作,如果您来回拖动它,但如果放入光滑区域然后拖入网格区域,则不起作用。 – 2013-05-18 17:21:54

+0

对不起,直到现在才看到您的评论!我绕了一下,发现你可以混淆jQueryUI可拖动的数据,当你开始拖动。特别是,如果使用$(“#draggable5”)。data(“draggable”),则会得到具有属性originalPageX和originalPageY的对象。这些是拖动开始时的鼠标坐标。从理论上讲,如果您通过正确的数量来抵消这些因素,您可以将其恢复到网格中。我无法工作,但稍后可能有时间再次检查。 – 2013-06-29 01:10:35

+0

谢谢安迪!我认为你可能会做些什么...我会尝试一点点弄乱这些值。 – 2013-07-04 11:01:15