旋转后获取相对x和y div

所以这里是我希望我在数学课上更多关注的一点:

http://i.imgur.com/noKxg.jpg

我有一个很大的容器div,里面有一些旋转的内容div。

我想要做的是通过在视口中移动Main Div来在子div之间生成动画。 如果我只是基于简单的x / y(上/左)计算来做这件事,那真的很容易,但是当涉及轮换时,我的数学就会崩溃。

我尝试了一些东西,并没有真正破解它。

以下是我的结果排序的简化版本,请随时拨动:

http://jsfiddle.net/dXKJH/3/

我真的无法弄清楚这一点!

[编辑]

我将这个解决方案作为首选项,因为我已经开发了一个使MSE6 +可以使用旋转插件的方法。

我不得不说,虽然我遵循所有的数学函数,并且它们看起来很干净,但结果并不是像素完美的,但这与PI计算有关吗? 看起来越大越好,我把这些盒子放在左上角的可能性就越小。 奇怪。

也有人可以提醒我,如果角度超过45度,我需要做什么动作,我找不到一个参考,我从几年前的数学课记得这个时候有4个象限或什么的......我怎么样希望我付出更多的关注.. :-)

非常感谢您迄今为止的所有帮助!


那么,这是我得到了多少...我做了一切更小,以便更好地看到div的最终位置,并且因此也添加了滚动条。

重要的一点:

  • Math.sin / Math.cos需要弧度,而不是度数
  • CSS围绕元素的中点旋转,而不是(0, 0) (这适用于主div和box div ;首先转换-width / 2 , - -height / 2 ,旋转,然后转回)
  • 使用parseInt(x, 10)来确保您使用的是10
  • 最终代码:http://jsfiddle.net/pimvdb/dXKJH/10/。 这个解决方案需要HTML中的硬编码位置和旋转,因为.css与旋转元素有一些怪癖。

    $("#div-1").rotate("-10deg");
    $("#div-2").rotate("10deg");
    $("#div-3").rotate("15deg");
    $("#div-4").rotate("75deg");
    
    $("#main").click(function() {
        console.log($('body').scrollLeft(), $('body').scrollTop());
    });
    
    $("a").click(function(e){
        goTo($(this).attr("id").substring(4,5));
        return false;
    });
    
    
    function n(x) {
        return parseInt(x, 10);
    }
    
    function sin(x) {
        return Math.sin(x / 180 * Math.PI);
    }
    
    function cos(x) {
        return Math.cos(x / 180 * Math.PI);
    }
    
    function rotate(x, y, a) {
        var x2 = cos(a) * x - sin(a) * y;
        var y2 = sin(a) * x + cos(a) * y;
        return [x2, y2];
    }
    
    
    var offsets = [null,
                  [0,100,-10],
                  [100,200, 10],
                  [300,100, 15],
                  [400,100, 75]].map(function(v) {
                      if(!v) return v;
                      var rotated = rotate(-50, -50, v[2]);
                      rotated[0] += v[0] + 50;
                      rotated[1] += v[1] + 50;
                      return rotated.concat(v[2]);
                   });
    
    
    function goTo(num){
        var obj = $("#div-" + num);
        var angle = -n(obj.rotate());
        var pointX = offsets[num][0] - 500;
        var pointY = offsets[num][1] - 500;
        var rotated = rotate(pointX, pointY, angle);
        var newX = rotated[0] + 500;
        var newY = rotated[1] + 500;
    
        $("#main").animate({rotate: angle + "deg"}, 1000);  
        $("body").animate({scrollLeft: newX,
                           scrollTop:  newY}, 1000)
    }
    

    我想建议一种不同的方法:

  • 从开始状态移至div-2(使用左/顶部样式重新定位Main Div)
  • 将Main Div的变换原点设置为视图中心(也是div-2的中心)
  • 按照相反数量的div-2旋转Main Div(div-2应正确居中)
  • 将Main Div旋转回0度。
  • 移动到div-3
  • 将Main Div的变换原点设置为视图中心(也是div-3的中心)
  • 按照与div-3相反的量旋转主分区(div-3应正确居中)
  • 冲洗并重复
  • 这可能更容易,并导致代码更简单(更易维护)。 请注意,移动和旋转可以是动画效果。 此外,如果您使用翻译而不是左/顶部样式,由于变换原点更改,此解决方案将变得更加复杂。


    它看起来像你试图模仿苹果的iPhone网站:http://www.apple.com/iphone/。 我在这里模拟了这种技术:

    http://jsfiddle.net/Yw9SK/2/ (使用Webkit转换)

    这真的不需要太多的数学,不要过度设计它。 你只需要取消孩子<div>的旋转,并调整它们的宽度/高度和容器<div>偏移量。

    以下是如何做到这一点:

    container width: 500  height: 500  rotation: 0       top: 0    left: 0
    child     width: 90   height: 90   rotation: 120deg  top: 330  left: 0
    


  • 为确保旋转是正确的,容器必须得到小孩的负向旋转:

    child rotation: 120deg  --> container rotation: -120deg
    
  • 为了让孩子在视图中居中,我们需要从容器宽度中减去宽度,除以2(保持居中),然后减去任何偏移量。 同样的事情发生在身高:

    Width                                   Height
     500    (container width)                 500    (container height)
    - 60    (child width)                    - 40    (child height)
    ----                                     ----
     440                                      460
       /    (divide by 2                        /    (divide by 2
       2     to keep it centered)               2     to keep it centered)
    ----                                     ----
     220                                      230
    -  0    (subtract the left: offset)      -330    (subtract the top: offset)
    ----                                     ----
     220    translateX                       -100    translateY
    

  • 因为“舞台”以集装箱顶部为中心,所以新的变形也将集中在舞台上。 (与正方形相比,对矩形进行这种操作并不困难)。因此,要应用于容器<div>变换是:

    transform: rotate(-120eg) translateX(220px) translateY(-100px)
    

    冲洗并重复其他子元素,并相应地通过它们进行转换。


    这个JSFiddle只是如何完成这个的一个例子。 它不是一个设计得很好的植入物。 一个更优化的解决方案会有一个转换延迟或动画延迟(而不是setInterval),然后监听'transitionEnd'或'animationEnd'事件。

    我肯定会建议不要试图以编程方式即时计算新的位置和旋转(虽然你可以,然后你只需要从JS中的.style属性中获取这些值)。 我建议您有需要预先定义的翻译/旋转(如我的示例中所示,尽管它们应该在CSS中),并将它们以正确的顺序应用于容器。 这将确保过渡快速顺畅。

    链接地址: http://www.djcxy.com/p/55839.html

    上一篇: Get relative x and y div after rotation

    下一篇: How to switch skins (or design themes) in iOS app?