HTML, CSS

[CSS] transform: translate 활용 예제(1) :: 마이구미

mygumi 2022. 9. 17. 23:25
반응형
이 글은 CSS 속성 중 transform: translate 를 활용한 예제를 살펴본다.
translate 사용 사례의 하나를 설명한다.
속성의 설명보다는 이 속성을 활용하여 어떻게 적용할 수 있는지에 대한 아이디어라고 생각하면된다.
MDN - https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/translateX
활용 예제 - https://codesandbox.io/s/horizontal-scroll-list-wddzp4

 

사실 어떻게 보면 translate 를 활용한 예시는 크게 도움이 되지 않을 수 있다.

하지만 이 글을 남기게 된 이유는 UX 적으로도 남기고 싶은 내용이 있어서다.

끝까지 읽어보길 바란다.

 

CSS transform 속성은 2D, 3D 변형을 엘리먼트에 적용할 수 있게 도와준다.

많이 사용하는 transform 속성의 함수 중 하나로써, translate() 는 유용한 함수이다.

이 함수는 x, y 축을 기준으로 이동할 수 있는 기능이다.

 

x, y 축을 기준으로 이동하는 것은 position: absolute 와 함께 top, left 속성을 떠올릴 수도 있다.

같은 결과를 낼 수 있으나 목적은 다르다. (https://mygumi.tistory.com/238)

어쨌든 x, y 축을 기준으로 엘리먼트를 이동시킬 수 있다.

 

또 하나 떠올릴 수 있는 것은 스크롤바(ScrollBar) 를 생각할 수 있다.

스크롤바를 활용한 하나의 예제를 보자.

 

 

리스트 컨테이너 영역에 스크롤바를 이용하여 좌우로 이동할 수 있게 된다.

컨테이너의 스크롤바 좌표에 의해 보여지는 리스트 아이템의 위치가 정해진다.

 

<div class="container" style="overflow-x: scroll"}> // scrollLeft = 113
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
  <div class="item">4</div>
</div>

 

 

기본적으로 컨테이너의 scrollLeft 값은 0 일것이고, 오른쪽으로 이동할때마다 값은 증가한다.

컨테이너의 스크롤 좌표에 의해 리스트 아이템들의 노출이 결정되는 것을 확인할 수 있다.

 

스크롤바를 사용하지 않고, translate() 를 활용해서 같은 결과물을 만들어낼 수 있다.

컨테이너에서 사용한 좌표(scrollLeft) 를 translateX 를 이용한 좌표로 변경하면 된다. 

컨테이너의 scrollLeft 가 아닌, 컨테이너의 translateX 가 되는 것이다.

 

<div class="container" style="overflow-x: scroll"}> // scrollLeft = 113
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
  <div class="item">4</div>
</div>

<div class="container" style="transform: translateX(-113px);">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
  <div class="item">4</div>
</div>

 

 

translateX 와 scrollLeft 의 절대값은 같겠지만, translateX 는 마이너스를 통해 오른쪽에 배치한 아이템들을 노출할 수 있다.

 

 

결과적으로 두 방식 모두 원하는 결과물을 만들 수 있다.

하지만 두 방식은 서로 다른 차이점이 존재한다.

 

차이점을 알기 위해 직접 예제를 확인해보자.

예제는 터치 이벤트를 기준으로 작성되어서 모바일 모드에서 테스트하면 된다.

(두 방식의 차이점에 대해 더 명확한 이해를 위해 터치 이벤트(모바일)를 기준으로 구현되었다.)

 

 

 

translateX 는 드래그와 드랍 사이의 거리(터치 시작과 끝)를 기반으로 이동거리를 결정된다.

scrollLeft 는 위와 같다.

하지만 추가로 터치 강도 or 제스처에 의해서도 이동거리가 달라질 수 있다.

 

이것이 의미하는 것은 UX 적으로 엄청난 차이를 가지게 된다.

흔히 x 축으로 나열된 상품 리스트를 예를 들어보자.

우리는 스와이프와 같은 제스쳐로 상품들을 빠르게 넘기는 기능을 많이 사용한다.

스크롤바의 예제의 경우에는 스스륵 빠르게 여러개의 아이템이 넘어간다.

반대로 translateX 의 예제는 스와이프 제스처는 드래그와 드랍 사이의 거리가 짧기 때문에 빠르게 넘어갈 수 없다.

이것은 UX 와 밀접한 관계가 있기에, 간과해서는 안되는 사항으로 이어지게 된다.

목적과 의도에 맞게 구현 방식을 검토해야한다.

 

물론 translateX 를 활용하더라도 스크롤바와 같은 행위를 이끌어 낼 수 있다.

의도와 상황에 맡게 UX 적으로 고민하지 않았다면, 위 예제처럼 단순하게 구현하게 될 것이라는 의미라고 이해하면 된다.

 

활용 예제 코드 2

https://codesandbox.io/s/imageviewer-dggfpp?file=/src/App.tsx

반응형