2011-12-22 15 views
10

Questo è il mio codice:jQuery - div trascinabili con zoom

http://jsfiddle.net/652nk/

HTML

<div id="canvas"> 
    <div id="dragme"></div> 
</div> 

CSS

#canvas { 
    width:500px; 
    height:250px; 
    border:1px solid #444; 
    zoom:0.7; 
} 
#dragme { 
    width:100px; 
    height:50px; 
    background:#f30; 
} 

JS

$(function(){ 
    $('#dragme').draggable({containment:'parent'}) 
}) 

Ho un grosso problema quando utilizzo la proprietà css zoom. La posizione del div trascinabile target non è coordinata con la posizione del cursore.

Esiste una soluzione semplice e pulita? Dovrei essere in grado di cambiare lo zoom in modo dinamico.

+0

Ho visto questo: http://stackoverflow.com/questions/2930092/jquery-draggable-with-zoom-problem ... non molto di aiuto. – enloz

+0

perché stai usando lo zoom? –

+0

Perché non è di grande aiuto? Sembra essere esattamente il tuo problema. –

risposta

20

Non è necessario impostare la proprietà dello zoom. Ho appena aggiunto la differenza alla posizione di draggable che si verifica a causa della proprietà zoom. Spero che sia d'aiuto.

Fiddle

http://jsfiddle.net/TqUeS/

JS

var zoom = $('#canvas').css('zoom'); 
var canvasHeight = $('#canvas').height(); 
var canvasWidth = $('#canvas').width(); 

$('#dragme').draggable({ 
    drag: function(evt,ui) 
    { 
     // zoom fix 
     ui.position.top = Math.round(ui.position.top/zoom); 
     ui.position.left = Math.round(ui.position.left/zoom); 

     // don't let draggable get outside the canvas 
     if (ui.position.left < 0) 
      ui.position.left = 0; 
     if (ui.position.left + $(this).width() > canvasWidth) 
      ui.position.left = canvasWidth - $(this).width(); 
     if (ui.position.top < 0) 
      ui.position.top = 0; 
     if (ui.position.top + $(this).height() > canvasHeight) 
      ui.position.top = canvasHeight - $(this).height(); 

    }     
}); 
+0

Hm ... Grazie per una risposta, ma non funziona. Se imposto ad es. 'zoom: 0.4' ... http://jsfiddle.net/jtnQU/1/ – enloz

+0

Il mio male. L'ho aggiornato. – tuze

8

La soluzione di cui sopra non ha funzionato per me. Così ho trovato il mio. Volevo condividerlo se anche qualcun altro ha lo stesso problema.

var zoom = $('#canvas').css('zoom');  
$('#dragme').draggable({ 
    drag: function(evt,ui) 
    { 
     var factor = (1/zoom) - 1 

     ui.position.top += Math.round((ui.position.top - ui.originalPosition.top) * factor) 
     ui.position.left += Math.round((ui.position.left - ui.originalPosition.left) * factor) 
    }     
}); 
+0

funziona come un fascino –

+0

Questa soluzione funziona, soprattutto no! –

+0

Questa soluzione è ottima e dovrebbe essere accettata, perché rappresenta correttamente lo zoom del genitore contenitore. Grazie, Yusuf! – ryancdotnet

2

Ho usato entrambe le soluzioni di Yusuf Demirag di tuze ed e ha aggiunto un po 'di qualcosa per il trascinamento su una griglia:

var gridSize = 20; 
$('#dragme').draggable({ 
    grid: [ gridSize , gridSize ], 
    snap: true, 
    snapTolerance: gridSize/2, 

    drag: function(event,ui){ 
     var factor = (1/zoom) -1; 

     ui.position.top += Math.round((ui.position.top - ui.originalPosition.top) * factor); 
     ui.position.top -= ui.position.top % gridSize; 
     ui.position.left += Math.round((ui.position.left- ui.originalPosition.left) * factor); 
     ui.position.left -= ui.position.left % gridSize; 


     if (ui.position.left < 0) 
      ui.position.left = 0; 
     if (ui.position.left + $(this).width() > canvasWidth) 
      ui.position.left = canvasWidth - $(this).width(); 
     if (ui.position.top < 0) 
      ui.position.top = 0; 
     if (ui.position.top + $(this).height() > canvasHeight) 
      ui.position.top = canvasHeight - $(this).height(); 
    } 
}); 

Ha un bug minore (non a volte può arrivare a un valore esatto per esempio : 160px) ma ha funzionato per ciò di cui avevo bisogno.

Spero che aiuti.

Problemi correlati