역할 · 위젯
role="radio"
묶음(radiogroup) 안에서 하나만 선택되는 라디오 버튼입니다.
한눈에 보기
- 분류
- 위젯
- 대응 HTML
<input type="radio">(같은name으로 묶음)- 이름 정하는 방법
- 콘텐츠, 작성자
- 이름 필수
- 예
- 필수 상위 요소
- 없음
- 필수 하위 요소
- 없음
설명
radio는 여러 선택지 중 하나만 고르는 항목입니다. 하나를 선택하면 같은 묶음의 다른 항목은 자동으로 해제됩니다. 상태는 필수 속성 aria-checked(true/false)로 알리며, 묶음은 radiogroup으로 감쌉니다. WAI-ARIA 1.2 표에는 필수 상위 역할이 없지만, 화면낭독기가 “3개 중 1번째”처럼 위치를 알리고 그룹 이름을 읽으려면 radiogroup으로 묶어야 합니다.
HTML <input type="radio">는 같은 name끼리 자동으로 묶이고, 방향키 이동과 선택, 그룹 하나당 탭 정지 하나를 브라우저가 처리합니다. <fieldset>과 <legend>로 질문을 붙이면 됩니다.
탭 순서와 방향키
라디오 묶음은 탭 순서에서 한 번만 멈춥니다. Tab으로 들어오면 선택된 항목(없으면 첫 항목)에 포커스가 가고, 방향키로 이동하면 포커스와 함께 선택도 바뀝니다. 직접 만들 때는 로빙 tabindex(선택된 항목만 tabindex="0")로 구현합니다.
툴바 안의 라디오는 다릅니다
APG는 toolbar 안에 들어간 라디오 묶음은 툴바의 방향키 이동과 충돌하지 않도록, 방향키는 포커스만 옮기고 Space로 선택하도록 안내합니다.
테스터 관점
- Tab 한 번으로 묶음에 들어가고 한 번 더 누르면 묶음을 벗어나는지 확인합니다.
- 방향키로 이동할 때 선택이 따라 바뀌고, 처음·끝에서 순환하는지 확인합니다.
- 그룹 이름(질문)과 “n개 중 m번째”가 읽히는지 확인합니다.
함께 쓰는 속성
필수 속성
지원 속성
전역 속성(이름·설명 등)은 모든 역할에 쓸 수 있어 생략했습니다.
키보드 동작
| 키 | 동작 |
|---|---|
| Tab | 묶음 안으로 들어오면 선택된 라디오로, 선택된 것이 없으면 첫 라디오로 포커스를 옮깁니다. 한 번 더 누르면 묶음 밖으로 나갑니다. |
| Shift + Tab | 묶음 밖의 이전 요소로 이동합니다. |
| Space | 포커스된 라디오가 선택되어 있지 않으면 선택합니다. |
| → | 다음 라디오로 이동해 선택합니다. 마지막이면 첫 라디오로 순환합니다. |
| ↓ | →와 같습니다. |
| ← | 이전 라디오로 이동해 선택합니다. 첫 라디오면 마지막으로 순환합니다. |
| ↑ | ←와 같습니다. |
사용 예
네이티브 라디오 묶음
<fieldset>
<legend>배송 방법</legend>
<label><input type="radio" name="ship" value="normal" checked> 일반 배송</label>
<label><input type="radio" name="ship" value="fast"> 빠른 배송</label>
</fieldset>ARIA 라디오 묶음 (로빙 tabindex)
<div role="radiogroup" aria-labelledby="ship-q">
<p id="ship-q">배송 방법</p>
<div role="radio" aria-checked="true" tabindex="0">일반 배송</div>
<div role="radio" aria-checked="false" tabindex="-1">빠른 배송</div>
</div>선택 옮기기
function check(radio, radios) {
radios.forEach(function (r) {
var on = r === radio;
r.setAttribute('aria-checked', String(on));
r.tabIndex = on ? 0 : -1;
});
radio.focus();
}모든 라디오를 탭 순서에 넣는 실수
<div role="radio" aria-checked="true" tabindex="0">일반 배송</div>
<div role="radio" aria-checked="false" tabindex="0">빠른 배송</div>
<!-- 묶음은 탭 정지 하나여야 합니다. 나머지는 tabindex="-1" -->직접 해 보기
Tab으로 묶음에 들어가 방향키로 이동해 보세요. 포커스와 선택이 함께 옮겨지고, 선택된 항목만 tabindex="0"이 됩니다.
음료 크기
실시간 코드 — 조작하면 속성 값이 바뀌는 모습을 볼 수 있습니다
화면낭독기에서는
| 상황 | 들리는 안내 (예) |
|---|---|
| 묶음으로 처음 이동 | 음료 크기, 그룹, 작은 컵, 라디오 버튼, 체크 안 됨, 1/3 |
| ↓로 다음 항목 | 중간 컵, 라디오 버튼, 체크됨, 2/3 |
사용 지침
이렇게 쓰세요
- 가능하면
<input type="radio">와<fieldset>/<legend>를 씁니다. - 직접 만들면
radiogroup으로 묶고 그룹 이름을 붙입니다. - 묶음 안에서 선택된 항목(없으면 첫 항목)만
tabindex="0"으로 둡니다.
이렇게 쓰지 마세요
- 선택지가 하나뿐인 켜기/끄기에 라디오를 쓰지 않습니다. 체크박스나 스위치를 씁니다.
- 방향키 이동 시 선택을 바꾸지 않아 네이티브와 다르게 동작하게 만들지 않습니다(툴바 안 예외 제외).
- 선택만 바뀌어도 페이지를 이동시키는 등 예상치 못한 맥락 변화를 일으키지 않습니다(WCAG 3.2.2).
관련 역할·패턴
이 역할을 쓰는 패턴