ARIA 접근성 가이드

상태 · 위젯 상태

aria-expanded

버튼 등이 제어하는 영역이 펼쳐졌는지 접혔는지 알립니다.

기초

한눈에 보기

구분
상태 (State)
분류
위젯 상태
값 형식
true / false / undefined
기본값
undefined
적용 범위
특정 역할에만 사용
HTML 대체
<details>·<summary>의 open 상태, popovertarget 버튼의 팝오버 열림 상태

설명

aria-expanded는 요소가 펼치고 접는 대상을 가지고 있으며, 그 대상이 지금 펼쳐져 있는지(true) 접혀 있는지(false)를 알립니다. 화면낭독기는 “확장됨”, “축소됨”으로 읽어, 사용자가 버튼을 누르기 전에 무엇이 일어날지, 누른 뒤 무엇이 바뀌었는지 알 수 있게 합니다.

디스클로저(펼침 버튼), 아코디언 헤더 버튼, 드롭다운 메뉴를 여는 메뉴 버튼, 콤보 상자(목록이 열렸는지), 트리 항목(하위 항목이 펼쳐졌는지), 모바일 햄버거 메뉴 버튼에 씁니다. 값은 펼쳐지는 영역이 아니라 그 영역을 여닫는 요소(보통 버튼)에 붙입니다. 영역과의 연결은 aria-controls로 표현할 수 있지만, 화면낭독기 지원이 고르지 않아 펼쳐지는 영역을 버튼 바로 뒤에 두는 것이 가장 확실합니다.

펼침 여부가 의미 없는 요소에는 속성을 생략합니다(undefined). 접힌 상태를 나타내려고 속성을 지우면 화면낭독기는 “펼칠 수 있는 요소”라는 정보 자체를 잃으므로, 접힌 상태는 반드시 "false"로 명시합니다. 또한 버튼 텍스트를 “열기/닫기”로 바꾸면서 aria-expanded도 같이 쓰면 “닫기, 버튼, 확장됨”처럼 정보가 중복되므로, 이름은 고정하고 상태만 바꾸는 것이 좋습니다.

WAI-ARIA 1.2에서 쓸 수 있는 역할은 button, combobox, link, menuitem, tab, treeitem, row, gridcell, listbox, checkbox, application, rowheader 등입니다. 역할 없는 <div>에 붙이면 무시됩니다.

테스트할 때는 Enter·Space로 펼치고 접을 때마다 값이 실제 화면 상태와 함께 바뀌는지, 페이지 첫 로드 때 초기값이 화면 상태와 맞는지, 접힌 영역의 내용이 hidden 등으로 실제로 숨겨지는지(포커스가 들어가지 않는지) 확인합니다.

값

값
값의미
true제어하는 영역이 펼쳐져 있습니다.
false제어하는 영역이 접혀 있습니다.
undefined 기본값펼치거나 접을 수 있는 요소가 아닙니다.

사용 예

디스클로저 버튼

권장HTML
<button type="button" aria-expanded="false" aria-controls="ship-info">배송 안내</button>
<div id="ship-info" hidden>주문 후 2~3일 안에 도착합니다.</div>

상태 바꾸기

JavaScript
btn.addEventListener('click', function () {
  var open = btn.getAttribute('aria-expanded') !== 'true';
  btn.setAttribute('aria-expanded', String(open));
  panel.hidden = !open;
});

네이티브 대안

HTML
<details>
  <summary>배송 안내</summary>
  <p>주문 후 2~3일 안에 도착합니다.</p>
</details>

<summary>는 펼침 상태가 자동으로 전달되므로 aria-expanded가 필요 없습니다.

펼쳐지는 영역에 붙인 경우 (비권장)

비권장HTML
<button type="button">배송 안내</button>
<div id="ship-info" aria-expanded="true">주문 후 2~3일 안에 도착합니다.</div>

사용자가 조작하는 버튼에서 상태를 알 수 없습니다. 속성은 버튼에 붙입니다.

직접 해 보기

버튼을 클릭하거나 Tab으로 이동해 Enter·Space를 눌러 보세요. 아래 실시간 코드에서 값이 바뀝니다.

화면낭독기에서는

화면낭독기 안내 예시 (표현은 화면낭독기·브라우저·버전에 따라 조금씩 다릅니다)
상황들리는 안내 (예)
접힌 버튼에 포커스배송 안내, 버튼, 축소됨
Enter를 눌러 펼침확장됨
콤보 상자의 목록이 열림도시, 콤보 상자, 확장됨

사용 지침

이렇게 쓰세요

  • 펼치고 접을 때마다 값을 실제 화면 상태와 함께 바꿉니다.
  • 접힌 상태는 속성을 지우지 말고 "false"로 명시합니다.
  • 펼쳐지는 영역은 DOM에서 버튼 바로 뒤에 두어 자연스럽게 이어 읽히게 합니다.
  • 버튼 이름은 고정하고 상태만 바꿉니다.

이렇게 쓰지 마세요

  • 펼쳐지는 영역(패널)에 붙이지 않습니다. 여닫는 버튼에 붙입니다.
  • 역할 없는 <div>·<span>에 붙이지 않습니다.
  • 항상 펼쳐져 있는 요소나 펼침과 관계없는 링크에 붙이지 않습니다.
  • 대화상자를 여는 버튼의 상태를 대화상자가 닫힌 뒤에도 true로 남겨 두지 않습니다.

사용할 수 있는 역할

이 속성을 쓰는 패턴

참고 자료