Listbox
๋ ๋ค์์ ์ต์ ์ด ์๋ ๋ฆฌ์คํธ์ ์ ์ ๊ฐ ํ๊ฐ ๋๋ ํ๊ฐ ์ด์์ ์ ํ ํ ์ ์๋ ์์ ฏ- single-select listbox
- multi-select listbox
- Listbox์ ๊ฐ๊ฐ์ ์ต์ ์ ์คํฌ๋ฆฐ ๋ฆฌ๋๋ flatํ string์ผ๋ก ์ธ์ํ๊ธฐ์ ์๋ฉํฑํ ์๋ฆฌ๋จผํธ (i.e. heading)๊ฐ ์์ด๋ ์คํฌ๋ฆฐ ๋ฆฌ๋๋ ์ธ์ ๋ชปํจ
**์ฆ**, **์คํฌ๋ฆฐ ๋ฆฌ๋๊ฐ Listbox๋ฅผ ์ดํดํ๋ ๊ด์ ์ ์ผ๋ฐ์ ์ธ interactive elements๊ฐ ์๋ ๋ฆฌ์คํธ์๋ ๋ค๋ฆ**
- Grid Pattern๋ณด๋ค๋ ๋ ๊ฐ๋ตํ๊ณ ์ฌํํ ๋ฒ์ .
- ๋งํฌ, ๋ฒํผ, ์ฒดํฌ๋ฐ์ค ๋ฑ์ ์ ์ ์ธํฐ๋ ์ ์ด ์๋ ์๋ฆฌ๋จผํธ๋ฅผ ๋ด์ ๋ฆฌ์คํธ๋ฅผ ๊ตฌํํ๋ ค๋ฉด Grid Pattern์ ์ฌ์ฉ
- Listbox์ ์ต์
name(string)์ ๋๋๋ก์ด๋ฉด ์งง๊ฒ
- ์คํฌ๋ฆฐ ๋ฆฌ๋๋ ์ต์
์ ์ด๋ฆ์ ์ ์ฒด๋ฅผ ๋ค ์ฝ๊ธฐ ๋๋ฌธ์ name์ด ๊ธธ๋ฉด ์ดํด๋๊ฐ ๋จ์ด ์ง ์ ์์
- ์ค๊ฐ์ ๋ค๋ฅธ ํ๋์ผ๋ก ๋ฐฉํด ๋๋ ๊ฒฝ์ฐ ๊ธด name์ ๋ค์ ์ ์ฒด๋ฅผ ๋ค ์ฝ์ด์ผ ํ๊ธฐ์ ๋ถํธ์ฑ ์ฆ๊ฐ
- ์คํฌ๋ฆฐ ๋ฆฌ๋๋ ์ต์
์ ์ด๋ฆ์ ์ ์ฒด๋ฅผ ๋ค ์ฝ๊ธฐ ๋๋ฌธ์ name์ด ๊ธธ๋ฉด ์ดํด๋๊ฐ ๋จ์ด ์ง ์ ์์
- ๊ฐ์ ๋จ์ด๋ก ์์ํ๋ ์ต์
๋ค์ด ๋ง์ ๊ฒฝ์ฐ ์ฌ๋ฌ Listbox๋ก ๋๋๋๊ฒ ์ข์
- ์คํฌ๋ฆฐ ๋ฆฌ๋ ์ธก๋ฉด์์ ์ ๋จ์ด๊ฐ ๊ฐ์ ์ต์ ์ด ๋ง์ ๊ฒฝ์ฐ ์ต์ ์ ๋ท ๋จ์ด๊ฐ ๋ค๋ฅธ ๋ถ๋ถ์ ์ค์ ์ผ๋ก ์ ์ ๊ฐ ํ๋์ ํ๊ธฐ์ ์ฌ์ฉ์ฑ ์ ํ
aria-activedescendant*
- aria-activedescendant์ ๊ฐ์ด ๋ถ์ฌ๊ฐ ๋์ด์์ผ๋ฉด DOM ํฌ์ปค์ค๊ฐ ํด๋น ์ปจํ ์ด๋์ ๋จธ๋ฌผ๋ฌ ์์
- ์คํฌ๋ฆฐ ๋ฆฌ๋์๊ฒ ์ด๋ค ์๋ฆฌ๋จผํธ๊ฐ ํค๋ณด๋ ํฌ์ปค์ค๋ฅผ ๋ฐ๊ณ ์๋์ง ์๋ ค์ฃผ๋ ์ฉ๋
ํ์ ๊ธฐ๋ฅ (์์ง ๋ฆฌ์คํธ ๊ธฐ์ค)
- ListBox Focus๊ฐ ๋ ๋
- Single Select Listbox
- ์ต์ ์ด ์ ํ์ด ์ ๋์์ ๋์๋ ์ฒซ๋ฒ์งธ ์ต์ ํฌ์ปค์ค
- ์ต์ ์ด ์ ํ ๋ ์ํ์์ Listbox๊ฐ ํฌ์ปค์ค๊ฐ ๋๋ฉด ์ ํ๋ ์ต์ ์ ํฌ์ปค์ค๊ฐ ๋ง์ถฐ์ง
- Multi Select Listbox
- ์ต์ ์ด ์ ํ์ด ์ ๋์์ ๋์๋ ์ฒซ๋ฒ์งธ ์ต์ ํฌ์ปค์ค
- ์ฌ๋ฌ ์ต์ ์ด ์ ํ ๋์์ ๊ฒฝ์ฐ (ํน์ ํ๊ฐ)์์ Listbox๊ฐ ํฌ์ปค์ค ๋๋ฉด ์ ํ๋ ์ต์ ์ ์ฒซ๋ฒ์งธ ์ต์ ์ผ๋ก ํฌ์ปค์ค๊ฐ ๋ง์ถฐ์ง
- Single Select Listbox
Down Arrow
โ ํฌ์ปค์ค๋ฅผ ๋ค์ ์ต์ ์ผ๋ก ์ด๋์ ํ ๊ธฐ๋ฅ
โHome
โ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ ์ต์ ์ผ๋ก ์ด๋ (์ต์ 5๊ฐ ์ต์ ์ด ์์ ๋ ๊ถ์ฅ)
Up Arrow
- ํฌ์ปค์ค๋ฅผ ์ด์ ์ต์ ์ผ๋ก ์ด๋์ ํ ๊ธฐ๋ฅ
โEnd
โ ๊ฐ์ฅ ๋ง์ง๋ง ์ต์ ์ผ๋ก ์ด๋ (์ต์ 5๊ฐ ์ต์ ์ด ์์ ๋ ๊ถ์ฅ)
๊ถ์ฅ ๊ธฐ๋ฅ
- ๋ฌธ์ ํ์ดํ ๋์
- ํ ๊ธ์ ํ์ดํ โ ํ์ฌ ๊ธฐ์ค ๋ค์ ์ต์ ์ค ์ฒซ ๊ธ์๊ฐ ๊ฐ์ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ ์ต์ ์ ํฌ์ปค์ค
- ์ฌ๋ฌ ๊ธ์๋ฅผ ๋น ๋ฅด๊ฒ ํ์ดํ โ ํ์ฌ ๊ธฐ์ค ๋ค์ ์ต์ ์ค ์ ๊ธ์๋ค์ด ๊ฐ์ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ ์ต์ ์ ํฌ์ปค์ค
const ListItem = ({ item }) => {
return (
<li
id={`list-item-${item.id}`}
role="option"
aria-selected={...} // Focus ๋ ์๋ฆฌ๋จผํธ๋ true
>{item.content}</li>
)
}
const ListBox = () => {
const [list, setList] = useState([...])
return (
<ul
id="list"
aria-label="List Box"
tabindex="0"
role="listbox"
aria-activedescendant={...} // Focus ๋ ์๋ฆฌ๋จผํธ์ li์ ID
>
{list.map(item => <ListItem {...item} />}
</ul>
)
}