직접 만든 모달은 신경 쓸 게 많습니다 — Tab이 모달 밖으로 새지 않게 포커스를 가두고, Esc로 닫히게 하고, 배경을 어둡게 깔고, 스크린리더에 `role="dialog"`와 `aria-modal`을 정확히 달아야 합니다. 이 중 하나만 빠져도 접근성 결함이 됩니다.
`<dialog>`는 이걸 엘리먼트 자체가 해결합니다. `.showModal()`을 호출하면 top layer에 렌더링되고, 포커스가 자동으로 갇히고, Esc로 닫히며, `::backdrop` 가상 요소로 배경을 스타일링할 수 있습니다. `.show()`(모달리스)와 `.showModal()`(모달)은 서로 다르다는 점, 폼의 `method="dialog"`로 제출 시 자동으로 닫힌다는 점이 자주 쓰이는 디테일입니다.
기본 지원은 caniuse/MDN baseline을 확인하세요. 미지원 브라우저에서는 직접 포커스 트랩·Esc 리스너·backdrop div를 구현한 커스텀 모달이 대안이며, 지금도 애니메이션 커스터마이징이 더 필요하면 커스텀 구현이 쓰입니다.
언제 쓰나
확인창·설정창처럼 화면을 완전히 막는 모달을 접근성 버그 없이 빠르게 만들 때.