当一个元素被拖动到另一个容器并被捕捉到该容器时,如何强制jquery将其居中
How do I force jquery to center an element when it is dragged to and snapped to another container?
我希望一些方形的可拖动对象(在这种情况下,只有带有数字的<td>
框)能够捕捉到一些空的表单元格,并捕捉到这些单元格的中心(空td框),而不是这些单元格的(外)边缘,这似乎是默认情况下要做的。
这是我的剧本
<script type="text/javascript">
$(document).ready(function () {
$(".inputs div").draggable( {
snap: ".spaces"
});
});
</script>
编辑:这是整个文件
<!DOCTYPE html>
<head>
<title>Draggable</title>
<script type="text/javascript" src="jquery-1.7.2.min.js"></script>
<script type="text/javascript" src="jquery-ui-1.8.21.custom.min.js"></script>
<script type="text/javascript" src="jquery.ui.touch-punch.min.js"></script>
<style>
.block {
z-index:9999;
cursor:move;
}
li {
list-style:none;
}
tr {
border: 2px solid black;
}
table {
border: 2px solid black;
}
.inputs div {
float:left;
background-color:#FFFFFF;
color:#004E66;
font-size:x-large;
margin:2px;
padding:20px;
border:1px solid black;
}
.spaces td {
background-color:#666666;
margin:2px;
padding:36px;
border:2px solid black;
}
</style>
</head>
<body>
<form id="form1">
<div class="inputs">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
</div>
<br/>
<table class="spaces">
<tr>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
</table>
</form>
<!-- here we are telling jquery to make each element inside of class 'inputs' draggable -->
<script type="text/javascript">
$(document).ready(function () {
$(".inputs div").draggable( {
snap: ".spaces"
}).center();
});
</script>
这是一个基于文本的的大致说明
-----+---------+XXXXXXXXXXX||||Y x||X|-----+-------+X||X|
- 如果上面的框是最上面tr行右角的td单元格
- 那么X是元素当前粘附的位置(显然不是大的,我只是展示它粘在哪里。。。实际上我把一些X显示了它到达一个一定程度上接近它…)
- 基本上,这个模型表明只有表的外部边缘相对于可拖动元件具有"重力"。我真正想要的要做的是用对所有边缘的排斥捕捉到td细胞中,而不是具有对外部事物的吸引力
- Y是拖动图元所需的捕捉位置
- 最后,出于演示的原因,我希望元素能够快速就位用某种过渡而不是突然跳跃
我相信这就是您想要的。
很明显,如果你愿意,你可以改变定位,它更适合你的需求。
演示在这里:演示
$(document).ready(function () {
$(".inputs div").draggable( {
opacity: .4,
create: function(){$(this).data('position',$(this).position())},
cursorAt:{left:15},
cursor:'move',
start:function(){$(this).stop(true,true)}
});
$('.spaces').find('td').droppable({
drop:function(event, ui){
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:600,easing:'easeOutBack'});
}
snapToMiddle函数的一个注释:
为了让它对我来说正常工作,我不得不将其更改为>
function snapToMiddle(dragger, target){
var offset = target.offset();
var topMove = (target.outerHeight(true) - dragger.outerHeight(true)) / 2;
var leftMove= (target.outerWidth(true) - dragger.outerWidth(true)) / 2;
dragger.offset({ top: topMove + offset.top, left: leftMove + offset.left })
}
此外,我创建了一个数组,将dragger与滴管关联起来,在窗口reSize上,我确保所有滴管都不会走散:
$( window ).resize(function() {
for( i = 0 ; i < assc.length - 1 ; i++ )
{
var drp = assc[i].drop;
var drg = assc[i].drag;
snapToMiddle(drg,drp);
}
});
http://jsfiddle.net/vtdhV/
我制造了一把小提琴来解决你的问题。。有点(如果我理解正确的话)。
红色的div位于td
的中心,您可以捕捉到这些div。只需移除边界,它就会显示为捕捉到td的中心。.draggable
的性质将导致可拖动对象捕捉到任何边,而不是同时捕捉到所有边。
如果这还不够,您可能需要为.stop
实现一个调用处理程序,该处理程序根据您的期望调整元素的位置。
您需要指定一个与拖动元素大小相同的捕捉目标。如果你的抽屉总是一样大,那也没什么大不了的。只需在单元格中添加一个空的、绝对定位的div,然后设置CSS,使其大小和中心位置正确。然后,将snap
选择器设置为div。要仅捕捉到捕捉目标的内部,请将snapMode
设置为"inner"
。
$(".inputs div").draggable({
snap: ".spaces td div",
snapMode: "inner"
});
但是,如果可拖动对象的大小可能不同,则每次开始拖动元素时,都需要调整放置目标的大小并重新居中。在鼠标拖动时执行此操作(使用mousedown
,因为dragstart
太晚且不起作用):
$(".inputs div").draggable({
snap: ".spaces td div",
snapMode: "inner",
}).mousedown(function(){
var targets = $(".spaces td div");
targets.height(this.offsetHeight);
targets.width(this.offsetWidth);
targets.each(function(){
$(this).position({ of: this.parentNode });
});
});
http://jsfiddle.net/gilly3/mPr3A/
在这些tds中添加一个div,并通过为tds和新添加的div提供固定的宽度和高度将其居中。然后跨过障碍物到达这些潜水艇。
$(document).ready(function () {
$('<div></div>').appendTo('.spaces td');
$(".inputs div").draggable({
snap: ".spaces td div",
snapMode:'inner'
});
});
此外,tds和div的css如下所示。
.block {
z-index:9999;
cursor:move;
}
.productCode {
}
li {
list-style:none;
}
tr {
border: 2px solid black;
}
table {
border: 2px solid black;
}
.inputs div {
float:left;
background-color:#FFFFFF;
color:#004E66;
font-size:x-large;
margin:2px;
padding:20px;
border:1px solid black;
}
.spaces td {
background-color:#666666;
width:80px;
height:80px;
border:2px solid black;
}
.spaces td div {
margin:0 auto;
width:50px;
height:70px;
}
Fiddle演示-http://jsfiddle.net/nsjithin/u25Bs/1/
如果我解决了问题,请将当前脚本替换为:
$(document).ready(function () {
// create a bunch of invisible divs
var divs = $('<div></div><div></div><div></div><div></div>');
// make them 2/2 and add them to the existing tds
divs.css({ width:'50%', float:'left' }).appendTo('.spaces td');
// snap to everything
$(".inputs div").draggable({snap: ".spaces td, .spaces td div" }).center();
});
如果我不只是说,我会修复它。
- 如何使用jquery强制一个单词更改大小写等以保留品牌
- jQuery中的attr()是否强制小写
- 强制jQuery Deferred等待Ajax在“”中完成;那么“;处理程序
- JQuery:如何强制选择一个选项为"选择“;,使用FancySelect插件
- 当一个元素被拖动到另一个容器并被捕捉到该容器时,如何强制jquery将其居中
- 如何强制 jQuery 向服务器发出 GET 请求以刷新缓存的资源
- 强制jQuery在运行时更改动画
- 如何再次使用强制Jquery鼠标输入法
- 如何强制jQuery Ajax序列化数据
- 强制jQuery show/hide尊重display: table
- 如何强制jQuery .change函数从自动完成对象中捕获用户选择
- 如何强制jQuery“监听”?为将来的AngularJS ng-repeat元素激活插件
- 如何强制jQuery不自动关闭标记?
- 如何强制jQuery .load()方法使用POST
- 如何强制jquery$.when(..)失败
- 如何强制jQuery添加'下划线'POST请求的(_)参数
- 强制 jQuery UI 日期选取器显示在输入字段下方
- 强制 jQuery mobile 使用自己的 CSS 类
- 即使表单值不变,如何强制 jquery 验证器触发验证方法
- 强制jQuery在fadeIn()之前识别某些属性