|
| 1 | +--- |
| 2 | +title: 엥? Modal 그거 z-index:99999 박으면 되는거 아님? (feat. createPortal과 Stacking Context) |
| 3 | +createdAt: 2025-06-27 |
| 4 | +category: React |
| 5 | +description: React 에서 Modal 컴포넌트를 구현할때 단순히 z-index 를 높게 줬을때 발생하는 문제와 createPortal 을 이용해 해결하는 방법에 대해 알아봅니다. |
| 6 | +comment: true |
| 7 | +--- |
| 8 | + |
| 9 | +# 엥? Modal 그거 z-index:99999 박으면 되는거 아님? (feat. createPortal과 Stacking Context) |
| 10 | + |
| 11 | +:::warning |
| 12 | +아직 작성중이거나 검토중인 글입니다. 내용이 부정확하거나 변경될 수 있습니다 |
| 13 | +::: |
| 14 | + |
| 15 | +웹 개발을 하다보면 **Modal** 컴포넌트를 구현해야 하는 순간이 자주 찾아옵니다. |
| 16 | + |
| 17 | +> 회원 가입시 약관 동의 <br/> |
| 18 | +> 게시글 삭제 전 "정말 삭제하시겠습니까?" <br/> |
| 19 | +> 결제 진행전 마지막 확인 ... |
| 20 | +
|
| 21 | +모달은 중요한 의사결정 직전에 모달은 사용자의 행동을 한번 더 되짚어주는 역할을 합니다. <br/> |
| 22 | + |
| 23 | +:::details [토스는 모달을 언제, 어떻게 띄울까? (feat. 모달 경험 잘 설계하기)](https://medium.com/@beomsu/%ED%86%A0%EC%8A%A4%EB%8A%94-%EB%AA%A8%EB%8B%AC%EC%9D%84-%EC%96%B8%EC%A0%9C-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%9D%84%EC%9A%B8%EA%B9%8C-841e97dda1eb) |
| 24 | + |
| 25 | +모달은 크게 Alert와 Sheet로 구분됩니다. <br/> |
| 26 | + |
| 27 | +- Alert는 화면 정중앙에 위치하고 투명한 검은색을 배경으로 가집니다. 주로 사용자에게 즉시 필요한 중대한 정보를 담을 때 쓰입니다. |
| 28 | +- Sheet는 화면 하단부에 위치하고 투명한 검은색을 배경으로 가집니다. 주로 사용자가 현재 맥락과 밀접한 관련이 있는 특정한 작업을 수행하게 할 때 쓰입니다. |
| 29 | +- 토스가 Alert를 쓰는 경우는 아래의 4가지입니다.<br/> |
| 30 | + ① 기기 또는 시스템 설정에 접근해야 하는 경우, <br/> |
| 31 | + ② 입력했던 정보를 파괴하는 행동을 하려는 경우,<br/> |
| 32 | + ③ 시스템상 오류가 발생한 경우,<br/> |
| 33 | + ④ 다음 화면으로 진행하는 데 피요한 작업을 요구하는 경우입니다.<br/> |
| 34 | + ①, ②, ③은 Alert를 적절히 사용했지만 ③은 새로운 화면, ④는 Sheet라는 대안이 가능합니다. |
| 35 | +- 토스가 Sheet를 쓰는 경우는 아래의 4가지입니다. <br/> |
| 36 | + ① 다음 화면으로 진행하는 데 필요한 작업을 요구하는 경우 <br/> |
| 37 | + ② 현재 화면에 영향을 미치는 작업을 요구하는 경우<br/> |
| 38 | + ③ 현재 화면과 관련된 정보를 전달하는 경우,<br/> |
| 39 | + ④ 기기 또는 시스템 설정에 접근해야 하는 경우입니다.<br/> |
| 40 | + ①, ②, ③은 Sheet를 적절히 사용했지만 ④는 Alert라는 대안이 가능합니다. |
| 41 | + |
| 42 | +::: |
| 43 | + |
| 44 | +모달은 단순한 UI 컴포넌트가 아니라, 사용자의 실수를 줄이고, 중요한 액션에 집중하게 만드는 중요한 역할을 합니다. |
| 45 | + |
| 46 | +그만큼 사용자 경험 (UX) 에서 중요한 역할을 하는데, <br/> |
| 47 | +개발자의 입장에서는 "어떻게 화면 위에 모달을 띄우지?" 라는 고민이 생깁니다. |
| 48 | + |
| 49 | +## 🤓 엥? Modal 그거 z-index:99999 박으면 되는거 아님? |
| 50 | + |
| 51 | +```css |
| 52 | +.modal { |
| 53 | + position: fixed; |
| 54 | + top: 50%; |
| 55 | + left: 50%; |
| 56 | + transform: translate(-50%, -50%); |
| 57 | + z-index: 99999; /* 화면에서 가장 위에 위치 */ |
| 58 | +} |
| 59 | +``` |
| 60 | + |
| 61 | +처음 모달을 구현할 때 대부분 이렇게 생각합니다 <br/> |
| 62 | +저도 그랬습니다 😅 |
| 63 | + |
| 64 | +하지만 z-index 를 높게 주는 것만으로는 모달이 항상 화면 위에 위치한다는 보장이 없습니다. <br/> |
| 65 | +왜냐하면 z-index 는 `Stacking Context` 와 `Containing Block` 에 영향을 받기 때문입니다. |
| 66 | + |
| 67 | +## 🤨 Stacking Context 가 뭔데 ? |
0 commit comments