改变宽度/高度移动旋转元素

时间:2014-09-23 01:45:43

标签: jquery css rotation transform

更改旋转元素的宽度/高度时,元素会移动!

这是一个例子 的 JSFiddle

例如,当我更改宽度时,对象将失去其原始位置,这会影响jQueryUI Resizable并使其无法使用。

CSS:

.test{
    position: absolute;
    top: 200px;
    left; 200px;

    width: 400px;
    height: 200px;
    background: red;

    transform: rotate(-90deg);
}

JSFiddle
是否存在通过反转此效果来纠正此问题的库或函数。

修改 我做了一个jQuery函数,在调整旋转元素大小时修正左上角位置,作为答案添加。 这也是 patch for jqueryui resizable

2 个答案:

答案 0 :(得分:1)

默认情况下,

transform-origin设置为centre,当您更改元素的宽度/高度时,原始中心会移动,从而移动对象。

看到这个更新的小提琴,修改了宽度http://jsfiddle.net/ww8k4hy4/6/

修改

transform-origin的两个值设置为宽度的一半 - 请参阅:http://jsfiddle.net/ww8k4hy4/10/

(事实证明这对我也很有帮助,所以谢谢:))

答案 1 :(得分:1)

这个jQuery函数会改变元素的大小并进行必要的修正以保留左上角的位置

<强> JSFiddle

/**
* Resizes rotated set of elements and preserves top-left corner position
* @param {Number} new_width
* @param {Number} new_height
* @param {Number} angle in degrees
* @returns {object} the current jQuery set
*/
$.fn.rotSize = function(new_width, new_height, angle){

    //Convert angle from degrees to radians
    var angle = angle * Math.PI / 180

    $(this).each(function(i, elem){
        var $elem = $(elem);
        //initial CSS position.
        var pos = {left: parseInt($elem.css('left')), top: parseInt($elem.css('top'))};
        var init_w = $elem.width();
        var init_h = $elem.height();
        //Get position after rotation with original size
        var x = -init_w/2;
        var y = init_h/2;
        var new_x = y * Math.sin(angle) + x * Math.cos(angle);
        var new_y = y * Math.cos(angle) - x * Math.sin(angle);
        var diff1 = {left: new_x - x, top: new_y - y};

        //Get position after rotation with new size
        var x = -new_width/2;
        var y = new_height/2;
        var new_x = y * Math.sin(angle) + x * Math.cos(angle);
        var new_y = y * Math.cos(angle) - x * Math.sin(angle);
        var diff2 = {left: new_x - x, top: new_y - y};

        //Get the difference between the two positions
        var offset = {left: diff2.left - diff1.left, top: diff2.top - diff1.top};
        //Calculate the correction
        var new_pos = {left: pos.left - offset.left, top: pos.top + offset.top};

        //Apply
        $elem.css(new_pos);
        $elem.css({width: new_width, height: new_height});
    });
}

另一个有用的功能:

/**
* Calculate the size correction for resized rotated element
* @param {Number} init_w
* @param {Number} init_h
* @param {Number} delta_w
* @param {Number} delta_h
* @param {Number} angle in degrees
* @returns {object} correction css object {left, top}
*/
$.getCorrection = function(init_w, init_h, delta_w, delta_h, angle){
    //Convert angle from degrees to radians
    var angle = angle * Math.PI / 180

    //Get position after rotation with original size
    var x = -init_w/2;
    var y = init_h/2;
    var new_x = y * Math.sin(angle) + x * Math.cos(angle);
    var new_y = y * Math.cos(angle) - x * Math.sin(angle);
    var diff1 = {left: new_x - x, top: new_y - y};

    var new_width = init_w + delta_w;
    var new_height = init_h + delta_h;

    //Get position after rotation with new size
    var x = -new_width/2;
    var y = new_height/2;
    var new_x = y * Math.sin(angle) + x * Math.cos(angle);
    var new_y = y * Math.cos(angle) - x * Math.sin(angle);
    var diff2 = {left: new_x - x, top: new_y - y};

    //Get the difference between the two positions
    var offset = {left: diff2.left - diff1.left, top: diff2.top - diff1.top};
    return offset;
}