Jquery可拖动与缩放问题

Man*_*uel 13 javascript css jquery-ui zoom

我在巫婆的页面上工作,所有内容都通过缩放来缩放.问题是,当我在页面中拖动某些内容时,拖动项会获得一个看似相对于缩放量的错误位置.

为了解决这个问题,我尝试对可拖动组件的位置进行一些数学计算,但是看起来甚至在视觉上它的修正,"真实"位置也没有重新计算.

这里有一些代码可以更好地解释:

var zoom = Math.round((parseFloat($("body").css("zoom")) / 100)*10)/10;

var x = $(this).data('draggable').position;
$(this).data('draggable').position.left = Math.round(x.left/zoom);
$(this).data('draggable').position.top = Math.round(x.top/zoom);
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激

tor*_*ke1 18

花了很多时间和精力来解决这个问题,但最后,我有一个有效的解决方案.

此解决方案适用于Firefox和IE.#canvas是包含draggable的div.请注意,我们必须确保元素手动保留在画布内.

如果画布具有与页面其余部分不同的缩放级别,则此方法也适用.

var pointerX;
var pointerY;
$(c).draggable({
  start : function(evt, ui) {
    pointerY = (evt.pageY - $('#canvas').offset().top) / zoom - parseInt($(evt.target).css('top'));
    pointerX = (evt.pageX - $('#canvas').offset().left) / zoom - parseInt($(evt.target).css('left'));
  },
  drag : function(evt, ui) {
    var canvasTop = $('#canvas').offset().top;
    var canvasLeft = $('#canvas').offset().left;
    var canvasHeight = $('#canvas').height();
    var canvasWidth = $('#canvas').width();

    // Fix for zoom
    ui.position.top = Math.round((evt.pageY - canvasTop) / zoom - pointerY); 
    ui.position.left = Math.round((evt.pageX - canvasLeft) / zoom - pointerX); 

    // Check if element is outside 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();  

    // Finally, make sure offset aligns with position
    ui.offset.top = Math.round(ui.position.top + canvasTop);
    ui.offset.left = Math.round(ui.position.left + canvasLeft);
  }
});
Run Code Online (Sandbox Code Playgroud)


Mat*_*lis 0

您是否考虑了滚动位置、边距和填充?例如:

x.left + 
parseInt($(this).css('margin-left')) + 
parseInt($(this).css('padding-left')) + 
parseInt($(this).parent().scrollLeft());

x.top + 
parseInt($(this).css('margin-top')) + 
parseInt($(this).css('padding-top')) + 
parseInt($(this).parent().scrollTop());
Run Code Online (Sandbox Code Playgroud)

然后根据需要调整缩放值?