Skip to content

Commit 6e3b98b

Browse files
committed
각종 상태 추가
1 parent cd23da4 commit 6e3b98b

File tree

1 file changed

+138
-13
lines changed

1 file changed

+138
-13
lines changed

fundamentals/a11y/basic-guide/state.md

Lines changed: 138 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,154 @@
44

55
대표적으로 `aria-checked`, `aria-disabled`, `aria-expanded`, `aria-selected` 등이 있어요.
66

7+
html 기본 요소(`<button>`, `<input>` 등)는 기본적인 일부 상태 속성(`checked`, `disabled`)이 내장돼 있지만, 기본 요소를 활용하지 않고 `<div>` 로 커스텀하게 만들 때는 상태 속성을 명시적으로 선언해야 해요.
8+
79
| 속성 | 의미 | 적용 예시 |
810
| --------------- | -------------------------------------------------------------------- | -------------------------------------------------------- |
911
| `aria-checked` | 체크 여부 | 체크박스, 스위치 |
1012
| `aria-selected` | 선택 여부 | 탭, 리스트 |
1113
| `aria-expanded` | 펼침 여부 | 아코디언, 드롭다운 |
1214
| `aria-disabled` | 비활성화 여부 | 버튼 등 |
1315
| `aria-current` | 여러 개의 같은 위계 속에서 현재 위치 여부 | 네비게이션에서 현재 페이지 표시, 달력에서 오늘 날짜 표시 |
14-
| `aria-busy` | 로딩 중 상태 | 데이터 로드 시 |
16+
| `aria-busy` | 컨텐츠 변경을 알림 상태 | 데이터 로드 시 |
1517
| `aria-live` | 현재 사용자에게 바로 전달해야하는 중요 정보가 포함된 컨텐츠 업데이트 | 에러 메세지, 알림 메세지, 로딩 |
1618

17-
아래 예시는 아코디언 컴포넌트에 상태를 전달한 예시예요.
19+
## 체크 여부
20+
21+
`aria-checked` 는 체크박스, 스위치 등 체크 여부를 나타내는 상태 속성이에요. `<input>``checked` 로, 그 외의 요소에다가는 `aria-checked`를 사용해야 해요.
22+
23+
```tsx
24+
// input 요소
25+
<label>
26+
<input type="checkbox" checked={true} />
27+
체크박스
28+
</label>
29+
30+
// input이 아닌 요소
31+
<span role="checkbox" aria-checked={true} tabIndex={0}>
32+
<img src="./toggle-icon-on.png" alt="체크박스" />
33+
</span>
34+
```
35+
36+
## 선택 여부
37+
38+
`aria-selected` 는 탭, 리스트 등 선택 여부를 나타내는 상태 속성이에요. `<option>``selected` 로, 그 외의 요소에다가는 `aria-selected`를 사용해야 해요.
1839

1940
```tsx
20-
function Accordion() {
21-
const [open, setOpen] = useState(false);
41+
// option 요소
42+
<select>
43+
<option value="1" selected>사과</option>
44+
<option value="2">딸기</option>
45+
</select>
2246

23-
return (
24-
<div>
25-
<button aria-expanded={open} onClick={() => setOpen(!open)}>
26-
{open ? "내용 접기" : "내용 보기"}
27-
</button>
28-
{open && <p>내용</p>}
29-
</div>
30-
);
31-
}
47+
// option이 아닌 요소
48+
<div role="listbox">
49+
<button role="option" aria-selected={true}>
50+
사과
51+
</button>
52+
<button role="option" aria-selected={false}>
53+
딸기
54+
</button>
55+
</div>
3256
```
57+
58+
## 펼침 여부
59+
60+
`aria-expanded` 는 아코디언, 드롭다운 등 펼침 여부를 나타내는 상태 속성이에요. `<details>``open` 으로, 그 외의 요소에다가는 `aria-expanded`를 사용해야 해요.
61+
62+
```tsx
63+
// details 요소
64+
<details open={true}>
65+
<summary>펼침</summary>
66+
<p>내용</p>
67+
</details>
68+
69+
// details가 아닌 요소
70+
<button aria-expanded={true}>
71+
펼침
72+
</button>
73+
<p hidden={false}>내용</p>
74+
```
75+
76+
## 비활성화 여부
77+
78+
`aria-disabled` 는 버튼, 링크, 스위치 등 비활성화 여부를 나타내는 상태 속성이에요. `<button>`, `<input>``disabled` 으로, 그 외의 요소에다가는 `aria-disabled`를 사용해야 해요.
79+
80+
```tsx
81+
// button 요소
82+
<button disabled={true}>
83+
비활성화
84+
</button>
85+
86+
// input 요소
87+
<input type="text" disabled={true} />
88+
89+
// input이 아닌 요소
90+
<div role="switch" aria-checked={false} aria-disabled={true} tabIndex={0}>
91+
<img src="./toggle-icon-off.png" alt="스위치" />
92+
</div>
93+
```
94+
95+
## 현재 위치 여부
96+
97+
`aria-current` 는 네비게이션에서 현재 페이지 표시, 달력에서 오늘 날짜 표시 등 현재 위치 여부를 나타내는 상태 속성이에요.
98+
99+
### 네비게이션에서 현재 페이지 표시
100+
101+
```tsx
102+
// 현재 페이지가 "홈" 일 때
103+
<nav aria-label="메뉴">
104+
<a href="/" aria-current="page">
105+
106+
</a>
107+
<a href="/about">소개</a>
108+
<a href="/contact">연락처</a>
109+
</nav>
110+
```
111+
112+
### 달력에서 오늘 날짜 표시
113+
114+
```tsx
115+
// 오늘 날짜가 "2025-11-13" 일 때
116+
<div role="listbox">
117+
<button role="option">2025-11-12</button>
118+
<button role="option" aria-current="date">
119+
2025-11-13
120+
</button>
121+
<button role="option">2025-11-14</button>
122+
</div>
123+
```
124+
125+
## 로딩 중 상태
126+
127+
`aria-busy` 는 해당 요소가 곧 있으면 컨텐츠가 변경된다는 것을 알려요. 보통 로딩 컴포넌트에서 사용해요.
128+
129+
```tsx
130+
// div 요소
131+
<div aria-busy={true}>로딩 중</div>
132+
```
133+
134+
## 중요 정보 업데이트 알림
135+
136+
`aria-live` 는 현재 사용자에게 바로 전달해야하는 중요 정보가 포함된 컨텐츠 업데이트를 나타내는 상태 속성이에요. 총 3가지 옵션이 있어요.
137+
138+
| 속성 값 | 읽는 타이밍 | 기존 읽기 흐름 | 사용자 경험 |
139+
| ----------- | --------------------------------------------------- | -------------------------- | ------------------------------------------------ |
140+
| `polite` | **현재 읽던 내용을 마친 후** 업데이트된 내용을 읽음 | 방해하지 않음 | 덜 급한 정보에 적합 (검증 메세지, 업데이트 알림) |
141+
| `assertive` | **즉시 읽기 중단 후 바로** 새로운 내용을 읽음 | 현재 읽기 중인 내용을 끊음 | 긴급한 정보에 적합 (오류 메세지, 실패 메세지) |
142+
| `off` | 컨텐츠 업데이트를 알리지 않음 | | |
143+
144+
```tsx
145+
// 입력 중 에러 메세지를 알림
146+
<input type="email" value="1234" aria-describedby="error-message" />
147+
<p id="error-message" aria-live="polite">이메일 형식이 올바르지 않습니다.</p>
148+
149+
// 오류 메세지를 알림
150+
<p aria-live="assertive">인터넷 연결이 끊어졌습니다.</p>
151+
```
152+
153+
::: tip
154+
155+
- `role="alert"` 을 사용하면 `aria-live="assertive"` 와 동일하게 동작해요
156+
- `role="status"` 를 사용하면 `aria-live="polite"` 와 동일하게 동작해요
157+
:::

0 commit comments

Comments
 (0)