CSS&JS/👀Study and Copy

JS 자바스크립트로 CSS transform - translateX, translateY, translateZ 값 가져오기

arancia_ 2021. 6. 23. 11:08

https://zellwk.com/blog/css-translate-values-in-javascript/

HTML,CSS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8"/>
    <title>matrix와 정규식을 이용한 transform 값 가져오기</title>
<style>
    *{margin:0;padding:0;box-sizing:border-box;}
    html,body{width:100%;min-height:100vh;background:#000;}
    
    #myDiv{
        display:flex;flex-wrap:wrap;
        flex-direction:column;
        justify-content:center;align-items:center;
        position:fixed;
        top:50%;left:50%;
        width:300px;height:300px;
        background:#fff;
 
        transform:translateX(-150px) translateY(-300px) translateZ(-450px);
    }
</style> 
    
</head>
<body>
<!-- https://zellwk.com/blog/css-translate-values-in-javascript/ -->
 
    <div id="myDiv">
        <p>translateX : -150;</p>
        <p>translateY : -300;</p>
        <p>translateZ : -450; </p>        
    </div>
</body>
</html>
cs




JS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
const myDiv = document.getElementById('myDiv');
    
const myMatrix = window.getComputedStyle(myDiv).transform;
const type = myMatrix.includes('3d') ? '3d' : '2d';
 
console.log(myMatrix);
console.log(type);
 
const translate = myMatrix.match(/matrix.*\((.+)\)/)[1].split(', ');
console.log('translate : ',translate);
 
let x,y,z;
 
switch(type){
    case "2d" :
        x = translate[4];
        y = translate[5];
        break;
    case "3d" :
        x = translate[12];
        y = translate[13];
        z = translate[14];
        break;
}
 
console.log(`x : ${x}, y : ${y}, z : ${z}`);
cs

 

핵심

1) 1차로 불러오기
window.getComputedStyle(myDiv).transform

2) type 판별
const type = myMatrix.includes('3d') ? '3d' : '2d';

 

3)해당 값만 가져오기
const translate = myMatrix.match(/matrix.*\((.+)\)/)[1].split(', ');

 

우선 1차로 window.getCoputedStyle(element).transform; 하면 다음같은 결과를 가져옴 :
matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -150, -300, -450, 1)

어 그러면 그냥 갖다 써도 될 것 같은데... string으로 가져오려고 보면 

우선 전체적으로 선택을 해주고

이렇게 되기 때문에
myMatrix.match(/matrix.*\((.+)\)/) 가 아니라

myMatrix.match(/matrix.*\((.+)\)/)[1] 을 가져와야 하는것임 (숫자랑 쉼표만 온전히 들어있잖어)

getMatrix.html
0.00MB