2013-05-17 2 views
2

Я пытаюсь получить значения Matrix из свойств преобразования CSS, но по какой-то причине он не работает.Значения матрицы jQuery из CSS

var object = $(this); 

var transMatrix = object.css("-webkit-transform") || 
        object.css("-moz-transform") || 
        object.css("-ms-transform") || 
        object.css("-o-transform") || 
        object.css("transform"); 

console.log("Matrix = " + transMatrix); 

var values = transMatrix.split('(')[1]; 
    values = transMatrix.split(')')[0]; 
    values = transMatrix.split(','); 

console.log("Values = " + values); 

var a = values[0]; 
console.log("a = " + a); 
var b = values[1]; 
console.log("b = " + b); 

var scale = Math.sqrt(a*a + b*b); 
console.log("Scale = " + scale);           

var sin = b/scale; 
console.log("Sin = " + sin); 

var transScale = Math.round(scale * 100)/100; 
console.log("Transform Scale = " + transScale); 

var transAngle = Math.round(Math.asin(sin) * (180/Math.PI)); 
console.log("Transform Angle = " + transAngle); 

Но когда я вывожу это, консоль показывает:

Matrix = matrix(0.496273075820661, 0.06093467170257374, -0.06093467170257374, 0.496273075820661, 0, 0) 
Values = matrix(0.496273075820661, 0.06093467170257374, -0.06093467170257374, 0.496273075820661, 0, 0) 
a = matrix(0.496273075820661 
b = 0.06093467170257374 
Scale = NaN 
Sin = NaN 
Transform Scale = NaN 
Transform Angle = NaN 

кажется, возвращается 'undefined' после того, как он получил Матричные значения из CSS (которые правильно работают)

Есть что-то не так с моим методом «split»?

+0

'console.log (" a = "+ sin)' должен быть 'console.log (" a = "+ a)' - на протяжении всего вашего кода вы регистрируете неправильные переменные. – Blazemonger

+0

@Blazemonger длинный день! Но просто изменил их и обновил вопрос –

ответ

3
var values = transMatrix.split('(')[1]; 
values = transMatrix.split(')')[0]; 
values = transMatrix.split(','); 

должен быть

var values = transMatrix.split('(')[1]; 
values = values.split(')')[0]; 
values = values.split(','); 

или просто цепь их:

var values = transMatrix.split('(')[1].split(')')[0].split(','); 

В самом деле, вы можете сделать это немного более чисто с использованием регулярных выражений и .match:

var values = transMatrix.match(/[\d\.]+/g); 
+0

Magic! На мой взгляд, эта цепочка лучшая. Реджикс просто путается с моей головой ... Ха-ха. Странная вещь об этом была, она работала ранее с кодом в моем вопросе, но потом сломалась ... –

+1

Ваше регулярное выражение не будет работать, когда transMatrix является 3D-преобразованием, потому что он также будет соответствовать 3 в matrix3d. Вы можете решить это с помощью этого регулярного выражения: transMatrix.match (/ [\ d \.] + (? = [, \)])/G) Это проверяет, следует ли за номером запятая или закрывающая скобка – Troido

Смежные вопросы