Wie kann ich erzwingen, jquery zentrieren eines Elements beim ziehen zu und schnappte in einen anderen container?
Möchte ich einige square-shaped draggable-Objekten (in diesem Fall nur <td>
Kästen mit zahlen in Ihnen) in der Lage sein zu schnappen, um ein paar leere Zellen in einer Tabelle und ausrichten an der Mitte dieser Zellen (leere td-Boxen), nicht die (äußeren) Rand-jene Zellen, die ist, was ist zu tun scheint, standardmäßig.
Hier ist mein script.:
<script type="text/javascript">
$(document).ready(function () {
$(".inputs div").draggable( {
snap: ".spaces"
});
});
</script>
EDIT: Hier ist die gesamte Datei
<!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>
Hier ist eine grobe text-basierte Darstellung, was Los ist
-----+---------+ XXXXXXXXXXX X| | | | Y-x| | X| -----+-------+X| | X|
- wenn die obige box ist eine td-Zelle in der rechten Ecke des obersten tr Zeile
- dann X ist, wo die Elemente sind derzeit kleben (natürlich nicht
großer, ich bin gerade zeigen die Orte, wo es steckt...tatsächlich habe ich entfernt
einige der X ist zu zeigen, wie Sie einrastet, um die Ecke, sobald es erreicht ein
gewisse Nähe zu ihm...) - im Grunde dieses Modell veranschaulicht, dass nur die äußeren Ränder der Tabelle
habe "gravity" mit Bezug auf das draggable-element. Was ich wirklich will es
zu tun ist, rasten in die td-Zellen mit Abstoßung ALLE Kanten, die nicht
mit der Heranziehung zu den externen. - Y die gewünschten snap-Lage für das gezogene element.
- Schließlich für die Präsentation der Gründe, warum ich wollen würde, dass das element einrasten
mit einer Art von übergang, anstatt abrupt zu springen...
- Wollen Sie die draggable-Elemente werden vertikal zentriert und horizonally innerhalb der tds? Weil Sie nicht passen würde, sehr schön.
- 4000 views. 9 upvotes auf die richtige Antwort. 4 auf die Frage. moochers. Zeichen in Euch Chaoten!!!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, das ist, was Sie wollen.
Können Sie natürlich ändern, die Positionierung, wenn Sie wollen, und es zu Ihren Bedürfnissen passt besser.
Demo ist hier: DEMO
jQuery UI 1.8.18
Einen Hinweis auf die snapToMiddle Funktion:
Um es zu bekommen, um richtig zu arbeiten für mich, ich hatte zu ändern, um >
Auch, ich habe ein array, dass die dragger auf den dropper und auf die Fenster die Größe, die ich stellen Sie sicher, dass alle meine Dropper nicht abschweifen:
dragger.animate({top:topMove,left:leftMove},{duration:600,easing:'easeOutBack'});
http://jsfiddle.net/vtdhV/
Erstellte ich ein Turnschuh, die Ihr problem löst .. in gewisser Weise (wenn ich das richtig verstanden habe).
Den roten divs zentriert innerhalb der
td
s, und Sie rasten auf diese statt. Nur entfernen Sie den Rahmen und es wird angezeigt, um snap zu dem Mittelpunkt der td. Die Natur.draggable
verursachen die draggables zu snap auf jeder Kante, anstatt alle Kanten gleichzeitig.Wenn das nicht genug ist, können Sie implementieren müssen, um einen Ruf-handler für
.stop
dass passt die position des Elements basierend auf Ihren Erwartungen.Müssen Sie einen snap-Ziel, das die gleiche Größe wie Ihr element gezogen. Dies ist nicht eine große Sache, wenn Ihre draggables sind immer alle die gleiche Größe. Fügen Sie einfach eine leere, absolut positioniertes div in Ihre Zelle, und richten Sie Ihre CSS so, dass es große und richtig zentriert. Dann stellen Sie Ihre
snap
- Selektor zu sein, dass div. Nur snap auf der Innenseite des snap Ziel, gesetzt IhresnapMode
zu"inner"
.Aber wenn die Größe des draggables können variieren, müssen Sie die Größe ändern und zentrieren Ihre drop-Ziele jedes mal, wenn Sie ziehen Sie ein element aus. Tun Sie dies auf mousedown des draggable (Verwenden Sie
mousedown
weildragstart
ist zu spät und funktioniert nicht):http://jsfiddle.net/gilly3/mPr3A/
Fügen Sie ein div in diesen tds und zentrieren Sie es, indem Sie eine Feste Breite und Höhe für die tds und neu Hinzugefügt divs. Dann Spanne die draggables, um diese divs.
Auch css-Code für tds und divs wird wie folgt sein.
Fiddle Demo - http://jsfiddle.net/nsjithin/u25Bs/1/
Wenn ich das problem richtig, ersetzen Sie Ihre aktuelle Skript mit dabei:
Wenn ich ihn nicht einfach sagen und ich werde es beheben.
.center()
in jquery oder jquery ui..?