| name | good-a11y |
| description | Use when writing or modifying UI components, interactive elements, forms, or any HTML structure - before finalizing markup |
Accessibility (a11y)
์ ๊ทผ์ฑ์ ์ฅ์ ์ฌ์ฉ์๋ฟ ์๋๋ผ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ํ์ํ ๊ธฐ๋ฐ์ด๋ค. ์๋งจํฑ HTML์ด ์ ๊ฐ์ถฐ์ ธ์ผ ํค๋ณด๋ ํ์, ์ฐํด๋ฆญ ๋ฉ๋ด, Enter ์ ์ถ ๊ฐ์ ๊ธฐ๋ณธ ๋์๋ ์ ๋๋ก ์๋ํ๋ค.
4๊ฐ์ง ์์น
1. ์ฌ๋ฐ๋ฅธ ๊ตฌ์กฐ
HTML ์์๋ฅผ ์๋ฏธ์ ๋ง๊ฒ ๋ฐฐ์นํ๊ณ ์ค์ฒฉํ๋ ๊ฒ์ด ์ ๊ทผ์ฑ์ ์์์ด๋ค.
- ๋ฒํผ ์์ ๋ฒํผ,
<main> ์์ role="button" ๋ฑ ์๋ชป๋ ์ค์ฒฉ ๊ธ์ง
<div>์ ํด๋ฆญ ํธ๋ค๋ฌ๋ฅผ ๋ฌ๋ ค๋ฉด ๋ฐ๋์ role ๋ช
์
- ํ
์ด๋ธ ํ ์ ์ฒด๋ฅผ ํด๋ฆญ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค ๋ ๊ตฌ์กฐ ์ฃผ์
<div onClick={handleClick}>ํด๋ฆญ</div>
<div role="button" tabIndex={0} onClick={handleClick}>ํด๋ฆญ</div>
<button onClick={handleClick}>ํด๋ฆญ</button>
2. ์๋ฏธ ์ ๋ฌ
์ฌ์ฉ์๊ฐ ์์์ ๋ชฉ์ ๊ณผ ๊ธฐ๋ฅ์ ๋ช
ํํ ์ ์ ์์ด์ผ ํ๋ค.
<button><img src="close.svg" alt="" /></button>
<button aria-label="๋ซ๊ธฐ"><img src="close.svg" alt="" /></button>
<img src="home.svg" />
<img src="home.svg" alt="ํ" />
3. ์์ธก ๊ฐ๋ฅํ ์ธํฐ๋์
์๊ฐ์ ์ผ๋ก ๋ณด์ด๋ ๋ชจ์ต๊ณผ ์ค์ ๋์์ด ์ผ์นํด์ผ ํ๋ค.
- ํผ ์
๋ ฅ์
<form>์ผ๋ก ๊ฐ์ธ์ผ Enter ์ ์ถ์ด ๋์ํจ
<a> ํ๊ทธ๋ฅผ ์จ์ผ ์ฐํด๋ฆญ โ ์ ํญ์ผ๋ก ์ด๊ธฐ๊ฐ ๋์ํจ
<input>์ ๋ฐ๋์ <label>๊ณผ ์ฐ๊ฒฐ
<div>
<input type="text" />
<button onClick={submit}>์ ์ถ</button>
</div>
<form onSubmit={submit}>
<label htmlFor="name">์ด๋ฆ</label>
<input id="name" type="text" />
<button type="submit">์ ์ถ</button>
</form>
4. ์๊ฐ ์ ๋ณด ๋ณด์
์์, ์์ด์ฝ, ์ด๋ฏธ์ง๋ง์ผ๋ก ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ฉด ์๊ฐ ์ด์์๋ ์คํฌ๋ฆฐ ๋ฆฌ๋ ์ฌ์ฉ์๊ฐ ๋์น๋ค.
- ์์์ผ๋ก๋ง ์ํ ํํ ๊ธ์ง โ ํ
์คํธ๋ ์์ด์ฝ ๋ณํ
- ์ด๋ฏธ์ง์ ์๋ฏธ๋
alt๋ก ์ค๋ช
- ์์ด์ฝ ๋ฒํผ์
aria-label ํ์
ESLint ๊ท์น (jsx-a11y)
| ๊ท์น | ๊ฒ์ฌ ๋ด์ฉ |
|---|
alt-text | <img>์ alt ํ์ |
control-has-associated-label | ์ธํฐ๋ํฐ๋ธ ์์์ ๋ ์ด๋ธ ํ์ |
no-noninteractive-element-interactions | <div> ํด๋ฆญ ์ role ํ์ |
no-noninteractive-element-to-interactive-role | <main> ๋ฑ์ role="button" ๋ถ์ฌ ๊ธ์ง |
no-noninteractive-tabindex | ์ธํฐ๋ํฐ๋ธ ์์๋ง tabIndex ํ์ฉ |
tabindex-no-positive | tabIndex๋ 0 ๋๋ -1๋ง ์ฌ์ฉ |
์ฒดํฌ๋ฆฌ์คํธ