πŸ—ΊοΈ λͺ¨λ°”μΌμ—μ„œ ν™”λ©΄ ν™•λŒ€/μΆ•μ†Œ, 슀크둀 κΈˆμ§€μ‹œν‚€κΈ° (지도 ν™”λ©΄ κ³ μ •ν•˜κΈ°)

μ •ν˜œμΈΒ·2024λ…„ 11μ›” 30일
0

λͺ¨λ°”μΌμ—μ„œ 지도 기반 μ„œλΉ„μŠ€λ₯Ό κ΅¬ν˜„ν•˜λ©΄μ„œ μ‚¬μš©μžκ°€ 지도λ₯Ό 자유둭게 ν™•λŒ€, μΆ•μ†Œ, 이동할 수 μžˆλ„λ‘ ν•˜λŠ” 것은 κ°€μž₯ μ€‘μš”ν•œ κΈ°λŠ₯μž…λ‹ˆλ‹€.

ν•˜μ§€λ§Œ λͺ¨λ°”일 ν™˜κ²½μ—μ„œλŠ” 지도λ₯Ό λ‹€λ£¨λŠ” 도쀑에 ν™”λ©΄ μžμ²΄κ°€ ν™•λŒ€/μΆ•μ†Œλ˜κ±°λ‚˜, μœ„μ•„λž˜λ‘œ μŠ€ν¬λ‘€ν•˜λ©΄μ„œ λΈŒλΌμš°μ €κ°€ μƒˆλ‘œκ³ μΉ¨λ˜λŠ” λ“±μ˜ λ¬Έμ œκ°€ λ°œμƒν•œλ‹€λŠ” 것을 ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ 이 ν¬μŠ€νŒ…μ—μ„œλŠ” μ œκ°€ κ²ͺμ—ˆλ˜ 문제 상황과 이λ₯Ό μ–΄λ–»κ²Œ ν•΄κ²°ν–ˆλŠ”μ§€λ₯Ό μž‘μ„±ν•΄λ³΄λ €κ³  ν•©λ‹ˆλ‹€!


🌟 문제 상황

1. 지도λ₯Ό λ‹€λ£° λ•Œ ν™”λ©΄ 전체 ν™•λŒ€/μΆ•μ†Œκ°€ λ°œμƒ

  • μ‚¬μš©μžκ°€ 지도λ₯Ό ν™•λŒ€/μΆ•μ†Œν•˜λ €κ³  두 μ†κ°€λ½μœΌλ‘œ ν„°μΉ˜λ₯Ό μ‚¬μš©ν–ˆμ„ λ•Œ, λΈŒλΌμš°μ € ν™”λ©΄ 전체가 ν™•λŒ€/μΆ•μ†Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  • 지도λ₯Ό μ‘°μž‘ν•˜λŠ” 것이 λͺ©μ μ΄μ—ˆμ§€λ§Œ, UX적으둜 λ„ˆλ¬΄ 쒋지 μ•Šλ‹€κ³  νŒλ‹¨ν–ˆμŠ΅λ‹ˆλ‹€.

2. 지도λ₯Ό μ΄λ™ν•˜λ €κ³  ν•  λ•Œ ν™”λ©΄ 슀크둀이 λ°œμƒ

  • μ‚¬μš©μžκ°€ 지도λ₯Ό λ“œλž˜κ·Έν•˜λ €κ³  μœ„μ•„λž˜λ‘œ ν„°μΉ˜ν•˜κ³  μŠ€ν¬λ‘€ν•˜λ©΄ λΈŒλΌμš°μ €κ°€ μƒˆλ‘œκ³ μΉ¨λ˜κ±°λ‚˜, ν™”λ©΄ μžμ²΄κ°€ μŠ€ν¬λ‘€λ˜μ–΄ μ§€λ„μ˜ 이동이 μ›ν™œν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.
  • 특히 iOSμ—μ„œλŠ” μ•„λž˜λ‘œ 슀크둀 μ‹œ λ°”μš΄μŠ€ νš¨κ³Όμ™€ ν•¨κ»˜ ν™”λ©΄ 전체가 μ›€μ§μ΄λŠ” λ¬Έμ œκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.


πŸ”¨ ν•΄κ²° κ³Όμ •

1️⃣ μ‚¬μš©μžμ˜ ν™”λ©΄ ν™•λŒ€/μΆ•μ†Œ 방지

첫 번째 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 뷰포트 섀정을 λ³€κ²½ν–ˆμŠ΅λ‹ˆλ‹€. λͺ¨λ°”일 ν™”λ©΄μ—μ„œ λΈŒλΌμš°μ €κ°€ ν™•λŒ€/μΆ•μ†Œ λ™μž‘μ„ ν•˜μ§€ λͺ»ν•˜λ„둝 HTML 메타 νƒœκ·Έμ— user-scalable=no μ˜΅μ…˜μ„ μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.

<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no" />

이 μ½”λ“œλ₯Ό μΆ”κ°€ν•˜λ©΄ μ‚¬μš©μžκ°€ λΈŒλΌμš°μ € 화면을 ν•€μΉ˜ 쀌으둜 ν™•λŒ€/μΆ•μ†Œν•˜λŠ” 것을 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ, CSSλ₯Ό ν™œμš©ν•΄ νŠΉμ • 제슀처의 λ™μž‘μ„ μ œν•œν–ˆμŠ΅λ‹ˆλ‹€. μ§€λ„μ˜ 자유둜운 이동을 μ§€μ›ν•˜κΈ° μœ„ν•΄ #root μš”μ†Œμ— ν„°μΉ˜ μ•‘μ…˜μ„ μ œμ–΄ν•˜λŠ” 속성을 μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.

#root {
  touch-action: pan-y;
}
  • touch-action: pan-y: 수직 λ°©ν–₯의 λ“œλž˜κ·Έ λ™μž‘λ§Œ ν—ˆμš©ν•˜κ³ , ν™•λŒ€/μΆ•μ†ŒλŠ” λΉ„ν™œμ„±ν™”ν•©λ‹ˆλ‹€.

이 섀정을 톡해 μ§€λ„μ˜ 제슀처 λ™μž‘μ€ ν™œμ„±ν™”λ˜λ©΄μ„œλ„ λΈŒλΌμš°μ € ν™”λ©΄μ˜ ν™•λŒ€/μΆ•μ†ŒλŠ” λΉ„ν™œμ„±ν™”λ˜μ—ˆμŠ΅λ‹ˆλ‹€.


2️⃣ 슀크둀 이동 방지 및 μƒˆλ‘œκ³ μΉ¨ 방지

λ‹€μŒμœΌλ‘œλŠ” μ‚¬μš©μžκ°€ 지도λ₯Ό λ“œλž˜κ·Έν•˜κ±°λ‚˜ 이동할 λ•Œ λΈŒλΌμš°μ €κ°€ μŠ€ν¬λ‘€λ˜μ–΄ μƒˆλ‘œκ³ μΉ¨λ˜λŠ” 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€. 이 λ¬Έμ œλŠ” λΈŒλΌμš°μ €μ˜ μ˜€λ²„μŠ€ν¬λ‘€ λ™μž‘κ³Ό 관련이 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ CSSμ—μ„œ λͺ¨λ“  μš”μ†Œμ— λŒ€ν•΄ overscroll-behavior 속성을 μ„€μ •ν–ˆμŠ΅λ‹ˆλ‹€.

* {
  overscroll-behavior: none;
  overscroll-behavior-y: none;
}
  • overscroll-behavior: none: μ‚¬μš©μžμ˜ 슀크둀 λ™μž‘μ΄ λ¬Έμ„œμ˜ λ°”μš΄λ”λ¦¬λ₯Ό λ„˜μ–΄μ„œμ§€ μ•Šλ„λ‘ μ œν•œν•©λ‹ˆλ‹€.
  • overscroll-behavior-y: none: μ„Έλ‘œ λ°©ν–₯ 슀크둀 μ‹œ λΈŒλΌμš°μ €κ°€ μžλ™μœΌλ‘œ μŠ€ν¬λ‘€μ΄λ‚˜ μƒˆλ‘œκ³ μΉ¨μ„ νŠΈλ¦¬κ±°ν•˜μ§€ μ•Šλ„λ‘ ν•©λ‹ˆλ‹€.

이 속성을 톡해 μ§€λ„μ˜ 슀크둀 μ΄λ²€νŠΈκ°€ λΈŒλΌμš°μ €λ‘œ μ „νŒŒλ˜μ§€ μ•Šλ„λ‘ 막을 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 결과적으둜 μ‚¬μš©μžκ°€ 지도λ₯Ό μœ„μ•„λž˜λ‘œ μ΄λ™ν•˜λ”λΌλ„ μƒˆλ‘œκ³ μΉ¨μ΄ λ°œμƒν•˜μ§€ μ•Šκ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.


3️⃣ ν™”λ©΄ 크기 κ³ μ •

λ§ˆμ§€λ§‰μœΌλ‘œ 지도 화면을 전체 ν™”λ©΄μœΌλ‘œ κ³ μ •ν•˜κΈ° μœ„ν•΄ λΆ€λͺ¨ μ»¨ν…Œμ΄λ„ˆμ™€ HTML, Body μš”μ†Œμ— 100% 높이와 λ„ˆλΉ„λ₯Ό μ„€μ •ν–ˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 μ‚¬μš©μžκ°€ λΈŒλΌμš°μ € μ°½ 크기λ₯Ό μ‘°μ ˆν•˜λ”λΌλ„ 지도 화면이 항상 μ˜¬λ°”λ₯΄κ²Œ ν‘œμ‹œλ˜λ„λ‘ ν–ˆμŠ΅λ‹ˆλ‹€.

html, body, #root {
  width: 100%;
  height: 100%;
  margin: 0;
  overflow: hidden;
}

이 섀정은 지도가 ν™”λ©΄ 전체λ₯Ό μ°¨μ§€ν•˜κ²Œ ν•˜λ©΄μ„œ ν™”λ©΄ 이동을 λ§‰λŠ” 데도 큰 도움이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.


βœ… μ΅œμ’… κ²°κ³Ό

이 λͺ¨λ“  섀정을 μ μš©ν•œ ν›„, λͺ¨λ°”일 ν™˜κ²½μ—μ„œ λ‹€μŒκ³Ό 같은 κ°œμ„ μ μ„ 확인할 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

  1. μ§€λ„μ˜ ν™•λŒ€/μΆ•μ†Œ λ™μž‘μ΄ λΈŒλΌμš°μ € 화면에 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμŒ
  2. 지도λ₯Ό 이동할 λ•Œ λΈŒλΌμš°μ €κ°€ μŠ€ν¬λ‘€λ˜κ±°λ‚˜ μƒˆλ‘œκ³ μΉ¨λ˜μ§€ μ•ŠμŒ
  3. 지도 화면이 항상 전체 ν™”λ©΄μœΌλ‘œ κ³ μ •λ˜μ–΄ μ•ˆμ •μ μΈ μ‚¬μš©μž κ²½ν—˜ 제곡

✍️ 마무리

이번 μž‘μ—…μ„ 톡해 λͺ¨λ°”일 ν™˜κ²½μ—μ„œμ˜ μ‚¬μš©μž κ²½ν—˜μ„ κ°œμ„ ν•˜λ©΄μ„œ λΈŒλΌμš°μ €μ˜ κΈ°λ³Έ λ™μž‘μ„ μ œμ–΄ν•˜λŠ” 방법을 배울 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 특히 CSS 속성(overscroll-behavior, touch-action)κ³Ό 메타 νƒœκ·Έ(user-scalable)λ₯Ό ν™œμš©ν•˜λŠ” 것이 ν•΅μ‹¬μ΄μ—ˆμŠ΅λ‹ˆλ‹€.


πŸ—‚οΈ μ°Έκ³  μ½”λ“œ 정리

HTML

<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no" />

CSS

html, body, #root {
  width: 100%;
  height: 100%;
  margin: 0;
  overflow: hidden;
}

#root {
  touch-action: pan-y;
}

* {
  overscroll-behavior: none;
  overscroll-behavior-y: none;
}

결둠적으둜 μˆ˜μ •ν•œ κ²°κ³Ό, μ•„λž˜μ²˜λŸΌ 더이상 화면이 κ³ μ •λœ μƒνƒœμ—μ„œ 지도λ₯Ό 컨트둀 ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.
(λ§Œμ•½ 이미지가 λ©ˆμΆ°μžˆλ‹€λ©΄, μ΄λ―Έμ§€μ—μ„œ 였λ₯Έμͺ½ 마우슀 클릭 ν›„ μƒˆ νƒ­μ—μ„œ 이미지 μ—΄κΈ°λ‘œ λ“€μ–΄κ°€μ£Όμ„Έμš”... λ²¨λ‘œκ·Έκ°€ gifλ₯Ό μ§€μ›ν•˜μ§€ μ•ŠλŠ”κ°€λ΄μš”....)

0개의 λŒ“κΈ€