jQuery Drag/Resize with CSS Transform Scale

前端 未结 13 1988
忘了有多久
忘了有多久 2020-11-27 13:39

I am applying a CSS transform (and the browser specific -webkit, -o etc):

transform: matrix(0.5 , 0 , 0, 0.5, 0 , 0);

to a div then using jQuery\'s draggable

13条回答
  •  余生分开走
    2020-11-27 14:24

    It's been a while since this question was asked. I have found (actually created) an answer. All it requires is setting callback handlers. No editing jquery-ui needed!

    Note: zoomScale in this example is a global variable and the transform is set using animate (aided by jquery.transform.js) like so:

    target.animate({
        transform: 'scale(' + zoomScale + ')'
    });
    

    Take a look at this:

    transform scale() fix for resizable:

    $(this).resizable({
        minWidth: -(contentElem.width()) * 10,  // these need to be large and negative
        minHeight: -(contentElem.height()) * 10, // so we can shrink our resizable while scaled
        resize: function(event, ui) {
    
            var changeWidth = ui.size.width - ui.originalSize.width; // find change in width
            var newWidth = ui.originalSize.width + changeWidth / zoomScale; // adjust new width by our zoomScale
    
            var changeHeight = ui.size.height - ui.originalSize.height; // find change in height
            var newHeight = ui.originalSize.height + changeHeight / zoomScale; // adjust new height by our zoomScale
    
            ui.size.width = newWidth;
            ui.size.height = newHeight;
    
        }
    });
    

    transform scale() fix for draggable:

    $(this).draggable({
        handle: '.drag-handle',
        start: function(event, ui) {
            ui.position.left = 0;
            ui.position.top = 0;
        },
        drag: function(event, ui) {
    
            var changeLeft = ui.position.left - ui.originalPosition.left; // find change in left
            var newLeft = ui.originalPosition.left + changeLeft / (( zoomScale)); // adjust new left by our zoomScale
    
            var changeTop = ui.position.top - ui.originalPosition.top; // find change in top
            var newTop = ui.originalPosition.top + changeTop / zoomScale; // adjust new top by our zoomScale
    
            ui.position.left = newLeft;
            ui.position.top = newTop;
    
        }
    });
    

    Let me know if you find any problems or further improvements on this. :)

    Reference: jQuery-UI resizable/draggable with transform: scale() set

提交回复
热议问题