jQuery UI ha questo già integrato, vedere questa demo: http://jqueryui.com/demos/draggable/#snap-to
se insistete sui guidlines si sarebbe forse dovuto sborsare jQueryUI o guardare il sorgente e vedere se puoi estenderlo
in alternativa, si può solo aggiungere le proprie funzioni di aggancio-in cima jQuery UI, ho giocato con lui per un po ', e mentre non sembra divertente, almeno non lo fa anche sembra essere molto difficile.
è possibile visualizzare l'esempio su jsfiddle: http://jsfiddle.net/x7uMh/103/ aggiornamento: questo funziona ~ jQuery 1.9 + jQueryUI 1.9. si rompe nel più nuovo jquery + ui. non può essere disturbato per vedere quale sia esattamente il problema, in genere i suoi soli problemi minori però. solo nel caso che il sito va mai giù, ecco il codice:
css
body{
font-family: courier new, courier;
font-size: 12px;
}
.draggable{
border: 1px solid #ccc;
display: inline-block;
cursor: move;
position: absolute;
}
.guide{
display: none;
position: absolute;
left: 0;
top: 0;
}
#guide-h{
border-top: 1px dashed #55f;
width: 100%;
}
#guide-v{
border-left: 1px dashed #55f;
height: 100%;
}
html
<div class="draggable">drag me!</div>
<div class="draggable">you can drag me too, if you like</div>
<div class="draggable">hep hep</div>
<div id="guide-h" class="guide"></div>
<div id="guide-v" class="guide"></div>
javascript (assicurarsi di includere jQuery + jQuery UI)
var MIN_DISTANCE = 10; // minimum distance to "snap" to a guide
var guides = []; // no guides available ...
var innerOffsetX, innerOffsetY; // we'll use those during drag ...
$(".draggable").draggable({
start: function(event, ui) {
guides = $.map($(".draggable").not(this), computeGuidesForElement);
innerOffsetX = event.originalEvent.offsetX;
innerOffsetY = event.originalEvent.offsetY;
},
drag: function(event, ui){
// iterate all guides, remember the closest h and v guides
var guideV, guideH, distV = MIN_DISTANCE+1, distH = MIN_DISTANCE+1, offsetV, offsetH;
var chosenGuides = { top: { dist: MIN_DISTANCE+1 }, left: { dist: MIN_DISTANCE+1 } };
var $t = $(this);
var pos = { top: event.originalEvent.pageY - innerOffsetY, left: event.originalEvent.pageX - innerOffsetX };
var w = $t.outerWidth() - 1;
var h = $t.outerHeight() - 1;
var elemGuides = computeGuidesForElement(null, pos, w, h);
$.each(guides, function(i, guide){
$.each(elemGuides, function(i, elemGuide){
if(guide.type == elemGuide.type){
var prop = guide.type == "h"? "top":"left";
var d = Math.abs(elemGuide[prop] - guide[prop]);
if(d < chosenGuides[prop].dist){
chosenGuides[prop].dist = d;
chosenGuides[prop].offset = elemGuide[prop] - pos[prop];
chosenGuides[prop].guide = guide;
}
}
});
});
if(chosenGuides.top.dist <= MIN_DISTANCE){
$("#guide-h").css("top", chosenGuides.top.guide.top).show();
ui.position.top = chosenGuides.top.guide.top - chosenGuides.top.offset;
}
else{
$("#guide-h").hide();
ui.position.top = pos.top;
}
if(chosenGuides.left.dist <= MIN_DISTANCE){
$("#guide-v").css("left", chosenGuides.left.guide.left).show();
ui.position.left = chosenGuides.left.guide.left - chosenGuides.left.offset;
}
else{
$("#guide-v").hide();
ui.position.left = pos.left;
}
},
stop: function(event, ui){
$("#guide-v, #guide-h").hide();
}
});
function computeGuidesForElement(elem, pos, w, h){
if(elem != null){
var $t = $(elem);
pos = $t.offset();
w = $t.outerWidth() - 1;
h = $t.outerHeight() - 1;
}
return [
{ type: "h", left: pos.left, top: pos.top },
{ type: "h", left: pos.left, top: pos.top + h },
{ type: "v", left: pos.left, top: pos.top },
{ type: "v", left: pos.left + w, top: pos.top },
// you can add _any_ other guides here as well (e.g. a guide 10 pixels to the left of an element)
{ type: "h", left: pos.left, top: pos.top + h/2 },
{ type: "v", left: pos.left + w/2, top: pos.top }
];
}
speranza che aiuti, meglio, hansi.
per riferimento: Ho giocato con un po 'di più, v'è un molto più versione più elegante per risolvere questo "ciclo di ricerca delle guide" interno semplicemente usando la stessa funzione computeGuides() sul target di trascinamento corrente. consente di aggiungere più marcatori (ad esempio allineare tramite centri, linee di base, ecc.) molto più facilmente e con minore ridondanza. dai un'occhiata qui: http://jsfiddle.net/kritzikratzi/x7uMh/1/ – kritzikratzi
Sembra che funzionerà, ma il collegamento jsfiddle no. Ma ci proverò di sicuro. –
ho provato solo sul chrome più recente, potrebbe essere necessario fare alcune adozioni in altri browser ... – kritzikratzi