역할 · 복합 위젯
role="radiogroup"
라디오 버튼(radio)을 하나로 묶어, 그중 하나만 선택되게 하는 그룹입니다.
한눈에 보기
- 분류
- 복합 위젯
- 대응 HTML
- 같은
name의<input type="radio">를 감싼<fieldset>(역할은group) - 이름 정하는 방법
- 작성자
- 이름 필수
- 예
- 필수 상위 요소
- 없음
- 필수 하위 요소
radio
설명
radiogroup은 radio를 담는 묶음으로, 필수 하위 요소는 radio입니다. 이름이 필수이며 보통 질문 텍스트를 aria-labelledby로 가리킵니다. 화면낭독기는 묶음에 들어갈 때 그룹 이름을 읽고, 각 라디오의 위치(“3개 중 1번째”)를 알려 줍니다.
그룹 수준 상태도 여기에 붙입니다.
aria-required="true"— 하나를 꼭 골라야 함(개별 라디오가 아니라 그룹에 붙입니다).aria-invalid+aria-errormessage— 선택하지 않고 제출했을 때의 오류.aria-readonly,aria-disabled— 바꿀 수 없음 / 사용할 수 없음.
HTML에서는 <fieldset>+<legend>가 같은 역할을 합니다. 엄밀히 fieldset의 역할은 group이지만, 같은 name의 라디오가 브라우저 수준에서 묶여 키보드·위치 정보가 모두 처리되므로 따로 radiogroup을 붙일 필요가 없습니다.
로빙 tabindex 또는 aria-activedescendant
APG에는 두 가지 구현 예제가 있습니다. 라디오에 직접 포커스를 옮기는 로빙 tabindex 방식(선택된 라디오만 tabindex="0")과, 그룹에 포커스를 두고 aria-activedescendant로 현재 라디오를 가리키는 방식입니다. 대부분의 경우 로빙 tabindex가 더 단순합니다.
테스터 관점
- 그룹 이름(질문)이 읽히는지, 필수 여부가 전달되는지 확인합니다.
- Tab 한 번으로 그룹에 들어가고 나오는지, 방향키가 선택을 옮기는지 확인합니다.
함께 쓰는 속성
지원 속성
aria-activedescendantaria-disabledaria-errormessagearia-invalidaria-orientationaria-readonlyaria-required전역 속성(이름·설명 등)은 모든 역할에 쓸 수 있어 생략했습니다.
키보드 동작
| 키 | 동작 |
|---|---|
| Tab | 그룹으로 들어오면 선택된 라디오로(없으면 첫 라디오로) 포커스가 갑니다. 다시 누르면 그룹 밖으로 나갑니다. |
| Space | 포커스된 라디오가 선택되어 있지 않으면 선택합니다. |
| → | 다음 라디오로 이동해 선택합니다(끝에서 처음으로 순환). ↓도 같습니다. |
| ← | 이전 라디오로 이동해 선택합니다(처음에서 끝으로 순환). ↑도 같습니다. |
사용 예
네이티브 그룹
<fieldset>
<legend>결제 수단 <span aria-hidden="true">*</span></legend>
<label><input type="radio" name="pay" required> 카드</label>
<label><input type="radio" name="pay"> 계좌 이체</label>
</fieldset>ARIA 라디오 그룹 (필수·오류)
<div role="radiogroup" aria-labelledby="pay-q" aria-required="true"
aria-invalid="true" aria-errormessage="pay-err">
<p id="pay-q">결제 수단</p>
<div role="radio" aria-checked="false" tabindex="0">카드</div>
<div role="radio" aria-checked="false" tabindex="-1">계좌 이체</div>
</div>
<p id="pay-err">결제 수단을 선택하세요.</p>이름 없는 그룹
<p>결제 수단</p>
<div role="radiogroup"> <!-- 질문과 연결되지 않아 “그룹”으로만 읽힙니다 -->
...
</div>직접 해 보기
Tab으로 그룹에 들어가 방향키로 선택을 옮겨 보세요. 아무것도 고르지 않고 “다음”을 누르면 그룹에 aria-invalid="true"와 오류 메시지가 연결됩니다.
결제 수단 (필수)
결제 수단을 선택하세요.
실시간 코드 — 조작하면 속성 값이 바뀌는 모습을 볼 수 있습니다
화면낭독기에서는
| 상황 | 들리는 안내 (예) |
|---|---|
| 그룹으로 이동 | 결제 수단 (필수), 라디오 그룹, 필수, 신용·체크카드, 라디오 버튼, 체크 안 됨, 1/3 |
| 오류 상태에서 그룹으로 이동 | 결제 수단 (필수), 라디오 그룹, 유효하지 않은 항목, 결제 수단을 선택하세요. |
사용 지침
이렇게 쓰세요
- 그룹에 이름을 붙입니다(질문 텍스트를
aria-labelledby로). - 필수·오류 상태는 개별 라디오가 아니라 그룹에 붙입니다.
- 가능하면
<fieldset>+<legend>와 네이티브 라디오를 씁니다.
이렇게 쓰지 마세요
- 라디오가 아닌 요소(버튼, 링크)를 넣지 않습니다.
- 그룹 안 모든 라디오를 탭 순서에 넣지 않습니다.
관련 역할·패턴
이 역할을 쓰는 패턴