Skip to content

Commit 7614cea

Browse files
committed
docs: fix spacing errors in a11y korean documentation
1 parent baa179e commit 7614cea

File tree

6 files changed

+45
-20
lines changed

6 files changed

+45
-20
lines changed

fundamentals/a11y/eslint/rules.md

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ yarn add -D eslint-plugin-jsx-a11y
1616

1717
:::tabs key:bundler-object-entry
1818
== flat config
19+
1920
```js
2021
import jsxA11y from 'eslint-plugin-jsx-a11y';
2122

@@ -28,7 +29,9 @@ export default [
2829
}
2930
];
3031
```
32+
3133
== legacy config
34+
3235
```json
3336
{
3437
"plugins": ["jsx-a11y"],
@@ -40,8 +43,8 @@ export default [
4043
}
4144
}
4245
```
43-
:::
4446

47+
:::
4548

4649
## 2. 주요 규칙 소개 및 해결 방법
4750

@@ -52,13 +55,15 @@ export default [
5255
#### 링크에 이미지만 있을 때
5356

5457
**❌ 잘못된 예시**
58+
5559
```jsx
5660
<a href="/home">
5761
<img src="home.svg" />
5862
</a>
5963
```
6064

6165
**✅ 올바른 예시**
66+
6267
```jsx
6368
<a href="/home">
6469
<img src="home.svg" alt="" />
@@ -68,18 +73,21 @@ export default [
6873
#### 정보를 전달하지 않는 이미지
6974

7075
**❌ 잘못된 예시**
76+
7177
```jsx
7278
<img src="divider.png" alt="구분선" />
7379
```
7480

7581
**✅ 올바른 예시**
82+
7683
```jsx
7784
<img src="divider.png" alt="" />
7885
```
7986

8087
#### 텍스트와 함께 있는 아이콘
8188

8289
**❌ 잘못된 예시**
90+
8391
```jsx
8492
<button>
8593
<img src="trash-icon.svg" alt="삭제 아이콘" />
@@ -88,6 +96,7 @@ export default [
8896
```
8997

9098
**✅ 올바른 예시**
99+
91100
```jsx
92101
<button>
93102
<img src="trash-icon.svg" alt="" />
@@ -103,6 +112,7 @@ export default [
103112

104113
:::tabs key:bundler-object-entry
105114
== flat config
115+
106116
```js{7}
107117
import jsxA11y from 'eslint-plugin-jsx-a11y';
108118
@@ -115,7 +125,9 @@ export default [
115125
}
116126
];
117127
```
128+
118129
== legacy config
130+
119131
```js{7}
120132
{
121133
"plugins": ["jsx-a11y"],
@@ -127,18 +139,21 @@ export default [
127139
}
128140
}
129141
```
142+
130143
:::
131144

132145
#### 아이콘 버튼에 레이블이 없는 경우
133146

134147
**❌ 잘못된 예시**
148+
135149
```jsx
136150
<button>
137151
<img src="close.svg" alt="" />
138152
</button>
139153
```
140154

141155
**✅ 올바른 예시**
156+
142157
```jsx
143158
<button aria-label="닫기">
144159
<img src="close.svg" alt="" />
@@ -154,6 +169,7 @@ export default [
154169
인터랙티브 요소가 아닌 (`<div>`, `<span>` 등)에 클릭 이벤트 핸들러를 추가할 때는 반드시 `role` 속성 등으로 상호작용 요소임을 명시해야 해요.
155170

156171
::: details 인터랙티브 요소 목록
172+
157173
| 요소 | 조건 |
158174
|------|------|
159175
| `<a>` | - |
@@ -174,36 +190,42 @@ export default [
174190
:::
175191

176192
::: info 왜 `role` 속성이 없는 비상호작용 요소에 클릭 이벤트 핸들러를 추가할 수 없나요?
177-
비상호작용 요소에 클릭 이벤트 핸들러를 추가하면, 스크린 리더 등 보조기기가 해당 요소를 인식하지 못해 스크린 리더, 키보드 사용자 등에게 혼란을 줄 수 있어요.
193+
비상호작용 요소에 클릭 이벤트 핸들러를 추가하면, 스크린 리더 등 보조 기기가 해당 요소를 인식하지 못해 스크린 리더, 키보드 사용자 등에게 혼란을 줄 수 있어요.
178194
:::
179195

180196
**❌ 잘못된 예시**
197+
181198
```jsx
182199
<div onClick={handleClick}>클릭</div>
183200
```
184201

185202
**✅ 올바른 예시**
203+
186204
```jsx
187205
<div role="button" tabIndex={0} onClick={handleClick}>클릭</div>
188206
```
189207

190208
### no-noninteractive-element-to-interactive-role
209+
191210
`<main>`, `<area>`, `<h1>`, `<h2>`, `<img>`, `<li>`, `<ul>`, `<ol>` 등 의미 있는 컨테이너 요소에는 `button`, `link` 와 같은 상호작용 역할(interactive role)을 부여하면 안 돼요. 의미에 맞는 태그를 사용해야 해요.
192211

193212
**❌ 잘못된 예시**
213+
194214
```jsx
195215
<main role="button" onClick={handleClick}>저장</main>
196216
<ul role="button" onClick={handleClick}>리스트</ul>
197217
<img role="button" onClick={handleClick} src="foo.png" />
198218
```
199219

200220
**✅ 올바른 예시**
221+
201222
```jsx
202223
<button onClick={handleClick}>저장</button>
203224
<a href="/list">리스트</a>
204225
```
205226

206227
### no-noninteractive-tabindex
228+
207229
비상호작용 요소에 `tabIndex` 를 부여하면 경고가 발생해요. `tabIndex` 는 상호작용 요소에만 사용해야 해요. 불필요하면 제거하거나 적절한 상호작용 이벤트를 추가해 줘야 해요.
208230

209231
::: info 상호작용 요소에만 tabIndex를 부여해야하는 이유
@@ -218,11 +240,13 @@ export default [
218240
:::
219241

220242
**❌ 잘못된 예시**
243+
221244
```jsx
222245
<div tabIndex={0}>텍스트</div>
223246
```
224247

225248
**✅ 올바른 예시**
249+
226250
```jsx
227251
<span>텍스트</span>
228252
// 또는
@@ -234,15 +258,17 @@ export default [
234258
`tabIndex`에 1 이상의 값을 쓰면 DOM 순서와 다르게 포커스가 이동해서 동작을 예측하기 어려워져요. `0` 이나 `-1` 만 사용해야 해요.
235259

236260
**❌ 잘못된 예시**
261+
237262
```jsx
238263
<button tabIndex={2}>확인</button>
239264
```
240265

241266
**✅ 올바른 예시**
267+
242268
```jsx
243269
<button tabIndex={0}>확인</button>
244270
```
245271

246272
---
247273

248-
더 많은 규칙과 예시는 공식 문서를 참고해 주세요: [eslint-plugin-jsx-a11y](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y)
274+
더 많은 규칙과 예시는 공식 문서를 참고해 주세요: [eslint-plugin-jsx-a11y](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y)

fundamentals/a11y/overview.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@
99
## 이런 분들께 추천해요
1010

1111
- 🎯 무심코 짠 코드가 누군가에겐 큰 장벽이 될 수 있다는 사실을 깨달은 개발자
12-
- 🔍 '접근성을 고려해야 해요'라는 말은 많이 들었지만, 어디서부터 시작 해야 할지 감이 안 오는 개발자
13-
- 👀 '스크린 리더', '키보드 탐색', 'ARIA' 등 용어는 들어봤지만 실무에 적용해본 적 없는 개발자
14-
- 🧩 HTML 구조 문제로 인해 자동화 테스트가 실패하거나 외부 라이브러리 연동이 안 되는 경험이 있는 개발자
12+
- 🔍 '접근성을 고려해야 해요'라는 말은 많이 들었지만, 어디서부터 시작해야 할지 감이 안 오는 개발자
13+
- 👀 '스크린 리더', '키보드 탐색', 'ARIA' 등 용어는 들어봤지만 실무에 적용해 본 적 없는 개발자
14+
- 🧩 HTML 구조 문제로 인해 자동화 테스트가 실패하거나 외부 라이브러리 연동이 안 되는 경험이 있는 개발자

fundamentals/a11y/playground.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import ScreenReaderExperience from './components/ScreenReaderExperience.vue';
1212

1313
시각장애인이 모바일을 어떻게 사용하는지 직접 체험해 보세요. 아래 "시작하기" 버튼을 누르면 스크린리더 사용자처럼 화면을 보지 않고 소리로만 토스의 송금 서비스를 경험할 수 있어요.
1414

15-
PC에서는 마우스 클릭과 드래그로 터치 동작을 대신할 수 있어요. 어둠 뿐인 화면이 처음에는 낯설 수 있지만, 소리에 귀 기울이며 천천히 따라해 보세요.
15+
PC에서는 마우스 클릭과 드래그로 터치 동작을 대신할 수 있어요. 어둠뿐인 화면이 처음에는 낯설 수 있지만, 소리에 귀 기울이며 천천히 따라 해 보세요.
1616

1717
<ScreenReaderExperience
1818
url="https://service.toss.im/accessibility/screen-reader-experience"
@@ -24,7 +24,7 @@ PC에서는 마우스 클릭과 드래그로 터치 동작을 대신할 수 있
2424
아래 순서대로 이벤트에 참여하고 상품을 받아보세요! 30일 뒤인 9월 10일에 추첨을 통해 상품을 드립니다.
2525

2626
1. 체험하기 버튼을 눌러 스크린리더 체험을 시작해요.
27-
2. 송금하기 미션을 성공하면, 체험완료 화면을 스크린샷으로 찍어요.
27+
2. 송금하기 미션을 성공하면, 체험 완료 화면을 스크린샷으로 찍어요.
2828
3. 찍은 스크린샷을 이 페이지의 댓글로 올려주세요.
2929

3030
🎁 당첨 안내는 GitHub에 등록된 이메일을 통해 개별로 안내를 보내드려요.

fundamentals/a11y/semantic/required-label.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
인터랙티브 요소(입력 필드, 버튼, 선택 상자 등)에는 반드시 사용자에게 그 목적을 명확히 알려주는 이름이 필요해요. 이름이 없거나 불명확한 요소는 스크린 리더 사용자나 음성 지원 사용자에게 큰 불편을 줄 수 있어요.
44

55
::: details 인터랙티브 요소 목록
6+
67
| 요소 | 조건 |
78
|------|------|
89
| `<a>` | - |
@@ -22,7 +23,7 @@
2223
| `<video>` | `controls` 속성이 있는 경우 |
2324
:::
2425

25-
인터랙티브 요소에 이름을 붙이는 방법은 여러가지가 있는데요. 스크린 리더는 다음 순서대로 이름을 읽습니다:
26+
인터랙티브 요소에 이름을 붙이는 방법은 여러 가지가 있는데요. 스크린 리더는 다음 순서대로 이름을 읽습니다:
2627

2728
1. `aria-labelledby` - 스크린 리더가 가장 먼저 읽는 속성
2829
2. `aria-label` - `aria-labelledby`가 없을 경우 읽는 속성
@@ -63,7 +64,7 @@ HTML에서 가장 좋은 방법은 `<label>` 요소를 사용해 입력 필드
6364
<input id="user-name" type="text" />
6465
```
6566

66-
레이블의 장점은 여러가지가 있어요.
67+
레이블의 장점은 여러 가지가 있어요.
6768

6869
먼저, 스크린 리더 사용자에게 입력 필드의 목적을 분명히 알려줘요. 또 레이블을 클릭해도 연결된 입력 필드에 포커스가 가서, 터치 인터페이스에서 특히 유용해요. 필드에 입력 중에도 항상 표시되어 사용자가 필드 목적을 기억할 수 있고요. 모든 사용자에게 가장 명확한 경험을 제공하는 방식이죠.
6970

@@ -137,7 +138,7 @@ HTML에서 가장 좋은 방법은 `<label>` 요소를 사용해 입력 필드
137138

138139
### 플레이스 홀더의 올바른 사용법
139140

140-
플레이스 홀더만으로는 접근성을 보장할 수 없어요. 플레이스 홀더를 사용할 때는 레이블의 대체재가 아니라 보조 수단이라는 점을 기억해 주세요. 입력 형식에 대한 힌트를 제공하는 용도로 사용하는 것이 좋아요.
141+
플레이스 홀더만으로는 접근성을 보장할 수 없어요. 플레이스 홀더를 사용할 때는 레이블의 대체재가 아니라 보조 수단이라는 점을 기억해 주세요. 입력 형식에 대한 힌트를 제공하는 용도로 사용하는 것이 좋아요.
141142

142143
#### ❌ 잘못된 예시: 플레이스 홀더만 사용
143144

@@ -157,4 +158,4 @@ HTML에서 가장 좋은 방법은 `<label>` 요소를 사용해 입력 필드
157158
type="email"
158159
placeholder="example@email.com"
159160
/>
160-
```
161+
```

fundamentals/a11y/structure/button-inside-button.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
다음과 같이 `<a>` 태그 안에 `<button>` 을 출력하는 컴포넌트를 넣는 것은 잘못된 방법이에요. HTML에서는 상호작용하는 요소 안에 또 다른 상호작용 요소를 넣는 걸 허용하지 않기 때문이에요[^1]. 이런 구조에서는 접근성에 문제가 생기고, 브라우저에서 예측하지 못한 동작이 생길 수 있어요.
1010

11-
[^1]: https://www.w3.org/TR/2011/WD-html5-20110405/text-level-semantics.html#the-a-element 의 Content model 항목을 참고해주세요.
11+
[^1]: <https://www.w3.org/TR/2011/WD-html5-20110405/text-level-semantics.html#the-a-element> 의 Content model 항목을 참고해 주세요.
1212

1313
```jsx
1414
<a href="/go-to">
@@ -77,11 +77,12 @@ UI 구성상 다음과 같이 버튼처럼 보이는 카드 안에 또 다른
7777
outline: 2px solid blue;
7878
}
7979
```
80+
8081
:::
8182

8283
## 이런 구조가 왜 문제가 될까요?
8384

84-
왜 버튼 안에 버튼을 넣으면 안되는지 자세히 설명해 드릴게요.
85+
왜 버튼 안에 버튼을 넣으면 안 되는지 자세히 설명해 드릴게요.
8586

8687
### 접근성 관점에서의 문제
8788

@@ -122,5 +123,3 @@ UI 구성상 다음과 같이 버튼처럼 보이는 카드 안에 또 다른
122123
| `<select>` | - |
123124
| `<textarea>` | - |
124125
| `<video>` | controls 속성이 있는 경우 |
125-
126-

fundamentals/a11y/why.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@
44

55
## 장애인에게 필요한 이유
66

7-
버튼의 색상, 아이콘 형태, 레이아웃 배치, 차트나 이미지 같은 웹 상의 시각적 정보를 볼 수 없는 사용자는 어떻게 웹사이트를 이용할까요? 바로 스크린리더 같은 보조기기를 사용합니다. 이때, 올바른 역할(`role`), 레이블(`label`), 대체 텍스트(`alt`) 같은 접근성 속성이 제공되지 않으면 원하는 정보를 얻지 못하거나, 버튼·링크 같은 상호작용 요소를 놓쳐 웹사이트 사용에 큰 불편을 겪게 돼요.
8-
7+
버튼의 색상, 아이콘 형태, 레이아웃 배치, 차트나 이미지 같은 웹 상의 시각적 정보를 볼 수 없는 사용자는 어떻게 웹사이트를 이용할까요? 바로 스크린리더 같은 보조 기기를 사용합니다. 이때, 올바른 역할(`role`), 레이블(`label`), 대체 텍스트(`alt`) 같은 접근성 속성이 제공되지 않으면 원하는 정보를 얻지 못하거나, 버튼·링크 같은 상호작용 요소를 놓쳐 웹사이트 사용에 큰 불편을 겪게 돼요.
8+
99
예를 들어, 단순히 클릭 이벤트만 달아둔 `<div>` 는 스크린리더에서 버튼 요소로 인식되지 않아서 사용자가 해당 기능을 사용할 수 없어요.
1010

1111
## 일반 사용자에게도 유용한 이유
1212

1313
접근성을 지키면 장애가 없는 일반 사용자도 웹을 더 빠르고 편리하게 이용할 수 있어요. 익숙한 웹 동작이 자연스럽게 제공되기 때문이에요.
1414

1515
예를 들어, 링크(`<a>`)를 제대로 사용하면 마우스 오른쪽 버튼으로 '새 창에서 열기', '링크 복사'와 같은 동작을 할 수 있어요. 하지만 단순히 `<div>``<span>`에 클릭 이벤트만 넣으면 이런 기본 기능을 사용할 수 없어요. 또, 폼을 만들 때 올바른 `<form>` 태그와 `<input>`, `<button type="submit">`을 사용하면 사용자가 Enter 키를 눌러 폼을 제출할 수 있어요. 하지만 그렇지 않으면 사용자는 익숙한 동작을 기대할 수 없어요.
16-
16+
1717
또, 키보드를 주로 사용하는 사용자는 Tab 키와 Shift+Tab, Enter, Space, 방향키 등으로 웹사이트를 탐색해요. 버튼이나 링크, 폼 요소에 올바른 역할과 포커스가 지정되어 있지 않으면, 키보드로는 해당 기능을 사용할 수 없어요.
1818

1919
다음 이미지는 브라우저에서 링크를 우클릭했을 때 나타나는 컨텍스트 메뉴예요. 링크 요소를 제대로 사용하면 사용자가 기대하는 이런 기본적인 기능들을 모두 사용할 수 있어요.
@@ -67,4 +67,3 @@ expect(screen.getByTestId('save-btn')).toBeInTheDocument();
6767
```
6868

6969
즉, 접근성은 사용자 모두를 위한 것이면서, 개발자에게도 더 견고하고 유지보수하기 쉬운 코드를 만들 수 있게 도와줘요.
70-

0 commit comments

Comments
 (0)