JQuery - перетаскиваемый div с масштабированием
Это мой код:
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'})
})
У меня есть основная проблема при использовании свойства css zoom
. Положение целевого перетаскиваемого div не согласовано с позицией курсора.
Есть ли какое-нибудь чистое и простое решение? Я могу динамически изменять масштаб.
Ответы
Ответ 1
Вам не нужно устанавливать свойство масштабирования. Я просто добавил разницу в положение перетаскивания, которое возникает из-за свойства масштабирования. Надеюсь, что это поможет.
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();
}
});
Ответ 2
Решение выше не получилось для меня. Поэтому я нашел свою. Я хотел бы поделиться им, если у кого-то еще есть такая же проблема.
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)
}
});
Ответ 3
Я использовал решения tuze и Yusuf Demirag и добавил немного для перетаскивания сетки:
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();
}
});
У него небольшая ошибка (иногда она не может получить точное значение, например: 160px), но она работала на то, что мне нужно.
Надеюсь, что это поможет.