-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Labels
Description
๐ ์ปดํฌ๋ํธ ์ ๋ณด
- ์ปดํฌ๋ํธ ์ด๋ฆ: Modal (Dialog)
- ์ปดํฌ๋ํธ ์ค๋ช : ๋ชจ๋ฌ ๋ค์ด์ผ๋ก๊ทธ๋ ํ์ฌ ์ฐฝ ๋๋ ๋ค๋ฅธ ๋ค์ด์ผ๋ก๊ทธ ์ฐฝ ์์ ๊ฒน์ณ ํ์๋๋ ์ฐฝ์ผ๋ก, ๋ชจ๋ฌ ๋ค์ด์ผ๋ก๊ทธ ์ธ๋ถ์ ์ฝํ ์ธ ๋ ๋นํ์ฑํ๋์ด ์ฌ์ฉ์๊ฐ ์ํธ์์ฉํ ์ ์์
- ์ฌ์ฉ ์ฌ๋ก: ์ฌ์ฉ์์ ์ฃผ์๋ฅผ ๋์ด์ผ ํ๋ ์ค์ํ ๋ฉ์์ง๋ฅผ ํ์ํ๊ฑฐ๋, ์ฌ์ฉ์๋ก๋ถํฐ ํ์ ์ ๋ณด๋ฅผ ์ ๋ ฅ๋ฐ์์ผ ํ ๋ ์ฌ์ฉ
๐ ์ฐธ์กฐ ๋ฐ ๋ ํผ๋ฐ์ค
- ARIA Authoring Practices: W3C ARIA Dialog (Modal) Pattern
- ๋ชจ๋ฌ ๋ค์ด์ผ๋ก๊ทธ์ ์ ๊ทผ์ฑ์ ๊ณ ๋ คํ ๊ตฌํ ๋ฐฉ๋ฒ๊ณผ ์์ ์ ๊ณต
- ๊ธฐํ ๋ ํผ๋ฐ์ค:
- Web Dev์ dialog ์์ ๊ด๋ จ ์ํฐํด
- MUI, Ant Design ๋ฑ์ ๋ชจ๋ฌ ๋ค์ด์ผ๋ก๊ทธ ์ปดํฌ๋ํธ ๋ฌธ์์ ๋น๊ตํ์ฌ ํจํด ๋ถ์
๐ ์ ๊ทผ์ฑ ๋ฐ ARIA ์ ์ฉ ์ฌ๋ถ
- ARIA Pattern ์ ์ฉ: ARIA Dialog (Modal) Pattern
- ์ฌ์ฉ๋ ARIA ์์ฑ:
role="dialog": ์์๊ฐ ๋ค์ด์ผ๋ก๊ทธ์์ ๋ช ์aria-modal="true": ๋ค์ด์ผ๋ก๊ทธ๊ฐ ๋ชจ๋ฌ์์ ๋ช ์aria-labelledby: ๋ค์ด์ผ๋ก๊ทธ์ ์ ๋ชฉ์ ์ฐธ์กฐaria-describedby: ๋ค์ด์ผ๋ก๊ทธ์ ์ค๋ช ์ ์ฐธ์กฐ
- ์ฌ์ฉ๋ ARIA ์์ฑ:
- ์ ๊ทผ์ฑ ๊ด๋ จ ๊ณ ๋ ค์ฌํญ:
- ๋ค์ด์ผ๋ก๊ทธ๊ฐ ์ด๋ฆด ๋ ์ด์ ์ ๋ค์ด์ผ๋ก๊ทธ ๋ด๋ถ์ ์์๋ก ์ด๋ํด์ผ ํจ
- ๋ค์ด์ผ๋ก๊ทธ๊ฐ ์ด๋ ค ์๋ ๋์์๋ Tab๊ณผ Shift+Tab์ผ๋ก ๋ค์ด์ผ๋ก๊ทธ ๋ด๋ถ์ ์์๋ง ํ์ํ ์ ์์ด์ผ ํจ
- Escape ํค๋ฅผ ๋๋ฅด๋ฉด ๋ค์ด์ผ๋ก๊ทธ๊ฐ ๋ซํ์ผ ํจ
- ๋ค์ด์ผ๋ก๊ทธ๊ฐ ๋ซํ ๋ ์ด์ ์ ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ์ด์๋ ์์๋ก ๋์๊ฐ์ผ ํจ
- ์ ๊ทผ์ฑ ๊ธฐ๋ฅ ์์ฝ:
- ํค๋ณด๋๋ก ๋ค์ด์ผ๋ก๊ทธ ๋ด๋ถ๋ฅผ ํ์ํ ์ ์์
- ๋ค์ด์ผ๋ก๊ทธ ์ธ๋ถ์ ์ฝํ ์ธ ๋ ๋นํ์ฑํ๋์ด ์ ๊ทผํ ์ ์์
- ์ ์ ํ ARIA ์์ฑ์ ์ฌ์ฉํ์ฌ ๋ค์ด์ผ๋ก๊ทธ์ ์ญํ ๊ณผ ์ํ๋ฅผ ๋ช ์ํจ
๐๏ธ ๋งํฌ์ ๊ตฌ์กฐ ๋ถ์
- HTML ์๋งจํฑ ํ๊ทธ ์ฌ์ฉ:
<dialog>: ๋ค์ด์ผ๋ก๊ทธ ์ปจํ ์ด๋ ์ญํ ์ ํ๋ ์ ์ฉ ์์<form method="dialog">: ๋ค์ด์ผ๋ก๊ทธ ๋ด๋ถ์ ํผ ์์<button>: ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ์ด๊ณ ๋ซ๋ ๋ฒํผ ์์
- ๋งํฌ์
๊ตฌ์กฐ ๋น๊ต:
- Web Dev Example:
<dialog id="MegaDialog" modal-mode="mega">
<form method="dialog">
<header>
<h3>Dialog title</h3>
<button onclick="this.closest('dialog').close('close')"></button>
</header>
<article>...</article>
<footer>
<menu>
<button autofocus type="reset" onclick="this.closest('dialog').close('cancel')">Cancel</button>
<button type="submit" value="confirm">Confirm</button>
</menu>
</footer>
</form>
</dialog>- MUI:
<div role="presentation" class="MuiModal-root">
<div aria-hidden="true" class="MuiBackdrop-root"></div>
<div role="dialog" aria-modal="true" aria-labelledby="dialog-title" aria-describedby="dialog-description" tabindex="-1" class="MuiDialog-container">
<div class="MuiDialog-paper">
<h2 id="dialog-title" class="MuiDialogTitle-root">Modal title</h2>
<div id="dialog-description" class="MuiDialogContent-root">Dialog content here</div>
<div class="MuiDialogActions-root">
<button type="button" class="MuiButtonBase-root MuiButton-root">Cancel</button>
<button type="button" class="MuiButtonBase-root MuiButton-root">OK</button>
</div>
</div>
</div>
</div>- Ant Design:
<div class="ant-modal-root">
<div class="ant-modal-mask"></div>
<div tabindex="-1" class="ant-modal-wrap">
<div role="dialog" aria-labelledby="dialog-title" aria-modal="true" class="ant-modal">
<div class="ant-modal-content">
<div class="ant-modal-header">
<div id="dialog-title" class="ant-modal-title">Basic Modal</div>
</div>
<div class="ant-modal-body">
<p>Some contents...</p>
</div>
<div class="ant-modal-footer">
<button type="button" class="ant-btn">Cancel</button>
<button type="button" class="ant-btn ant-btn-primary">OK</button>
</div>
</div>
</div>
</div>
</div>- ๊ตฌ์กฐ์ ์ ํ ์ด์ :
- Web Dev ์์ ์์๋
<dialog>์์๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ฌ ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ๊ตฌํํ๊ณ ,<form>์ ์ฌ์ฉํ์ฌ ๋ค์ด์ผ๋ก๊ทธ ๋ด๋ถ์ ์ฝํ ์ธ ๋ฅผ ๊ฐ์. ์ด๋ HTML ํ์ค์ ๋ง๋ ์๋ฏธ๋ก ์ ์ธ ๋งํฌ์ ๊ตฌ์กฐ์ - MUI์ Ant Design์
<div>์์์ ARIA ์์ฑ์ ์ฌ์ฉํ์ฌ ๋ชจ๋ฌ ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ๊ตฌํํ๋ฉฐ, ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋์์ธ ์์คํ ์ ๋ง๊ฒ ํด๋์ค ์ด๋ฆ์ ์ฌ์ฉํจ
- Web Dev ์์ ์์๋
๐ก UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋น๊ต ๋ถ์
- MUI:
MuiModal-root๋ก ๋ชจ๋ฌ ์ปจํ ์ด๋๋ฅผ ํํํ๊ณ ,MuiBackdrop-root๋ก ๋ชจ๋ฌ ๋ค์ ๋ฐฑ๋๋กญ์ ๊ตฌํํจMuiDialog-container๋ก ๋ค์ด์ผ๋ก๊ทธ ์ปจํ ์ด๋๋ฅผ ํํํ๊ณ ,aria-labelledby์aria-describedby๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ทผ์ฑ์ ๊ณ ๋ คํจMuiDialogTitle-root,MuiDialogContent-root,MuiDialogActions-root๋ก ๋ค์ด์ผ๋ก๊ทธ์ ๊ฐ ์น์ ์ ๊ตฌ๋ถํจ
- Ant Design:
ant-modal-root๋ก ๋ชจ๋ฌ ์ปจํ ์ด๋๋ฅผ ํํํ๊ณ ,ant-modal-mask๋ก ๋ชจ๋ฌ ๋ค์ ๋ฐฑ๋๋กญ์ ๊ตฌํํจant-modal-wrap์ผ๋ก ๋ค์ด์ผ๋ก๊ทธ ๋ํผ๋ฅผ ํํํ๊ณ ,aria-labelledby์aria-modal์ ์ฌ์ฉํ์ฌ ์ ๊ทผ์ฑ์ ๊ณ ๋ คํจant-modal-header,ant-modal-body,ant-modal-footer๋ก ๋ค์ด์ผ๋ก๊ทธ์ ๊ฐ ์น์ ์ ๊ตฌ๋ถํจ
โ๏ธ ๊ตฌํ ๋ฐ ์ค๊ณ ๊ณ ๋ ค์ฌํญ
- ์ฃผ์ ์ค๊ณ ๊ณ ๋ ค์ฌํญ:
- ๋ชจ๋ฌ ๋ค์ด์ผ๋ก๊ทธ๋ ํ์ฌ ํ์ด์ง ์์ ๊ฒน์ณ ํ์๋๋ฏ๋ก, ์ ์ ํ ๋ ์ด์ด ๊ด๋ฆฌ๊ฐ ํ์ํจ
- ๋ค์ด์ผ๋ก๊ทธ๊ฐ ์ด๋ ค ์๋ ๋์์๋ ๋ค์ด์ผ๋ก๊ทธ ์ธ๋ถ์ ์ฝํ ์ธ ๋ฅผ ๋นํ์ฑํํ์ฌ ์ ๊ทผํ ์ ์๋๋ก ํด์ผ ํจ
- ํค๋ณด๋ ํฌ์ปค์ค ๊ด๋ฆฌ๋ฅผ ํตํด ๋ค์ด์ผ๋ก๊ทธ ๋ด๋ถ์์๋ง ํ์ํ ์ ์๋๋ก ์ ํํด์ผ ํจ
- ์ ์ ํ ARIA ์์ฑ์ ์ฌ์ฉํ์ฌ ๋ค์ด์ผ๋ก๊ทธ์ ์ญํ ๊ณผ ์ํ๋ฅผ ๋ช ํํ ์ ๋ฌํด์ผ ํจ
- Web Dev ์ํฐํด์์ ์ ์ํ ๋ฐ์ ๊ฐ์ด,
<dialog>์์๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ฌ ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด ์ข์
- ์ฝ๋ ์์:
<button type="button" onclick="openDialog('dialog1', this)">Open Dialog</button>
<dialog id="dialog1" aria-labelledby="dialog1_label" aria-modal="true">
<form method="dialog">
<h2 id="dialog1_label">Dialog Title</h2>
<div>
<p>Dialog content goes here.</p>
<button type="button" onclick="closeDialog(this)">Cancel</button>
<button type="submit" value="confirm">OK</button>
</div>
</form>
</dialog>๐ ํ ์คํธ ๋ฐ ๊ฒํ
- ์ ๊ทผ์ฑ ํ
์คํธ:
- ํค๋ณด๋๋ง์ผ๋ก ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ์ด๊ณ ๋ซ์ ์ ์๋์ง ํ์ธ
- ๋ค์ด์ผ๋ก๊ทธ๊ฐ ์ด๋ ค ์์ ๋ Tab๊ณผ Shift+Tab์ผ๋ก ๋ค์ด์ผ๋ก๊ทธ ๋ด๋ถ ์์๋ง ํ์ํ ์ ์๋์ง ํ์ธ
- ๋ค์ด์ผ๋ก๊ทธ๊ฐ ์ด๋ ค ์์ ๋ Escape ํค๋ฅผ ๋๋ฅด๋ฉด ๋ค์ด์ผ๋ก๊ทธ๊ฐ ๋ซํ๋์ง ํ์ธ
- ์คํฌ๋ฆฐ ๋ฆฌ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ด์ผ๋ก๊ทธ์ ์ญํ ๊ณผ ๋ด์ฉ์ด ์ ํํ ์ ๋ฌ๋๋์ง ํ์ธ
- ๋ธ๋ผ์ฐ์ ํธํ์ฑ ํ
์คํธ:
<dialog>์์์ ๋ธ๋ผ์ฐ์ ์ง์ ๋ฒ์ ํ์ธ ๋ฐ ํด๋ฆฌํ ์ ์ฉ ๊ณ ๋ ค- ๋ค์ํ ๋ธ๋ผ์ฐ์ ์ ๋ฒ์ ์์ ๋ชจ๋ฌ ๋ค์ด์ผ๋ก๊ทธ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๋์ง ํ์ธ
- ์ฌ์ฉ์ ํผ๋๋ฐฑ:
- ๋ชจ๋ฌ ๋ค์ด์ผ๋ก๊ทธ ์ฌ์ฉ ์ ์ ๊ทผ์ฑ๊ณผ ์ฌ์ฉ์ฑ์ ๋ํ ์ฌ์ฉ์ ์๊ฒฌ์ ์๋ ดํ๊ณ ๊ฐ์ ์ฌํญ์ ๋ฐ์
๐ ์ถ๊ฐ ์ฐธ๊ณ ์ฌํญ
- ๊ด๋ จ ๋ฌธ์:
- ์๊ฒฌ ๋ฐ ์ ์:
<dialog>์์๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ฌ ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด ์๋ฏธ๋ก ์ ์ด๊ณ ์ ๊ทผ์ฑ ์ธก๋ฉด์์ ์ ๋ฆฌํจ- ๋ชจ๋ฌ ๋ค์ด์ผ๋ก๊ทธ์ ํฌ๊ธฐ์ ์์น๋ฅผ ์ ์ฐํ๊ฒ ์กฐ์ ํ ์ ์๋๋ก ๊ตฌํํ๋ ๊ฒ์ด ์ข์
- ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ์์์ ์ฌ์ฉ์ฑ์ ๊ณ ๋ คํ์ฌ ๋ฐ์ํ ๋์์ธ์ ์ ์ฉํ๋ ๊ฒ์ด ์ข์
๐ฏ ์ญํ , ์์ฑ, ์ํ ๋ฐ ํ๊ทธ ์์ฑ
- Role, Attribute, State:
- Role:
role="dialog"๋ก ์์๊ฐ ๋ค์ด์ผ๋ก๊ทธ์์ ๋ช ์ - Attribute:
aria-modal="true"๋ก ๋ค์ด์ผ๋ก๊ทธ๊ฐ ๋ชจ๋ฌ์์ ๋ช ์,aria-labelledby์aria-describedby๋ก ๋ค์ด์ผ๋ก๊ทธ์ ์ ๋ชฉ๊ณผ ์ค๋ช ์ ์ฐธ์กฐ - State:
open์์ฑ์ผ๋ก ๋ค์ด์ผ๋ก๊ทธ์ ์ด๋ฆผ/๋ซํ ์ํ๋ฅผ ๋ช ์
- Role:
- JavaScript ๋ฐ CSS ์ฌ์ฉ ์ฌ๋ถ:
- JavaScript ์ฌ์ฉ ์ฌ๋ถ: ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ์ด๊ณ ๋ซ๋ ๊ธฐ๋ฅ, ํฌ์ปค์ค ๊ด๋ฆฌ, ํค๋ณด๋ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฑ์ ์ํด JavaScript ์ฌ์ฉ
- CSS ์ ์ฉ ์ฌํญ: ๋ค์ด์ผ๋ก๊ทธ์ ๋ ์ด์์, ์คํ์ผ, ์ ๋๋ฉ์ด์ ๋ฑ์ ์ํด CSS ์ฌ์ฉ