역할 · 위젯
role="checkbox"
선택됨(true), 선택 안 됨(false), 일부 선택(mixed) 상태를 가지는 체크박스입니다.
한눈에 보기
- 분류
- 위젯
- 대응 HTML
<input type="checkbox">(혼합 상태는indeterminate속성)- 이름 정하는 방법
- 콘텐츠, 작성자
- 이름 필수
- 예
- 필수 상위 요소
- 없음
- 필수 하위 요소
- 없음
설명
checkbox는 각각 독립적으로 켜고 끌 수 있는 선택 항목입니다. 여러 개 중 하나만 고르는 경우에는 radio를 씁니다. 현재 상태는 필수 속성 aria-checked로 알립니다.
aria-checked | 의미 |
|---|---|
true | 선택됨 |
false | 선택 안 됨 |
mixed | 일부 선택. 하위 체크박스 중 일부만 선택된 “전체 선택” 체크박스에 씁니다. |
HTML <input type="checkbox">는 상태 관리, Space 토글, <label> 연결, 폼 제출, required 검증까지 제공합니다. 디자인 때문에 직접 만들어야 한다면 네이티브 체크박스를 시각적으로만 숨기고 스타일을 입히는 방법이 더 안전합니다. 혼합 상태도 HTML에서 input.indeterminate = true로 표현할 수 있고, 브라우저가 이를 mixed로 보조기술에 전달합니다.
체크박스는 Enter로 바뀌지 않습니다
APG 기준으로 체크박스의 토글 키는 Space입니다. 네이티브 체크박스도 Enter로는 바뀌지 않고, 폼 안에서는 Enter가 폼 제출을 일으킬 수 있습니다. 직접 만든 체크박스도 이 관례를 따릅니다.
그룹으로 묶기
관련된 체크박스 여러 개는 <fieldset>+<legend> 또는 role="group"+aria-labelledby로 묶어 질문(그룹 이름)을 함께 전달합니다.
테스터 관점
- Space로 상태가 바뀌고, 바뀐 상태가 즉시 읽히는지 확인합니다.
- 화면의 체크 표시와
aria-checked값이 항상 일치하는지 확인합니다. - 라벨 텍스트를 클릭해도 토글되는지(네이티브 +
<label>) 확인합니다.
함께 쓰는 속성
필수 속성
지원 속성
전역 속성(이름·설명 등)은 모든 역할에 쓸 수 있어 생략했습니다.
키보드 동작
| 키 | 동작 |
|---|---|
| Space | 체크박스 상태를 바꿉니다. 혼합 상태 체크박스는 APG 예제 기준으로 혼합 → 모두 선택 → 모두 해제 → (원래 일부 선택 상태) 순서로 바뀝니다. |
| Tab | 다음 체크박스나 다음 포커스 요소로 이동합니다. 체크박스 하나하나가 탭 순서에 들어갑니다. |
사용 예
네이티브 체크박스
<input type="checkbox" id="agree">
<label for="agree">이용 약관에 동의합니다</label>직접 만든 체크박스
역할, 상태, 포커스, 이름, 키보드 처리를 모두 갖춰야 합니다.
<span role="checkbox" aria-checked="false" tabindex="0"
aria-labelledby="news-label"></span>
<span id="news-label">뉴스레터 받기</span>상태 바꾸기 (혼합 상태 포함)
function setParent(parent, children) {
var on = children.filter(function (c) { return c.getAttribute('aria-checked') === 'true'; }).length;
parent.setAttribute('aria-checked',
on === 0 ? 'false' : on === children.length ? 'true' : 'mixed');
}
box.addEventListener('keydown', function (e) {
if (e.key === ' ') { e.preventDefault(); toggle(box); }
});상태를 클래스로만 표시하는 실수
<div class="checkbox is-checked" onclick="toggle(this)">알림 받기</div>
<!-- 역할·상태·포커스가 없어 “알림 받기” 텍스트로만 읽힙니다 -->직접 해 보기
“모두 선택” 체크박스는 아래 세 항목의 상태에 따라 true · false · mixed로 바뀝니다. Tab으로 이동하고 Space로 바꿔 보세요.
피자 토핑
- 치즈
- 버섯
- 올리브
실시간 코드 — 조작하면 속성 값이 바뀌는 모습을 볼 수 있습니다
화면낭독기에서는
| 상황 | 들리는 안내 (예) |
|---|---|
| 선택 안 된 체크박스에 포커스 | 버섯, 체크 박스, 체크 안 됨 |
| Space로 선택 | 체크됨 |
| 일부 선택된 “모두 선택”에 포커스 | 모두 선택, 체크 박스, 부분 체크됨 |
| 그룹 안으로 처음 이동 | 피자 토핑, 그룹, 모두 선택, 체크 박스, 부분 체크됨 |
사용 지침
이렇게 쓰세요
- 가능하면
<input type="checkbox">와<label>을 씁니다. - 직접 만들면
aria-checked를 항상true/false/mixed중 하나로 명시합니다. - “모두 선택” 체크박스는 하위 항목 상태에 맞춰
mixed를 갱신합니다. - 관련 체크박스는 그룹으로 묶고 그룹 이름을 붙입니다.
이렇게 쓰지 마세요
- 하나만 고를 수 있는 선택지에 체크박스를 쓰지 않습니다. 라디오 버튼을 씁니다.
- 즉시 설정이 적용되는 켜기/끄기에는 체크박스보다 스위치가 더 적합할 수 있습니다. 의미를 구분해 고릅니다.
- 체크 표시를 CSS 가상 요소의 텍스트(예:
content:"✓")로 넣지 않습니다. 이름에 섞여 읽힐 수 있습니다.
관련 역할·패턴
이 역할을 쓰는 패턴