๋ชจ๋ฌ(Modal)๊ณผ ๋ค์ด์ผ๋ก๊ทธ(Dialog) ์ฐจ์ด์ ์๋ฒฝํ ์ ๋ฆฌ
์น ๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด '๋ชจ๋ฌโ๊ณผ '๋ค์ด์ผ๋ก๊ทธโ๋ผ๋ ์ฉ์ด๋ฅผ ์์ฃผ ์ ํ๊ฒ ๋ฉ๋๋ค. ๋ง์ ๊ฐ๋ฐ์๊ฐ ์ด ๋์ ๋น์ทํ๊ฑฐ๋ ๊ฐ์ ์๋ฏธ๋ก ์ฌ์ฉํ๊ธฐ๋ ํ์ฃ . ์ค์ ๋ก ์ ํ์์๋ ๋ชจ๋ฌ, ๊ตฌ๊ธ์์๋ ๋ค์ด์ผ๋ก๊ทธ๋ผ๋ ์ฉ์ด๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๋ฉด์ ํผ์ฉ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ก์ต๋๋ค. ํ์ง๋ง ์ด ๋์ ์์ฐํ ๋ค๋ฅธ ๋ชฉ์ ๊ณผ ์ํธ์์ฉ ๋ฐฉ์์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ด๋ฒ ํฌ์คํธ์์๋ ๋ชจ๋ฌ๊ณผ ๋ค์ด์ผ๋ก๊ทธ์ ์ ํํ ์ ์๋ถํฐ ์ฃผ์ ์ฐจ์ด์ , ๊ทธ๋ฆฌ๊ณ ๊ฐ๊ฐ ์ด๋ค ์ํฉ์ ์ฌ์ฉํด์ผ ํ๋์ง ๋ช ํํ๊ฒ ์ ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค. ์ด ๊ธ์ ๋๊น์ง ์ฝ์ผ์๋ฉด ๋ UI ์ปดํฌ๋ํธ๋ฅผ ์ธ์ , ์ด๋ป๊ฒ ์ฌ์ฉํด์ผ ํ ์ง ์์ ๊ฐ์ ์ป๊ฒ ๋์ค ๊ฑฐ์์!
๋ชจ๋ฌ(Modal)๊ณผ ๋ค์ด์ผ๋ก๊ทธ(Dialog)๋?
๋จผ์ ๊ฐ ์ฉ์ด์ ์ ์๋ฅผ ์ดํด๋ณด๋ฉฐ ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ๋ถํฐ ํ์คํ ์ง๊ณ ๋์ด๊ฐ๊ฒ ์ต๋๋ค.
๋ชจ๋ฌ(Modal)์ ์ ์
๋ชจ๋ฌ(Modal)์ ๊ธฐ์กด ํ๋ฉด ์์ ์๋ก์ด ๋ ์ด์ด๋ฅผ ๋์ ์ฌ์ฉ์์ ์์ ์ ์ง์ค์ํค๋ UI ์์์ ๋๋ค. ๋ชจ๋ฌ์ด ํ์ฑํ๋๋ฉด ์ฌ์ฉ์๋ ๋ชจ๋ฌ ์ฐฝ๊ณผ ์ํธ์์ฉํ๊ธฐ ์ ๊น์ง๋ ์๋ ํ์ด์ง์ ๋ค๋ฅธ ๋ถ๋ถ๊ณผ ์ํตํ ์ ์์ต๋๋ค. ์ฆ, ํน์ ๊ณผ์ ์ ์๋ฃํ๊ฑฐ๋ ๋ชจ๋ฌ์ ๋ซ์์ผ๋ง ๊ธฐ์กด ํ๋ฉด์ผ๋ก ๋์๊ฐ ์ ์๋ '์ฐจ๋จ์ฑ UIโ๋ผ๊ณ ํ ์ ์์ฃ .
์ด๋ฌํ ํน์ฑ ๋๋ฌธ์ ๋ชจ๋ฌ์ ํ์ฌ ํ์ด์ง์ ์ข ์๋ ๋ถ๋ชจ-์์ ๊ด๊ณ๋ฅผ ๊ฐ์ง๋๋ค. ๋ง์น ํ์ฌ ํ์ด์ง์ ์ผ๋ถ์ฒ๋ผ ์๋ํ๋ฉฐ, ์ฌ์ฉ์๊ฐ ๋ฐ๋์ ํ์ธํด์ผ ํ ์ค์ ์ ๋ณด ์ ๋ฌ์ด๋ ๊ฒฐ์ ์ด ํ์ํ ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.
๋ค์ด์ผ๋ก๊ทธ(Dialog)์ ์ ์
๋ค์ด์ผ๋ก๊ทธ(Dialog)๋ ์ฌ์ฉ์์๊ฒ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ฑฐ๋ ์ ๋ ฅ์ ๋ฐ๊ธฐ ์ํด ์ฌ์ฉ๋๋ '๋ํ ์์โ๋ฅผ ์๋ฏธํ๋ ๋ ๋์ ๊ฐ๋ ์ ๋๋ค. ์ด๋ฆ ๊ทธ๋๋ก ์ฌ์ฉ์์ ์์คํ ๊ฐ์ ๊ฐ๋จํ ๋ํ๋ฅผ ๋ชฉ์ ์ผ๋ก ํฉ๋๋ค.
๋ค์ด์ผ๋ก๊ทธ๋ ๋ชจ๋ฌ์ฒ๋ผ ์ฌ์ฉ์์ ํ๋์ ๊ฐ์ ํ๋ '๋ชจ๋ฌ ๋ค์ด์ผ๋ก๊ทธ(Modal Dialog)'๊ฐ ๋ ์๋ ์๊ณ , ๋ค๋ฅธ ํ๋ฉด์ ์กฐ์ํ๋ฉด์๋ ์ํธ์์ฉํ ์ ์๋ โ๋ชจ๋ฌ๋ฆฌ์ค ๋ค์ด์ผ๋ก๊ทธ(Modeless Dialog)โ ํํ๊ฐ ๋ ์๋ ์์ต๋๋ค. ์ฆ, ๋ค์ด์ผ๋ก๊ทธ๋ ๋ชจ๋ฌ์ ํฌํจํ๋ ์์ ๊ฐ๋ ์ผ๋ก ๋ณผ ์ ์์ต๋๋ค. (๋ชจ๋ฌ โ ๋ค์ด์ผ๋ก๊ทธ)
<dialog>HTML ์์๋ ๋ชจ๋ฌ ๋๋ ๋น๋ชจ๋ฌ ๋ํ ์์๋ ๋ซ์ ์ ์๋ ์๋ฆผ์ฐฝ, ๊ฒ์ฌ๊ธฐ, ํ์ ์ฐฝ๊ณผ ๊ฐ์ ์ํธ์์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ๋ฅผ ๋ํ๋ ๋๋ค. HTML<dialog>์์๋ ๋ชจ๋ฌ ๋ฐ ๋น๋ชจ๋ฌ ๋ํ ์์๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ชจ๋ฌ ๋ํ ์์๋ ํ์ด์ง์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ์ํธ์์ฉ์ ์ค๋จ์ํค๋ ๋ฐ๋ฉด, ๋น๋ชจ๋ฌ ๋ํ ์์๋ ํ์ด์ง์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ์ํธ์์ฉ์ ํ์ฉํฉ๋๋ค.<dialog>์์๋ฅผ ํ์ํ๋ ค๋ฉด JavaScript๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๋ชจ๋ฌ ๋ํ ์์๋ฅผ ํ์ํ๋ ค๋ฉด.showModal()๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ณ , ๋น๋ชจ๋ฌ ๋ํ ์์๋ฅผ ํ์ํ๋ ค๋ฉด.show()๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ํ ์์๋.close()๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ฑฐ๋<dialog>์์ ๋ด์ ์ค์ฒฉ๋<form>์ ์ ์ถํ ๋ dialog ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ๋ซ์ ์ ์์ต๋๋ค. ๋ชจ๋ฌ ๋ํ ์์๋ Esc ํค๋ฅผ ๋๋ฌ ๋ซ์ ์๋ ์์ต๋๋ค.
ํต์ฌ ์ฐจ์ด์ : ์ํธ์์ฉ ๋ฐฉ์๊ณผ ๋ชฉ์
์ ์์์ ์ ์ ์๋ฏ์ด, ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ์ํธ์์ฉ์ ๊ฐ์ ์ฑ ์ฌ๋ถ์ ์ฌ์ฉ ๋ชฉ์ ์ ์์ต๋๋ค.
| ๊ตฌ๋ถ | ๋ชจ๋ฌ (Modal) | ๋ค์ด์ผ๋ก๊ทธ (Dialog) |
|---|---|---|
| ์ํธ์์ฉ | ์ฐจ๋จ (Blocking) ๋ชจ๋ฌ ์ฐฝ์ ๋ซ๊ธฐ ์ ๊น์ง ๋ฐฐ๊ฒฝ ์ฝํ ์ธ ์ ์ํธ์์ฉ ๋ถ๊ฐ | ์ฐจ๋จ ๋๋ ๋น์ฐจ๋จ (Blocking or Non-blocking) ๋ชจ๋ฌ ๋๋ ๋ชจ๋ฌ๋ฆฌ์ค ํํ๋ก ๊ตฌํ ๊ฐ๋ฅ |
| ๋ชฉ์ | ์ฌ์ฉ์ ์ฃผ์ ์ง์ค, ๊ฒฐ์ /์ ๋ ฅ ๊ฐ์ ์ค์ ์ ๋ณด ํ์ธ, ์ค์ ๋ณ๊ฒฝ ๋ฑ ํ์์ ์ธ ๊ณผ์ ์ํ | ์ ๋ณด ์ ๊ณต ๋ฐ ์์ง ์๋ฆผ, ํ์ธ ๋ฉ์์ง ๋ฑ ์ฌ์ฉ์์์ ๊ฐ๋จํ ์ํต |
| ๊ด๊ณ | ํญ์ ๋ค์ด์ผ๋ก๊ทธ์ ํ ์ข ๋ฅ (๋ชจ๋ ๋ชจ๋ฌ์ ๋ค์ด์ผ๋ก๊ทธ) | ํฌ๊ด์ ์ธ ๊ฐ๋ (๋ชจ๋ ๋ค์ด์ผ๋ก๊ทธ๊ฐ ๋ชจ๋ฌ์ ์๋) |
๊ฒฐ๋ก ์ ์ผ๋ก, '๋ชจ๋ฌโ์ ์ํธ์์ฉ ๋ฐฉ์์ ๊ท์ ํ๋ ๊ธฐ์ ์ ์ธ ์ฉ์ด์ ๊ฐ๊น๊ณ , '๋ค์ด์ผ๋ก๊ทธโ๋ ์ฌ์ฉ์์์ ๋ํ๋ผ๋ ๋ชฉ์ ์ ๋ํ๋ด๋ ๊ธฐ๋ฅ์ ์ธ ์ฉ์ด์ ๊ฐ๊น์ต๋๋ค.
์ธ์ ๋ฌด์์ ์ฌ์ฉํด์ผ ํ ๊น?: ์ฌ์ฉ ์ฌ๋ก (Use Cases)
๊ทธ๋ ๋ค๋ฉด ์ค์ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ์ธ์ ๋ชจ๋ฌ์ ์ฐ๊ณ , ์ธ์ ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ์ฌ์ฉํด์ผ ํ ๊น์? ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํตํด ์์๋ณด๊ฒ ์ต๋๋ค.
๋ชจ๋ฌ(Modal) ์ฌ์ฉ์ด ์ ํฉํ ๊ฒฝ์ฐ
์ฌ์ฉ์๊ฐ ๋ฐ๋์ ํน์ ์์ ์ ์๋ฃํด์ผ๋ง ๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ ์ ์๋ ์ํฉ์ ์ฌ์ฉํฉ๋๋ค.
- ๋ก๊ทธ์ธ / ํ์๊ฐ์ ์ฐฝ: ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ์ ๋ ฅํ๊ธฐ ์ ๊น์ง ๋ค๋ฅธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋๋ก ํ ๋.
- ์ค์ ํ์ธ ์ฐฝ: "์ ๋ง๋ก ์ญ์ ํ์๊ฒ ์ต๋๊น?"์ ๊ฐ์ด ์ฌ์ฉ์์ ๋ช ํํ ํ์ธ์ด ํ์ํ ๊ฒฝ์ฐ.
- ์ค์ ๋ณ๊ฒฝ: ์ฌ์ฉ์๊ฐ ์ฑ์ ์ฃผ์ ์ค์ ์ ๋ณ๊ฒฝํ๋ ๋์ ๋ค๋ฅธ ์ํธ์์ฉ์ ๋ง์ ํผ๋์ ๋ฐฉ์งํ ๋.
- ์ฝํ ์ธ ์์ธ ๋ณด๊ธฐ: ๊ฐค๋ฌ๋ฆฌ์์ ์ด๋ฏธ์ง๋ฅผ ํด๋ฆญํ์ ๋, ์ด๋ฏธ์ง๋ฅผ ํฌ๊ฒ ๋ณด์ฌ์ฃผ๊ณ ๋ฐฐ๊ฒฝ ์คํฌ๋กค์ ๋ง๊ณ ์ถ์ ๋.
๋ค์ด์ผ๋ก๊ทธ(Dialog) ์ฌ์ฉ์ด ์ ํฉํ ๊ฒฝ์ฐ
์ฌ์ฉ์์๊ฒ ๊ฐ๋จํ ์ ๋ณด๋ฅผ ์๋ฆฌ๊ฑฐ๋, ์ ํ์ง๋ฅผ ์ ๊ณตํ์ง๋ง ๋ค๋ฅธ ์์ ์ ์์ ํ ๋ง์ ํ์๋ ์์ ๋ ์ฌ์ฉํฉ๋๋ค.
- ์๋ฆผ(Notifications): โ์ ๋ฐ์ดํธ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.โ ์ ๊ฐ์ด ์ฌ์ฉ์์๊ฒ ์ ๋ณด๋ฅผ ์๋ ค์ฃผ์ง๋ง ์ฆ๊ฐ์ ์ธ ํ๋์ ๊ฐ์ํ์ง ์์ ๋ (๋ชจ๋ฌ๋ฆฌ์ค).
- ๊ฐ๋จํ ์ ํ: "ํ์ผ์ ์ ์ฅํ์๊ฒ ์ต๋๊น?"์ ๊ฐ์ด ๊ฐ๋จํ ์/์๋์ค ์ ํ์ ๋ฐ์ ๋ (๋ชจ๋ฌ).
- ๋๊ตฌ ์ต์ ์ฐฝ: ํฌํ ์ต๊ณผ ๊ฐ์ ํด์์ ํน์ ๋๊ตฌ์ ์ธ๋ถ ์ต์ ์ ์ค์ ํ๋ ์์ ์ฐฝ (๋ชจ๋ฌ๋ฆฌ์ค).
๊ธฐ์ ์ ๊ตฌํ ๊ด์
์น ๊ฐ๋ฐ์์ ๋ชจ๋ฌ๊ณผ ๋ค์ด์ผ๋ก๊ทธ๋ ์ฃผ๋ก HTML, CSS, JavaScript๋ฅผ ์ฌ์ฉํด ๊ตฌํํฉ๋๋ค.
- HTML:
<dialog>ํ๊ทธ๋ ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ๋ง๋ค๊ธฐ ์ํ ํ์ค HTML ์์์ ๋๋ค. ์ด ํ๊ทธ๋showModal()๋ฉ์๋๋ฅผ ํตํด ๋ชจ๋ฌ ํํ๋ก,show()๋ฉ์๋๋ฅผ ํตํด ๋ชจ๋ฌ๋ฆฌ์ค ํํ๋ก ์ฝ๊ฒ ์ด ์ ์์ต๋๋ค. - CSS:
::backdrop๊ฐ์ ์์๋ฅผ ์ฌ์ฉํ๋ฉด<dialog>๊ฐ ๋ชจ๋ฌ ํํ๋ก ์ด๋ ธ์ ๋ ๋ฐฐ๊ฒฝ(๋ฐฑ๋๋กญ)์ ์คํ์ผ(์: ์ด๋ก๊ฒ ์ฒ๋ฆฌ)์ ์ฝ๊ฒ ์ง์ ํ ์ ์์ต๋๋ค. - JavaScript: JavaScript๋ ๋ชจ๋ฌ/๋ค์ด์ผ๋ก๊ทธ๋ฅผ ์ด๊ณ ๋ซ๋ ๋ก์ง์ ์ ์ดํฉ๋๋ค. ๋ฒํผ ํด๋ฆญ ์
showModal()์ ํธ์ถํ๊ฑฐ๋, ๋ซ๊ธฐ ๋ฒํผ์ ๋๋ฅด๊ฑฐ๋ Esc ํค๋ฅผ ๋๋ ์ ๋close()๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๋ฑ์ ๋์์ ๊ตฌํํฉ๋๋ค.
<!-- HTML ๊ตฌ์กฐ ์์ -->
<dialog id="myDialog">
<h2>๋ค์ด์ผ๋ก๊ทธ ์ ๋ชฉ</h2>
<p>์ด๊ฒ์ ๋ค์ด์ผ๋ก๊ทธ ๋ด์ฉ์
๋๋ค.</p>
<button id="closeBtn">๋ซ๊ธฐ</button>
</dialog>
<button id="openBtn">๋ค์ด์ผ๋ก๊ทธ ์ด๊ธฐ</button>
<script>
// JavaScript ๊ตฌํ ์์
const dialog = document.getElementById('myDialog');
const openBtn = document.getElementById('openBtn');
const closeBtn = document.getElementById('closeBtn');
openBtn.addEventListener('click', () => {
dialog.showModal(); // ๋ชจ๋ฌ ํํ๋ก ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ์ฝ๋๋ค.
});
closeBtn.addEventListener('click', () => {
dialog.close(); // ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ๋ซ์ต๋๋ค.
});
</script>
์ด์ฒ๋ผ ์ต์ ์น ํ์ค์์๋ <dialog> ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๊ฐ์ง ํํ๋ฅผ ๋ชจ๋ ์์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํ ์ ํ
์ด์ ๋ชจ๋ฌ๊ณผ ๋ค์ด์ผ๋ก๊ทธ์ ์ฐจ์ด์ ์ด ๋ช ํํด์ง์ จ์ ๊ฒ๋๋ค.
- ๋ชจ๋ฌ(Modal)์ ์ฌ์ฉ์์ ํ๋์ ๊ฐ์ ํ๊ณ ์ฃผ์๋ฅผ ์ง์ค์์ผ์ผ ํ ๋ ์ฌ์ฉํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค.
- ๋ค์ด์ผ๋ก๊ทธ(Dialog)๋ ์ฌ์ฉ์์ ๊ฐ๋จํ ์ํต์ด ํ์ํ ๋ ์ฌ์ฉํ๋ ํฌ๊ด์ ์ธ ๊ฐ๋ ์ ๋ํ ์์์ ๋๋ค.
๋ชจ๋ ๋ชจ๋ฌ์ ๋ค์ด์ผ๋ก๊ทธ์ ์ผ์ข ์ด์ง๋ง, ๋ชจ๋ ๋ค์ด์ผ๋ก๊ทธ๊ฐ ๋ชจ๋ฌ์ ์๋๋๋ค. ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์ฌ์ฉ์์ ํ๋ฆ์ ๋ฐฉํดํ์ง ์๋ ์ ์์ ๋ช ํํ ๋ชฉ์ ์ ๋ฌ์ฑํ๋ ๊ฒ์ ๋๋ค. ๊ผญ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด ์ฌ์ฉ์์ ์์ ์ ์ฐจ๋จํ๋ ๋ชจ๋ฌ์ ์ฌ์ฉ์ ์ต์ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด์ ์ฌ๋ฌ๋ถ์ ํ๋ก์ ํธ์์ UI๋ฅผ ์ค๊ณํ ๋, "์ด ์ ๋ณด๋ ์ฌ์ฉ์์ ์์ ์ ์ค๋จ์ํฌ ๋งํผ ์ค์ํ๊ฐ?"๋ฅผ ๋จผ์ ๊ณ ๋ฏผํด ๋ณด์ธ์. ์ด ์ง๋ฌธ์ ๋ํ ๋ต์ด ๋ชจ๋ฌ๊ณผ ๋ค์ด์ผ๋ก๊ทธ ์ฌ์ด์์ ์ฌ๋ฐ๋ฅธ ์ ํ์ ํ๋๋ก ๋์์ค ๊ฒ์ ๋๋ค. ๐