Obtenir element-moz-transform:valeur de rotation en jQuery

j'ai de style CSS pour une couche:

.element {
    -webkit-transform: rotate(7.5deg);    
     -moz-transform: rotate(7.5deg);    
      -ms-transform: rotate(7.5deg);    
       -o-transform: rotate(7.5deg);   
          transform: rotate(7.5deg);
}

y a-t-il un moyen d'obtenir la valeur de rotation courante par jQuery?

j'ai essayé

$('.element').css("-moz-transform")

Le résultat est matrix(0.991445, 0.130526, -0.130526, 0.991445, 0px, 0px) qui ne m'en dit pas beaucoup. Ce que je cherche à obtenir est 7.5.

44
demandé sur Rory McCrossan 2011-11-25 18:37:47

11 réponses

voici ma solution en utilisant jQuery.

renvoie une valeur numérique correspondant à la rotation appliquée à tout élément HTML.

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($('#myDiv'));
angle2 = getRotationDegrees($('.mySpan a:last-child'));

etc...

86
répondu TwystO 2015-02-07 04:53:16

j'ai trouvé un bug/features dans le code de la Twist: la fonction return négative angles.

J'ai donc ajouté une ligne de code simple avant de retourner le angle:

if(angle < 0) angle +=360;

que les résultats seront:

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; }

    if(angle < 0) angle +=360;
    return angle;
}
9
répondu andreacanton 2013-05-08 08:18:06
si(matrix != = 'none') n'a pas fonctionné pour moi. J'ai donc ajouté la vérification de type:

(function ($) {
    $.fn.rotationDegrees = function () {
         var matrix = this.css("-webkit-transform") ||
    this.css("-moz-transform")    ||
    this.css("-ms-transform")     ||
    this.css("-o-transform")      ||
    this.css("transform");
    if(typeof matrix === 'string' && 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;
   };
}(jQuery));

comme suit:

var rotation = $('img').rotationDegrees();
5
répondu Ivo Renkema 2013-03-14 10:36:09

la propriété CSS tranform retournera toujours une valeur matricielle, comme rotate, skew, scale etc. est tout simplement raccourci pour faire les choses plus facile, et ne pas avoir à calculer la valeur de matrice à chaque fois, mais la matrice est calculée par le navigateur et appliquée comme une matrice, et lorsque cela est fait, il ne peut plus retourner le degré de rotation par angle sans recalculer la matrice à nouveau.

pour faciliter ces calculs, il existe une bibliothèque javascript appelée Sylvester qui a été créé dans le but de faciliter le calcul matriciel, essayez de regarder cela pour obtenir le degré de rotation à partir de la valeur matricielle.

En outre, si vous où écrire une fonction de rotation dans javascript pour traduire des degrés de rotation à une matrice, il serait probablement quelque chose comme ceci (cela utilise sylvester pour le dernier calcul):

var Transform = {
    rotate: function(deg) {
        var rad = parseFloat(deg) * (Math.PI/180),
            cos_theta = Math.cos(rad),
            sin_theta = Math.sin(rad);

        var a = cos_theta,
            b = sin_theta,
            c = -sin_theta,
            d = cos_theta;

        return $M([
          [a, c, 0],
          [b, d, 0],
          [0, 0, 1]
        ]);
    }
};

maintenant, tout ce que vous avez vraiment à faire est d'inverser cette fonction et vous êtes d'or :-)

4
répondu adeneo 2013-06-30 12:49:57

Ma Solution (à l'aide de jQuery):

$.fn.rotationInfo = function() {
    var el = $(this),
        tr = el.css("-webkit-transform") || el.css("-moz-transform") || el.css("-ms-transform") || el.css("-o-transform") || '',
        info = {rad: 0, deg: 0};
    if (tr = tr.match('matrix\((.*)\)')) {
        tr = tr[1].split(',');
        if(typeof tr[0] != 'undefined' && typeof tr[1] != 'undefined') {
            info.rad = Math.atan2(tr[1], tr[0]);
            info.deg = parseFloat((info.rad * 180 / Math.PI).toFixed(1));
        }
    }
    return info;
};

Utilisation:

$(element).rotationInfo(); // {deg: 7.5, rad: 0.13089969389957515}
$(element).rotationInfo().deg; // 7.5
4
répondu Pigalev Pavel 2015-01-21 15:47:06
2
répondu Goldie 2011-11-26 13:05:13

Si vous faites cela, comme vous l'avez décrit, tout c'est le seul endroit où vous avez réellement modifier transformation de l'objet, puis depuis votre navigateur ne peut pas être tous les 4 types de navigateurs dans le même temps, certains des préfixé valeurs attribuées sont toujours exactement comme vous l'avez attribuée. Par exemple, si vous utilisez webkit, alors this.css('-o-transform') retournera toujours 'rotate(7.5deg)', il s'agit donc simplement de la comparer à /rotate\((.*)deg\)/.

cela a bien fonctionné pour moi : j'attribue toujours 5 styles css, et lire tous les cinq styles, en espérant qu'au moins l'un d'entre eux sera intact. Je ne suis pas sûr que cela fonctionne si les styles sont définis dans CSS (pas dans JS) cependant.

0
répondu qbolec 2013-04-03 09:17:29

vous pouvez Également remplacer var angle = Math.round(Math.atan2(b, a) * (180/Math.PI));var angle = Math.round(Math.acos(a) * (180/Math.PI));

0
répondu Vadim Kalinin 2014-06-30 15:23:21
ici (plus d'un enveloppement de la gsap) qui pourraient directement accéder à ces valeurs comme ceci:

$('#ele').transform('rotationX') // returns 0
$('#ele').transform('x')         // returns value of translate-x

la liste des propriétés que vous pouvez obtenir/ définir, ainsi que leurs propriétés initiales:

perspective: 0
rotation: 0
rotationX: 0
rotationY: 0
scaleX: 1
scaleY: 1
scaleZ: 1
skewX: 0
skewY: 0
x: 0
y: 0
z: 0
zOrigin: 0

Coller de ma réponse, espérons cela aide.

0
répondu Luxiyalu 2014-10-16 01:23:45

j'ai fait un violon avec ce code de travail pour obtenir rotateX Y Z sur une 3D , ou rotateZ pour une 2D transform. Merci à mihn pour le code de base que j'ai peu mis à jour avec le jquery 2.2.3 actuel. J'utilise actuellement cette solution pour mes propres projets.

https://jsfiddle.net/bragon95/49a4h6e9/

    //
//Thanks: Adapted on base code from mihn http://stackoverflow.com/a/20371725
//

function getcsstransform(obj)
{
    var isIE = /(MSIE|Trident\/|Edge\/)/i.test(navigator.userAgent);

  var TType="undefined",
        rotateX = 0,
        rotateY = 0,
      rotateZ = 0;

  var matrix = obj.css("-webkit-transform") ||
    obj.css("-moz-transform") ||
    obj.css("-ms-transform") ||
    obj.css("-o-transform") ||
    obj.css("transform");
  if (matrix!==undefined && matrix !== 'none')
  {
        // if matrix is 2d matrix
    TType="2D";
    if (matrix.indexOf('matrix(') >= 0)
    {
      var values = matrix.split('(')[1].split(')')[0];
      if (isIE)  //case IE
      {
        angle = parseFloat(values.replace('deg', STR_EMPTY));
      }else
      {
        values = values.split(',');
        var a = values[0];
        var b = values[1];
        var rotateZ = Math.round(Math.atan2(b, a) * (180 / Math.PI));
      }
    }else
    {
      // matrix is matrix3d
      TType="3D";
      var values = matrix.split('(')[1].split(')')[0].split(',');
      var sinB = parseFloat(values[8]);
      var b = Math.round(Math.asin(sinB) * 180 / Math.PI);
      var cosB = Math.cos(b * Math.PI / 180);
      var matrixVal10 = parseFloat(values[9]);
      var a = Math.round(Math.asin(-matrixVal10 / cosB) * 180 / Math.PI);
      var matrixVal1 = parseFloat(values[0]);
      var c = Math.round(Math.acos(matrixVal1 / cosB) * 180 / Math.PI);
      rotateX = a;
      rotateY = b;
      rotateZ = c;
    }
  }

    return  { TType: TType, rotateX: rotateX,  rotateY: rotateY,  rotateZ: rotateZ };
};

mAngle = getcsstransform($("#Objet3D"));
if (mAngle.TType=="2D")
{
    $("#Result").html("Transform 2D [rotateZ=" + mAngle.rotateZ + "&deg;]");
}else
{
    $("#Result").html("Transform 3D [rotateX=" + mAngle.rotateX + "&deg;|rotateY=" + mAngle.rotateY + "&deg;|rotateZ=" + mAngle.rotateZ + "&deg;]");
}
0
répondu Bragon95 2016-06-09 11:57:22

Si vous êtes prêt à utiliser en ligne de style pour cette transformation, alors vous pouvez utiliser jQuery pour obtenir le contenu de la balise:

parseInt($(  /*TODO*/  ).attr('style').split('rotate(')[1].split('deg)')[0]);
0
répondu CGeoC 2018-01-24 11:38:45