如何获得translateX和translateY的价值?

时间:2014-02-20 15:44:53

标签: javascript css3 transform transition

我希望通过JavaScript从内嵌css中获取translateY值。

这是内嵌值:

style ="transition-property: transform; transform-origin: 0px 0px 0px; transform: translate(0px, -13361.5px) scale(1) translateZ(0px);"

这些代码向我提供变量的总列表:

var tabletParent = document.getElementById("scroller");
var toTop = tabletParent.style.transform;
console.log(toTop);

console.log

translate(0px, -12358.8px) scale(1) translateZ(0px)

期待toTop -12358.8px

5 个答案:

答案 0 :(得分:20)

有多种方法。我想到的第一个就是解析你得到的字符串。

例如:

function getTranslateZ(obj)
{
    var style = obj.style,
        transform = style.transform || style.webkitTransform || style.mozTransform,
        zT = transform.match(/translateZ\(([0-9]+(px|em|%|ex|ch|rem|vh|vw|vmin|vmax|mm|cm|in|pt|pc))\)/);
    return zT ? zT[1] : '0';
    //Return the value AS STRING (with the unit)
}
// getTranslateZ(tabletParent) => '0px'

然而,这仅适用于明确定义的translateZ(不是translate3d或matrix3d)。最一致的方法可能是getComputedStyle,但这总是以px为单位得到值,因此在计算它时才真正有效(窗口大小调整可以改变它):

function getComputedTranslateZ(obj)
{
    if(!window.getComputedStyle) return;
    var style = getComputedStyle(obj),
        transform = style.transform || style.webkitTransform || style.mozTransform;
    var mat = transform.match(/^matrix3d\((.+)\)$/);
    return mat ? ~~(mat[1].split(', ')[14]) : 0;
    // ~~ casts the value into a number
}
// getComputedTranslateZ(tabletParent) => 0

请参阅显示这两种方法的this fiddle(请注意,我一直在使用chrome进行测试,因此我使用-webkit-为CSS添加了前缀。)


修改
要获得translateY,如果访问者浏览器的最新版本足以支持getComputedStyle,则可以更改我的getComputedTranslateZ函数以处理矩阵和matrix3d值。它比尝试解析每个可能的css字符串(translateY,translate,translate3d,matrix,matrix3d)更简单:

function getComputedTranslateY(obj)
{
    if(!window.getComputedStyle) return;
    var style = getComputedStyle(obj),
        transform = style.transform || style.webkitTransform || style.mozTransform;
    var mat = transform.match(/^matrix3d\((.+)\)$/);
    if(mat) return parseFloat(mat[1].split(', ')[13]);
    mat = transform.match(/^matrix\((.+)\)$/);
    return mat ? parseFloat(mat[1].split(', ')[5]) : 0;
}

答案 1 :(得分:5)

如果你想要没有'px'的原始值,你可以使用这样的正则表达式:

var transZRegex = /\.*translateZ\((.*)px\)/i;

并获得如下值:

var zTrans = transZRegex.exec(test)[1];

Here是一个jsFiddle演示。

答案 2 :(得分:3)

function getTranslateXValue(translateString){

  var n = translateString.indexOf("(");
  var n1 = translateString.indexOf(",");

  var res = parseInt(translateString.slice(n+1,n1-2));

return res;

}
function getTranslateYValue(translateString){

 var n = translateString.indexOf(",");
  var n1 = translateString.indexOf(")");

  var res = parseInt(translateString.slice(n+1,n1-1));
return res;

}

答案 3 :(得分:0)

如果您具有多个转换属性,则可能需要计算.slice(x,y)的x和y

  const trsString = element.style.transform; //eg "translateY(36px)"
  let num = trsString.slice(11, trsString.length - 3) 
  num = num.length == 0 ? 0 : parseInt(num) // will be 36

答案 4 :(得分:0)

要获取不带“ px”的原始值,您可以使用以下代码:

function extractTranslateFromTransform(transform) {
    let translateValue = null;
    let translate = transform.match(/translate\(.*\)/)?.[0];
    if (translate) {
        translateValue = {};
        if (translate.indexOf(',') !== -1) {
            translateValue.x = parseFloat(translate.substring(translate.indexOf('(') + 1, translate.indexOf(',')));
            translateValue.y = parseFloat(translate.substring(translate.indexOf(',') + 1));
        } else {
            translateValue.x = translateValue.y = parseFloat(translate.substring(translate.indexOf('(') + 1));
        }
    }
    return translateValue;
}

const translate = extractTranslateFromTransform(document.getElementById('divWithTransform').style.transform);

console.log(translate);
<div id="divWithTransform" style="transform: translate(0px, -13361.5px) scale(1) translateZ(0px);" />