[javascript] 자바스크립트에서 터치 이벤트를 사용하여 확대/축소(핀치 줌) 동작을 구현하는 방법은?

웹 앱이나 모바일 앱에서 이미지나 지도와 같은 요소를 확대/축소(핀치 줌)하려면 터치 이벤트 처리가 필요합니다.

자바스크립트를 사용하여 이 동작을 구현하는 방법을 알아보겠습니다.

1. 터치 이벤트 감지

먼저, touchstart, touchmove, touchend 이벤트를 사용하여 터치 입력을 감지합니다. 각 이벤트는 사용자가 화면에 터치를 시작하거나 이동할 때 발생합니다.

const element = document.getElementById('target'); // 확대/축소할 요소

let initialDistance = 0; // 초기 두 손가락 간 거리

element.addEventListener('touchstart', function(event) {
  if (event.touches.length === 2) {
    initialDistance = Math.hypot(
      event.touches[0].clientX - event.touches[1].clientX,
      event.touches[0].clientY - event.touches[1].clientY
    );
  }
});

element.addEventListener('touchmove', function(event) {
  if (event.touches.length === 2) {
    const currentDistance = Math.hypot(
      event.touches[0].clientX - event.touches[1].clientX,
      event.touches[0].clientY - event.touches[1].clientY
    );

    const delta = currentDistance - initialDistance;
    // 확대/축소 동작 수행
  }
});

2. 확대/축소 동작 구현

touchmove 이벤트에서 현재 두 터치 포인트 간의 거리 변화를 계산하여 확대/축소 동작을 처리합니다. 예를 들어, 해당 거리 변화에 따라 이미지나 요소의 크기를 조정하여 확대 또는 축소합니다.

const MIN_SCALE = 0.5;
const MAX_SCALE = 3.0;
let currentScale = 1.0; // 현재 확대/축소 비율

element.addEventListener('touchmove', function(event) {
  if (event.touches.length === 2) {
    const currentDistance = Math.hypot(
      event.touches[0].clientX - event.touches[1].clientX,
      event.touches[0].clientY - event.touches[1].clientY
    );
    const delta = currentDistance - initialDistance;

    let newScale = currentScale + delta * 0.01; // 확대/축소 비율 적용

    // 확대/축소한 비율이 최소 및 최대 비율을 벗어나지 않도록 제한
    newScale = Math.min(Math.max(newScale, MIN_SCALE), MAX_SCALE);

    // 확대/축소 적용
    element.style.transform = `scale(${newScale})`;
  }
});

3. 터치 이벤트 종료 처리

마지막으로, touchend 이벤트를 사용하여 터치 입력이 종료될 때 초기 거리와 확대/축소 비율을 재설정합니다.

element.addEventListener('touchend', function(event) {
  if (event.touches.length === 0) {
    initialDistance = 0; // 초기 거리 초기화
    currentScale = parseFloat(element.style.transform.match(/scale\(([^)]+)\)/)[1]) || 1.0; // 현재 확대/축소 비율 업데이트
  }
});

위의 예제 코드는 터치 이벤트를 사용하여 자바스크립트로 확대/축소(핀치 줌) 동작을 구현하는 방법을 보여줍니다.

필요에 따라 브라우저 호환성과 추가적인 제스처 처리를 고려하여 코드를 확장할 수 있습니다. 이를 통해 사용자 친화적이고 반응형인 확대/축소 동작을 구현할 수 있습니다.

자세한 내용은 MDN Web Docs를 참고하시기 바랍니다.