Obtener el valor de-webkit-transform de un elemento con jquery


Estoy manipulando un div con la nueva forma genial de css3 de hacer una transformación como esta:

$("#thediv").css("-webkit-transform","translate(-770px, 0px)");

Más adelante en el script pensé en obtener el valor de la transformación de esta manera:

$("#thediv").css("-webkit-transform");

Devuelve una matriz como esta: de la matriz(1, 0, 0, 1, -770, 0)

Lo que no puedo averiguar es cómo obtener el 5to valor (-770) de esta matriz...

Alguna sugerencia? ¡Gracias!

Author: Matthias Loibl, 2011-05-11

6 answers

Su matriz es una matriz de transformación 4x4:

cosas de matrix

El -770 corresponde al v x. Para extraerlo, construye un objeto WebkitCSSMatrix:

var style = window.getComputedStyle($('#thediv').get(0));  // Need the DOM object
var matrix = new WebKitCSSMatrix(style.webkitTransform);

console.log(matrix.m41);  // -770
 43
Author: Blender,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-30 05:38:16

Puede dividir la cadena en una matriz y obtener el valor deseado como de costumbre. Aquí hay una pequeña función auxiliar que hace la parte dividida.

function matrixToArray(str) {
  return str.match(/\d+/g);
}

Actualización

Para preservar los decimales: rgba(0, 0, 0, 0.5)

Y negativos: matrix(1, 0, 0, 1, -770, 0)

function matrixToArray(str) {
  return str.split('(')[1].split(')')[0].split(',');
}

Update2

RegExp solución basada que conserva números decimales y negativos:

function matrixToArray(str) {
  return str.match(/(-?[0-9\.]+)/g);
}

matrixToArray('rgba(0, 0, 0, 0.5)'); // => ['0', '0', '0', '0.5']
matrixToArray('matrix(1, 0, 0, 1, -770, 0)'); // => ['1', '0', '0', '1', '-770', '0']
 27
Author: yckart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-14 00:37:04

Recomendaría usar el objeto WebkitCSSMatrix. http://developer.apple.com/library/safari/#documentation/AudioVideo/Reference/WebKitCSSMatrixClassReference/WebKitCSSMatrix/WebKitCSSMatrix.html#//apple_ref/doc/uid/TP40009363

Este objeto tiene como atributos los elementos matriciales. También proporciona funciones de conveniencia para varias transformaciones.

 2
Author: Maz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-11 17:41:01

La razón por la que obtiene el valor de la cadena de matriz, es que la función css de jQuery está obteniendo el estilo calculado (el resultado de window.getComputedStyle($("#thediv")[0]).webkitTransform).

Para obtener el valor real de la cadena al que la configuró en la llamada anterior ("translate(-770px, 0px)") puede usar:

var t = $("#thediv")[0].style.webkitTransform;

A partir de eso, podría usar métodos de cadena para obtener el valor x, por ejemplo:

t.substring(t.indexOf("(") + 1, t.indexOf(",") - 2)

Que da -770. Sin embargo, ten en cuenta que esto solo es aceptable si sabes que el valor existe y está en la forma en que estás usando (con solo un translate(xpx, ypx), ya que otros valores son válidos!

Si prefiere usar el estilo computado, entonces (para agregar a la sugerencia de @Maz), para obtener el valor 5 (la transformación x), puede hacer:

new WebKitCSSMatrix($("#thediv").css("-webkit-transform")).e;

Para obtener la sexta (la transformación y) se utiliza la propiedad f de la matriz.

 2
Author: Mark Rhodes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-05 12:29:29

Dado que constantemente necesito usar jQuery junto con TweenMax y ya que TweenMax ya se encargó de todo el análisis de varios tipos de cadenas de transformación, así como problemas de compatibilidad, escribí un pequeño plugin de jquery aquí (más bien un resumen de gsap) que podría acceder directamente a estos valores como este:

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

La lista de propiedades que podría obtener / establecer, junto con sus propiedades iniciales:

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

Pegar de mi otra respuesta, espero que esto ayude.

 2
Author: Luxiyalu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-16 01:22:39

He codificado la solución más simple que TAMBIÉN funciona en Safari, Chrome Y Firefox :)

El truco NO es hacer referencia a la

.css("transform")

Pero el

.css("translate")

Propiedad en su lugar:

var matrix = $("#thediv").css('translate');
console.log ( matrix[1] ); 
// matrix result is of form [x , y]
// so for example matrix[1] will give you the transformY value :)
$('html,body').animate({scrollTop: matrix[1]}, 750);

Estoy encantado de haber encontrado una solución tan económica ya que he estado tratando con transformaciones 3D en webkit y transformaciones 2D en Firefox simultáneamente, y utilizando este método se puede acceder directamente a los valores de propiedad:)

 -1
Author: AABSTRKT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-26 04:00:53