상태 · 위젯 상태
aria-disabled
요소가 보이고 포커스도 받지만 지금은 조작할 수 없음을 알립니다.
한눈에 보기
- 구분
- 상태 (State)
- 분류
- 위젯 상태
- 값 형식
- true / false
- 기본값
false- 적용 범위
- 특정 역할에만 사용
- HTML 대체
<button>·<input>·<select>·<textarea>·<fieldset>의disabled속성
설명
aria-disabled="true"는 요소가 화면에 있고 인식할 수는 있지만 지금은 편집하거나 실행할 수 없음을 보조기술에 알립니다. 화면낭독기는 “사용 불가” 또는 “흐리게 표시됨”처럼 읽습니다.
HTML disabled 속성과 가장 큰 차이는 동작을 막지 않는다는 점입니다. disabled는 클릭을 막고 Tab 순서에서 제외하지만, aria-disabled는 상태만 알릴 뿐 포커스, 클릭, 키 입력이 모두 그대로 동작합니다. 그래서 스크립트에서 이벤트를 직접 무시해야 합니다. 반대로 이 특성 덕분에 비활성 버튼에 포커스가 머물러 “왜 누를 수 없는지” 설명(aria-describedby)을 들려줄 수 있습니다. 필수 항목을 다 채우기 전의 “다음” 버튼, 메뉴 안의 쓸 수 없는 항목(APG는 비활성 메뉴 항목도 방향키로 포커스할 수 있게 권장합니다)이 대표적인 쓰임입니다.
WAI-ARIA 1.2에서 aria-disabled는 button, link, menuitem, tab, gridcell, group, scrollbar, separator, application과 입력·복합 위젯 역할(체크 상자, 콤보 상자, 목록 상자, 라디오 그룹, 슬라이더, 텍스트 상자, 그리드, 트리 등)에서 쓸 수 있습니다. 복합 위젯이나 group에 설정하면 그 안의 하위 요소도 모두 비활성으로 간주됩니다.
전역 사용은 ARIA 1.2에서 사용 중단
WAI-ARIA 1.1까지 aria-disabled은 모든 요소에 쓸 수 있는 전역 속성이었지만, WAI-ARIA 1.2에서 전역 사용이 사용 중단(deprecated)되어 아래 “사용할 수 있는 역할”에 나열된 역할(과 그 역할을 상속하는 역할)에만 쓰도록 바뀌었습니다.
비활성 상태도 눈으로 알 수 있어야 하므로 [aria-disabled="true"] 선택자로 흐린 스타일을 주되, 텍스트 대비가 너무 낮아 읽을 수 없게 만들지는 않습니다(비활성 요소는 WCAG 1.4.3 대비 요구에서 예외이지만, 읽을 수 있으면 더 좋습니다). 테스트할 때는 키보드로 포커스한 뒤 Enter·Space를 눌러도 실제 동작이 실행되지 않는지, “사용 불가”가 읽히는지, 활성화 조건이 충족되면 속성이 제거되는지 확인합니다.
값
| 값 | 의미 |
|---|---|
true | 요소와 그 하위 요소가 비활성 상태입니다. 인식할 수 있지만 편집·실행할 수 없습니다. |
false 기본값 | 요소가 활성 상태입니다. |
사용 예
네이티브 disabled (상호작용까지 막을 때)
<button type="submit" disabled>제출</button>Tab 순서에서 빠지고 클릭도 막힙니다. 포커스할 이유가 없다면 이 방법이 가장 단순합니다.
포커스는 유지하고 이유를 알려 줄 때
<button type="button" aria-disabled="true" aria-describedby="next-hint">다음</button>
<p id="next-hint">필수 항목을 모두 입력하면 다음 단계로 넘어갈 수 있습니다.</p>이벤트를 직접 막는 스크립트
btn.addEventListener('click', function (e) {
if (btn.getAttribute('aria-disabled') === 'true') {
e.preventDefault(); // form 제출 등 기본 동작 차단
return; // 실제 동작 실행 안 함
}
goNext();
});
// 조건 충족 시
btn.removeAttribute('aria-disabled');상태만 표시하고 동작은 막지 않은 경우 (비권장)
<a href="/checkout" aria-disabled="true" class="btn is-disabled">결제하기</a>링크가 여전히 동작해 결제 페이지로 이동합니다. href를 제거하거나 클릭을 막아야 합니다.
직접 해 보기
약관 동의 전에 “가입하기”를 Tab으로 포커스하고 Enter를 눌러 보세요. 포커스는 가지만 동작하지 않고 이유를 알려 줍니다.
이용 약관에 동의해야 가입할 수 있습니다.
실시간 코드 — 조작하면 속성 값이 바뀌는 모습을 볼 수 있습니다
화면낭독기에서는
| 상황 | 들리는 안내 (예) |
|---|---|
aria-disabled="true" 버튼에 포커스 | 가입하기, 버튼, 사용 불가, 이용 약관에 동의해야 가입할 수 있습니다. |
| 조건 충족 후 같은 버튼에 포커스 | 가입하기, 버튼 |
네이티브 disabled 버튼 (Tab으로는 이동하지 않음, 가상 커서로 읽기) | 제출, 버튼, 사용 불가 |
사용 지침
이렇게 쓰세요
- 포커스는 유지하면서 사용할 수 없는 이유를 알려 주고 싶을 때 씁니다.
- 클릭·Enter·Space 등 모든 동작을 스크립트에서 직접 막습니다.
[aria-disabled="true"]로 시각적 비활성 스타일을 함께 적용합니다.- 조건이 충족되면 속성을 제거하거나
false로 바꿉니다.
이렇게 쓰지 마세요
- 속성만 붙이고 동작을 막지 않은 채로 두지 않습니다.
- 1.2에서 지원하지 않는 역할(일반 텍스트,
generic등)에 쓰지 않습니다. - 네이티브
disabled와 동시에 쓰지 않습니다. 둘 중 하나만 씁니다. - 읽기만 가능한 값 표시에 쓰지 않습니다. 값을 읽을 수 있고 바꿀 수만 없다면
aria-readonly입니다.
사용할 수 있는 역할
관련 속성·패턴
이 속성을 쓰는 패턴