【问题标题】:How to get value of translateX and translateY?如何获取 translateX 和 translateY 的值?
【发布时间】:2014-03-21 16:24:56
【问题描述】:

我想使用 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

【问题讨论】:

  • 你尝试过任何东西了吗?
  • @Pointy Console.log 结果如下translate(0px, -12358.8px) scale(1) translateZ(0px)
  • 当我通过 Firefox 或 Chrome 进行检查时(顺便说一下,这将需要 -webkit-transform 而不仅仅是 transform)我会得到一个 matrix() 函数。

标签: javascript css transform transition


【解决方案1】:

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

例如:

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 进行测试,所以我在你的 CSS 前面加上了 -webkit-)。


编辑:
要获得 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;
}

【讨论】:

  • 感谢您的努力 :) 实际上我正在寻找来自 translate(0px, -12358.8px)translateY 值的解决方案
  • 查看我编辑的答案,使用getComputedStyle
  • 如何获取 translateX 值?
  • @alireza-valizade 将 getComputedTranslateY 函数中的索引 5 更改为 4:return mat ? parseFloat(mat[1].split(', ')[4]) : 0;
  • @tugce 为什么?他需要第 5 个索引处的 tY developer.mozilla.org/en-US/docs/Web/CSS/transform-function/…
【解决方案2】:

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

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

并得到这样的值:

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

Here 是一个 jsFiddle 演示。

【讨论】:

    【解决方案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;
    
    }
    

    【讨论】:

    • 只需将您从 node.getElementById(element).transform 获得的字符串传递给函数
    【解决方案4】:

    如果你有多个 translate 属性,你可能需要计算 .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
    

    【讨论】:

      【解决方案5】:

      要获得不带“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);" />

      【讨论】:

        【解决方案6】:

        现在有一个 DOM API 可以为此提供类型化解决方案,称为 CSS 对象模型 see here

        该规范的一部分指定了一个attributeStyleMap,您可以使用它来获取转换值(或其他任何内容)的类型值。

        const node = document.querySelector('#something')
        
        const attrs = node.attributeStyleMap.get('transform')
        if (!attrs) return
        
        const translation = Array.from(attrs.values())
            .find(attr => attr instanceof CSSTranslate)
        
        console.log(translation.x); // { value: 115, unit: 'px' }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-11-26
          • 1970-01-01
          • 2015-06-21
          • 2017-07-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多