【问题标题】:How to retrieve the angle in css3 rotate?如何检索css3旋转中的角度?
【发布时间】:2012-11-15 13:19:26
【问题描述】:

我有以下代码设置元素的旋转角度:

$('#1-link-2')
                .css('height', length)
                .css('-webkit-transform', 'rotate(' + angle + 'deg)')
                .css('-moz-transform', 'rotate(' + angle + 'deg)')
                .css('-o-transform', 'rotate(' + angle + 'deg)')
                .css('-ms-transform', 'rotate(' + angle + 'deg)')
                .css('transform', 'rotate(' + angle + 'deg)');

以前动态计算角度的位置(它基于鼠标的位置)。

我需要能够检索角度。我为初学者试过这个:

var angle= $("#1-link-2").css('-webkit-transform');
    $('#node-title').html(angle);   //just to print it to the screen for me

它给了我这个文字

matrix(0.5425908601788315, -0.839997118120292, 0.839997118120292, 0.5425908601788315, 0, 0)

如何以度为单位检索角度?

【问题讨论】:

  • 如果使用更新的jQuery版本,则不需要所有 -browser特定的名称。只需:transform且仅一次:) span>
  • @roasted,谢谢,看起来应该可以解决问题!我现在试着实施它。 span>
  • @roxon,您的意思是在 animate 内部使用变换,例如 stackoverflow.com/questions/5610171/transform-in-jquery,还是您指的是其他东西?
  • 顺便说一下,将矩阵计算回学位时,这就是我如何在987654323 FIDDLE。不确定 transform 属性是如何以及何时被规范化的,但进行搜索,您可能会发现?

标签: javascript jquery css


【解决方案1】:

第一个值是旋转角度的余弦值,第二个值是旋转角度的正弦值 - 只要您没有在该元素上累积任何变换。使用您最喜欢的数学库来计算反正弦和余弦。

.54 的反余弦为 54ish 或 306 度。 -0.83 的反正弦是 234ish 或 306 度。

嘿,正确答案一定是306度。

如果您忘记了几何图形,请点击此处is a refresher.

【讨论】:

    【解决方案2】:

    看到这个post

    var el = document.getElementById("thing");
    var st = window.getComputedStyle(el, null);
    var tr = st.getPropertyValue("-webkit-transform") ||
             st.getPropertyValue("-moz-transform") ||
             st.getPropertyValue("-ms-transform") ||
             st.getPropertyValue("-o-transform") ||
             st.getPropertyValue("transform") ||
             "FAIL";
    
    // With rotate(30deg)...
    // matrix(0.866025, 0.5, -0.5, 0.866025, 0px, 0px)
    console.log('Matrix: ' + tr);
    
    // rotation matrix - http://en.wikipedia.org/wiki/Rotation_matrix
    
    var values = tr.split('(')[1].split(')')[0].split(',');
    var a = values[0];
    var b = values[1];
    var c = values[2];
    var d = values[3];
    
    var scale = Math.sqrt(a*a + b*b);
    
    console.log('Scale: ' + scale);
    
    // arc sin, convert from radians to degrees, round
    var sin = b/scale;
    // next line works for 30deg but not 130deg (returns 50);
    // var angle = Math.round(Math.asin(sin) * (180/Math.PI));
    var angle = Math.round(Math.atan2(b, a) * (180/Math.PI));
    
    console.log('Rotate: ' + angle + 'deg');
    

    【讨论】:

      【解决方案3】:
      function getRotationDegrees(obj) {
        var matrix = obj.css("-webkit-transform") ||
        obj.css("-moz-transform")    ||
        obj.css("-ms-transform")     ||
        obj.css("-o-transform")      ||
        obj.css("transform");
        if(matrix !== 'none') {
          var values = matrix.split('(')[1].split(')')[0].split(',');
          var a = values[0];
          var b = values[1];
          var angle = Math.round(Math.atan2(b, a) * (180/Math.PI));
        } else { var angle = 0; }
        return (angle < 0) ? angle +=360 : angle;
      }
      
      angle1 = getRotationDegrees($('#1-link-2'));
      

      【讨论】:

      • 只支持 (1) 的代码 没有讨论流水线操作的代码(matrix.split('(')[1].split(')')[0].split(',' ) 不明显)。 (2) 将术语“矩阵”误用为“变换集合”,这很接近但仍会引起混淆。 (3) 在 javascript 中在性能很重要的函数中进行硬编码的非本地数学运算,因为它可能会在一定间隔内每秒被调用多次。 (4) 最初使用 jquery(要求输入作为 jquery 对象)而不是在需要时使用(如果你可以在没有 jquery 的情况下获得矩阵,你应该在使用 jquery 之前尝试)。
      • -1 此代码已复制自:stackoverflow.com/questions/8270612/… 这样做时,请放上作者的链接。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2013-02-17
      相关资源
      最近更新 更多