简体   繁体   English

使用jquery-ui将dropggable中的可拖动元素居中

[英]Centering draggable elements inside droppable using jquery-ui

Below is an example of what I have been able to achieve so far... 以下是迄今为止我能够实现的一个例子......

 $(document).ready(function() { $(".item").draggable({ revert: 'invalid', snapMode: 'inner', scroll: false, stack: false, drag: function(event, ui) { $(".droparea").removeClass("highlight"); } }); $(".droparea").droppable({ tolerance: 'intersect', drop: function(event, ui) { var drop_el = $(this).offset(); var drag_el = ui.draggable.offset(); var left_end = (drop_el.left + ($(this).width() / 2)) - (drag_el.left + (ui.draggable.width() / 2)); var top_end = (drop_el.top + ($(this).height() / 2)) - (drag_el.top + (ui.draggable.height() / 2)); $(this).addClass("highlight").find("p"); ui.draggable.animate({ top: '+=' + top_end, left: '+=' + left_end }); } }); }); 
 .item { position: relative; margin: 0 auto; width: 100px; height: 100px; border: 1px solid red; margin-top: 50%; top: -50px } .droparea { width: 150px; height: 150px; float: left; margin: 10px; border: 1px solid #000; } .highlight { border: 1px solid blue } 
 <script src="http://code.jquery.com/jquery-1.11.1.min.js"></script> <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.js"></script> <div class="droparea"> <div class="item"></div> </div> <div class="droparea"> </div> 

Sometimes it refuses to center the .item div... The .item div has to be dragged into the inner part of the .droparea element, otherwise it won't center the .item element after releasing the item element. 有时它拒绝将.item div中心... .item div必须被拖入.droparea元素的内部部分,否则在释放item元素后它不会使.item元素居中。 Just wondering if there is any more elegant way to make a draggable div centered into the closest droppable element. 只是想知道是否有更优雅的方法使可拖动的div居中到最近的可放置元素。

You can use jQuery UI's inbuilt position() utility method for centering the dropped item as follows: 您可以使用jQuery UI的内置position()实用程序方法来中心删除的项目,如下所示:

 $(document).ready(function() { $(".item").draggable({ scroll: false, revert: 'invalid', stack: false, cursor: "pointer", drag: function(event, ui) { $(".droparea").removeClass("highlight"); } }); $(".droparea").droppable({ accept: ".item", drop: function(event, ui) { var $this = $(this); $(".highlight").removeClass("highlight"); $this.addClass("highlight"); ui.draggable.position({ my: "center", at: "center", of: $this, using: function(pos) { $(this).animate(pos, "slow", "linear"); } }); } }); }); 
 .item { position: relative; margin: 0 auto; width: 100px; height: 100px; border: 1px solid red; } .droparea { width: 150px; height: 150px; float: left; margin: 2px; border: 1px solid #000; outline: 1px solid transparent } .highlight { border: 1px solid blue } 
 <script src="http://code.jquery.com/jquery-1.11.1.min.js"></script> <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.js"></script> <div class="droparea"> <div class="item"></div> </div> <div class="droparea"></div> <div class="droparea"></div> 

I found the solution in this topic, apologies for a duplicate question. 我在这个主题中找到了解决方案,为重复的问题道歉。

How do I force jquery to center an element when it is dragged to and snapped to another container? 当拖动元素并将其捕捉到另一个容器时,如何强制jquery将元素居中?

So in this case the solution would look like this: 所以在这种情况下,解决方案看起来像这样:

 $( document ).ready(function() { $( ".item" ).draggable({ scroll: false, revert: 'invalid', stack: false, create: function(){$(this).data('position',$(this).position())}, cursor: "pointer", start:function(){$(this).stop(true,true)}, drag: function(event, ui) { $( ".droparea" ).removeClass( "highlight" ); } }); $( ".droparea" ).droppable({ accept: ".item", drop: function( event, ui ) { $( this ).addClass( "highlight" ).find( "p" ); snapToMiddle(ui.draggable,$(this)); } }); }); function snapToMiddle(dragger, target){ var topMove = target.position().top - dragger.data('position').top + (target.outerHeight(true) - dragger.outerHeight(true)) / 2; var leftMove= target.position().left - dragger.data('position').left + (target.outerWidth(true) - dragger.outerWidth(true)) / 2; dragger.animate({top:topMove,left:leftMove},{duration:200,easing:'linear'}); } 
 .item { position: relative; margin: 0 auto; width: 100px; height: 100px; border: 1px solid red;} .droparea { width: 150px; height: 150px; float: left; margin: 2px; border: 1px solid #000; outline: 1px solid transparent} .highlight {border: 1px solid blue} 
 <script src="http://code.jquery.com/jquery-1.11.1.min.js"></script> <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.js"></script> <div class="droparea"> <div class="item"> </div> </div> <div class="droparea"> </div> <div class="droparea"> </div> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM