使用CSS3 rotate属性时jQuery .position()奇怪

Mus*_*ian 15 javascript css jquery css-position css3

我正在使用jQuery .position()方法绝对定位旋转元素位置,然后使用jQuery 设置与位置相关的属性(顶部,左侧),返回的数据.css(pos)在哪里.我认为它会将元素留在它的位置,但元素的位置正在发生变化.pos.position()

如何使用设置旋转元素位置,以便它按预期放置?也许有一个系数取决于改变位置的角度?

我正在使用Google Chrome v.9,Windows XP进行测试.

HTML

<div id="container">
  <div id="element"> 
    <img src="http://t0.gstatic.com/images?q=tbn:ANd9GcS0Fawya9MVMez80ZusMVtk_4-ScKCIy6J_fg84oZ37GzKaJXU74Ma0vENc"/>
  </div>
</div> 
Run Code Online (Sandbox Code Playgroud)

CSS

#container {
    position: relative;   
    border: 1px solid #999;
    padding: 5px;
    height: 300px;
    width:300px;
}    
#element {
    position: absolute;
    top:50px;
    left: 60px;
    width: auto;
    border: 1px solid #999;
    padding: 5px;
    -webkit-transform: rotate(45deg);
    -moz-transform: rotate(45deg);
}
Run Code Online (Sandbox Code Playgroud)

JS

$(document).ready(function(){
    var $el = $('#element'),
    // getting position    
        pos = $el.position();
    alert(pos.left + '/' + pos.top);
    // alerts 37/11

    // setting css position attributes equal to pos
    $el.css(pos);
    // re-getting position
    pos = $el.position();
    alert(pos.left + '/' + pos.top);
    // alerts 14/-28
});    
Run Code Online (Sandbox Code Playgroud)

查看它http://jsfiddle.net/Antaranian/2gVL4/

Šim*_*das 7

// Needed to read the "real" position
$.fn.adjustedPosition = function() {
    var p = $(this).position();
    return {
        left: p.left - this.data('dx'),
        top: p.top - this.data('dy')
    }
};
Run Code Online (Sandbox Code Playgroud)
$(function() { 

    var img = $('img'),
        pos;

    // Calculate the delta
    img.each(function() {
        var po = $(this).position(), // original position
            pr = $(this).addClass('rot').position(); // rotated position

        $(this).data({
            dx: pr.left - po.left, // delta X
            dy: pr.top - po.top // delta Y
        });
    });

    // Read the position
    pos = img.adjustedPosition();    
    alert(pos.left + '/' + pos.top);     

    // Write the position
    img.css(pos);

    // Read the position again
    pos = img.adjustedPosition();    
    alert(pos.left + '/' + pos.top);

});
Run Code Online (Sandbox Code Playgroud)

现场演示: http ://jsfiddle.net/2gVL4/4/

那么这里发生了什么:

  1. 旋转图像的CSS代码存储在一个特殊的CSS类中.我这样做是因为我想读取图像的原始位置(旋转前).一旦我读到原始位置,我就应用.rot该类,然后再次读取位置以计算差值(delta),该差值存储在元素的data()中.

  2. 现在,我可以通过自定义方法adjustedPosition(上面定义)读取位置.此方法将读取元素的位置,然后减去存储在元素的data()内的delta值.

  3. 要写出位置,只需使用css(pos)正常的方法即可.