jQuery - draggable div with zoom

前端 未结 3 499
暖寄归人
暖寄归人 2020-12-19 00:58

This is my code:

http://jsfiddle.net/652nk/

HTML

相关标签:
3条回答
  • 2020-12-19 01:24

    The solution above did not work out for me. So I found my own. I wanted to share it if someone else also has the same issue.

    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 讨论(0)
  • 2020-12-19 01:25

    You don't need to set zoom property. I just added the difference to draggable's position which occurs due to the zoom property. Hope it helps.

    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 讨论(0)
  • 2020-12-19 01:44

    I used both tuze's and Yusuf Demirag's solutions and added a little something for dragging on a grid:

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

    It has a minor bug (it can't sometimes get to an exact value eg: 160px) but it worked for what I needed.

    Hope it helps.

    0 讨论(0)
提交回复
热议问题