Get translate3d values of a div?

前端 未结 6 710
难免孤独
难免孤独 2020-11-30 12:30

Say a div has this applied to it:

-webkit-transform: translate3d(0px, -200px, 0px)

How could I retrieve those values with jQuery?

相关标签:
6条回答
  • 2020-11-30 13:00

    The value gets stored either as a matrix or a matrix3d, depending on whether or not the z value was set. Assuming no other transformations, for a 2D matrix, X and Y are the last two values. For a 3D matrix, X, Y, Z, 1 are the last four digits.

    You could use a regular expression to get the values:

    function getTransform(el) {
        var results = $(el).css('-webkit-transform').match(/matrix(?:(3d)\(\d+(?:, \d+)*(?:, (\d+))(?:, (\d+))(?:, (\d+)), \d+\)|\(\d+(?:, \d+)*(?:, (\d+))(?:, (\d+))\))/)
    
        if(!results) return [0, 0, 0];
        if(results[1] == '3d') return results.slice(2,5);
    
        results.push(0);
        return results.slice(5, 8);
    }
    
    0 讨论(0)
  • 2020-11-30 13:17

    If you update the regular expression to the following it adds supports for those odd cases when your transform has floats:

    /matrix(?:(3d)\(-{0,1}\d+\.?\d*(?:, -{0,1}\d+\.?\d*)*(?:, (-{0,1}\d+\.?\d*))(?:, (-{0,1}\d+\.?\d*))(?:, (-{0,1}\d+\.?\d*)), -{0,1}\d+\.?\d*\)|\(-{0,1}\d+\.?\d*(?:, -{0,1}\d+\.?\d*)*(?:, (-{0,1}\d+\.?\d*))(?:, (-{0,1}\d+\.?\d*))\))/
    
    0 讨论(0)
  • 2020-11-30 13:20

    I can't add comment to @parliament answer so I'll write here.

    Be careful with map(parseInt) because ['1', '7', '11'].map(parseInt) returns [1, NaN, 3] source.

    Better to use .map(numStr => parseInt(numStr))

    function getMatrix(element) {
        const values = element.style.transform.split(/\w+\(|\);?/);
        const transform = values[1].split(/,\s?/g).map(numStr => parseInt(numStr));
    
        return {
          x: transform[0],
          y: transform[1],
          z: transform[2]
        };
    }
    
    0 讨论(0)
  • 2020-11-30 13:23

    If you change the accepted answer's match() pattern to this it adds support for negative numbers:

    $(el).css('-webkit-transform').match(/matrix(?:(3d)\(-{0,1}\d+(?:, -{0,1}\d+)*(?:, (-{0,1}\d+))(?:, (-{0,1}\d+))(?:, (-{0,1}\d+)), -{0,1}\d+\)|\(-{0,1}\d+(?:, -{0,1}\d+)*(?:, (-{0,1}\d+))(?:, (-{0,1}\d+))\))/)
    
    0 讨论(0)
  • 2020-11-30 13:23

    EDIT: This is wrong, ignore this.

    I think if you do something like...

    var styles = $('.myclass').css('-webkit-transform');
    

    You would probably get the translate3d(0px, -200px, 0px) back.

    Maybe you could then parse that string? seems like a bit of a hack though.

    0 讨论(0)
  • 2020-11-30 13:24

    I don't know about the various edge cases, but in my case it's always 3 values like 'translate3d(23px, 34px, 40px)', so this was the cleanest way I could find:

    function getMatrix(element) {
        const values = element.style.transform.split(/\w+\(|\);?/);
        const transform = values[1].split(/,\s?/g).map(parseInt);
    
        return {
          x: transform[0],
          y: transform[1],
          z: transform[2]
        };
    }
    

    Result:

    {x: 238, y: 0, z: 0}
    
    0 讨论(0)
提交回复
热议问题