ARIA 접근성 가이드

역할 · 창

role="alertdialog"

사용자의 응답이 필요한 경고 메시지를 담은 대화상자입니다. 삭제 확인, 저장하지 않고 나가기 경고 등에 씁니다.

중급

한눈에 보기

분류
창
대응 HTML
없음
이름 정하는 방법
작성자 (author)
이름 필수
예
필수 상위 요소
없음
필수 하위 요소
없음

설명

alertdialog는 경고 메시지를 담고 있으면서, 열리면 포커스가 대화상자 안의 요소로 이동하는 대화상자입니다. dialog의 하위 역할이고, alert처럼 브라우저가 열릴 때 시스템 경고 이벤트를 보냅니다. alert와 달리 사용자의 응답(확인·취소)을 받습니다.

예: “이 글을 삭제할까요?”, “저장하지 않은 변경 사항이 있습니다. 나가시겠어요?”, “세션이 1분 후 만료됩니다. 연장할까요?”

필수·권장 사항

  • 이름 필수: 제목을 aria-labelledby로 연결합니다.
  • 메시지 연결: 명세는 경고 문구를 aria-describedby로 참조하라고 합니다(SHOULD). 그래야 열릴 때 제목과 함께 메시지가 읽힙니다.
  • 모달로 만들기: 표시되는 동안 키보드·마우스 조작이 대화상자 안에서만 되게 하고 aria-modal="true"를 줍니다.
  • 초기 포커스: 열릴 때 대화상자 안의 조작 요소로 포커스를 옮깁니다. 되돌릴 수 없는 작업(삭제)이라면 APG는 가장 덜 파괴적인 버튼(“취소”)에 포커스를 두라고 권장합니다.
  • 닫을 때: 열기 전 포커스가 있던 요소(또는 논리적으로 다음 위치)로 포커스를 돌려보냅니다.

HTML과의 관계

전용 HTML 요소는 없지만 <dialog> 요소에 role="alertdialog"를 주는 것이 허용됩니다. 이렇게 하면 showModal()이 제공하는 포커스 가두기, Esc 닫기, 배경 비활성화(inert)를 그대로 쓸 수 있습니다.

dialog와 구분

단순히 정보를 입력받는 창(로그인, 설정)은 dialog입니다. 즉시 주의를 끌어야 하는 경고와 응답이 함께 있을 때만 alertdialog를 씁니다. 브라우저 기본 confirm()/alert()도 접근 가능하지만 꾸밀 수 없고 문구 제어가 제한됩니다.

테스터 관점

열릴 때 제목·경고 문구가 함께 읽히는지, 포커스가 안전한 버튼에 있는지, Tab이 대화상자 밖으로 나가지 않는지, Esc와 버튼으로 닫은 뒤 포커스가 원래 버튼으로 돌아오는지 확인합니다.

함께 쓰는 속성

지원 속성

전역 속성(이름·설명 등)은 모든 역할에 쓸 수 있어 생략했습니다.

키보드 동작

키보드 동작
키동작
Tab대화상자 안의 다음 포커스 가능 요소로 이동합니다. 마지막 요소에서는 첫 요소로 돌아갑니다(모달일 때).
Shift + Tab이전 포커스 가능 요소로 이동합니다. 첫 요소에서는 마지막 요소로 갑니다(모달일 때).
Esc대화상자를 닫고 열기 전 요소로 포커스를 되돌립니다.

사용 예

dialog 요소 + alertdialog (권장)

권장HTML
<dialog id="confirm" role="alertdialog"
        aria-labelledby="cf-title" aria-describedby="cf-desc">
  <h2 id="cf-title">대출을 취소할까요?</h2>
  <p id="cf-desc">취소하면 예약 순번이 사라지며 되돌릴 수 없습니다.</p>
  <button type="button" id="cf-no" autofocus>돌아가기</button>
  <button type="button" id="cf-yes">대출 취소</button>
</dialog>

<script>
  document.getElementById('confirm').showModal();
</script>

div로 만든 경고 대화상자

HTML
<div role="alertdialog" aria-modal="true"
     aria-labelledby="ad-t" aria-describedby="ad-d">
  <h2 id="ad-t">저장하지 않고 나가시겠어요?</h2>
  <p id="ad-d">작성 중인 서평이 사라집니다.</p>
  <button type="button">계속 작성</button>
  <button type="button">나가기</button>
</div>

경고 문구를 연결하지 않음 (비권장)

비권장HTML
<div role="alertdialog">
  <p>정말 삭제하시겠습니까?</p>
  <button>확인</button>
</div>

이름(aria-labelledby)과 설명(aria-describedby)이 없고, 모달 처리와 취소 버튼도 없습니다.

직접 해 보기

버튼을 누르면 경고 대화상자가 열리고 포커스가 “돌아가기”로 이동합니다. Tab은 대화상자 안에서만 돌고, Esc나 버튼으로 닫으면 포커스가 원래 버튼으로 돌아옵니다.

화면낭독기에서는

화면낭독기 안내 예시 (표현은 화면낭독기·브라우저·버전에 따라 조금씩 다릅니다)
상황들리는 안내 (예)
대화상자가 열림대출을 취소할까요?, 경고 대화상자, 취소하면 예약 순번이 사라지며 되돌릴 수 없습니다. 돌아가기, 버튼
Esc로 닫음대출 취소…, 버튼

사용 지침

이렇게 쓰세요

  • 제목은 aria-labelledby, 경고 문구는 aria-describedby로 연결합니다.
  • 열릴 때 포커스를 안전한 버튼으로 옮깁니다.
  • 가능하면 <dialog>와 showModal()을 씁니다.

이렇게 쓰지 마세요

  • 단순 정보 입력 창에 alertdialog를 쓰지 않습니다.
  • 포커스를 옮기지 않는 알림에 쓰지 않습니다(alert 사용).
  • 닫은 뒤 포커스를 페이지 맨 위로 보내지 않습니다.

이 역할을 쓰는 패턴

참고 자료