
모바일 웹에서 버튼 클릭이 미묘하게 느린 경험은 대부분 브라우저의 터치 제스처 해석 지연 때문이다.
touch-action: manipulation;은 이 문제를 CSS 레벨에서 해결하는 가장 효과적인 방법이라고 한다.
touch-action은 터치 입력에 대해 브라우저가 어떤 기본 동작을 허용할지 사전에 선언하는 CSS 속성이다.
브라우저는 터치 이벤트가 발생하면 다음을 판단한다.
- 스크롤인가?
- 더블탭 확대인가?
- 단순 클릭인가?
이 판단 과정 때문에 약 300ms 지연이 발생할 수 있다.
button {
touch-action: manipulation;
}
manipulation은 다음을 의미한다.
허용
- 탭(tap)
- 클릭(click)
- UI 조작(manipulation)
차단
- 더블탭 확대(double-tap zoom)
- 핀치 줌(pinch zoom)
즉,
이 요소는 조작용 UI이므로 확대/축소 제스처가 필요 없다
라고 브라우저에 명시하는 것이다.
- 브라우저 동작
- 터치 후 스크롤/줌 여부 판단
- 사용자 체감
- 클릭 반응이 느리다
- 성능 특성
- 300ms 지연 발생 가능
➡️ 가장 안전하지만 가장 느린 방식이다.
- 브라우저 동작
- 제스처 판단 과정 생략
- 클릭 이벤트 즉시 처리
- 사용자 체감
- 즉각적인 버튼 반응
- 성능 특성
- 지연 제거
- 모바일 UX 개선
➡️ 실무에서 가장 균형 잡힌 선택이다.
- 브라우저 동작
- 모든 기본 터치 동작 차단
- 사용자 체감
- 스크롤 불가
- 성능 특성
- 가장 빠르나 제어 책임이 큼
➡️ 캔버스, 드래그 UI 같은 특수 케이스용이다.
| 항목 | manipulation | none |
|---|---|---|
| 클릭 반응 속도 | 매우 빠름 | 매우 빠름 |
| 스크롤 가능 여부 | 가능 | 불가 |
| 사용 난이도 | 낮음 | 높음 |
| 실무 안정성 | 높음 | 낮음 |
➡️ 일반 웹 서비스에서는 manipulation이 성능 대비 효율이 가장 좋다.
모바일 브라우저는 과거 더블탭 확대를 지원하기 위해
터치 후 잠시 대기했다.touch-action: manipulation은
“확대 제스처를 사용하지 않는다”라고 명시
브라우저가 기다릴 필요 없어 이벤트 즉시 확정
➡️ JavaScript 최적화가 아니라 브라우저 렌더링 파이프라인 최적화이다.
button,
a,
input,
label {
touch-action: manipulation;
}
- 버튼
- 링크
- 폼 컨트롤
- 모바일 조작용 UI 컴포넌트
⚠️ body, layout div에 무분별하게 적용하는 것은 권장하지 않는다.
touch-action: manipulation;은 모바일 클릭 성능 최적화 CSS 속성이다.
더블탭 확대를 차단하여 300ms 지연을 제거한다.
case by case로 보면 auto보다 빠르고 none보다 안전하다.
모바일 웹 버튼 UX 개선에는 사실상 표준적인 선택이다.
모바일 웹에서 “버튼이 느리다” 라는 이슈가 있다면,
가장 먼저 적용해야 할 설정이다.