Jquery draggable with zoom problem

后端 未结 5 1237
面向向阳花
面向向阳花 2020-12-05 11:21

I am working on a page in witch all its contents are scaled by using zoom. The problem is that when I drag something in the page the dragging item gets a bad position that s

5条回答
  •  半阙折子戏
    2020-12-05 11:54

    Took a lot of time and effort to fix this, but finally, I have a solution that works.

    This solution works for both Firefox and IE. #canvas is the div that contains the draggable. Note that we have to make sure the elements stays inside the canvas manually.

    This also works if if canvas has a different zoom level than the rest of the page.

    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);
      }
    });
    

提交回复
热议问题