Skip to content

Latest commit

ย 

History

History
72 lines (59 loc) ยท 3.21 KB

ListBox.md

File metadata and controls

72 lines (59 loc) ยท 3.21 KB

Listbox Pattern

  • 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์„ ๋‹ค์‹œ ์ „์ฒด๋ฅผ ๋‹ค ์ฝ์–ด์•ผ ํ•˜๊ธฐ์— ๋ถˆํŽธ์„ฑ ์ฆ๊ฐ€
  • ๊ฐ™์€ ๋‹จ์–ด๋กœ ์‹œ์ž‘ํ•˜๋Š” ์˜ต์…˜๋“ค์ด ๋งŽ์€ ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ Listbox๋กœ ๋‚˜๋ˆ„๋Š”๊ฒŒ ์ข‹์Œ
    • ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์ธก๋ฉด์—์„œ ์•ž ๋‹จ์–ด๊ฐ€ ๊ฐ™์€ ์˜ต์…˜์ด ๋งŽ์€ ๊ฒฝ์šฐ ์˜ต์…˜์˜ ๋’ท ๋‹จ์–ด๊ฐ€ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ์ค‘์ ์œผ๋กœ ์œ ์ €๊ฐ€ ํ–‰๋™์„ ํ•˜๊ธฐ์— ์‚ฌ์šฉ์„ฑ ์ €ํ•˜
  • aria-activedescendant*
    • aria-activedescendant์˜ ๊ฐ’์ด ๋ถ€์—ฌ๊ฐ€ ๋˜์–ด์žˆ์œผ๋ฉด DOM ํฌ์ปค์Šค๊ฐ€ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์— ๋จธ๋ฌผ๋Ÿฌ ์žˆ์Œ
    • ์Šคํฌ๋ฆฐ ๋ฆฌ๋”์—๊ฒŒ ์–ด๋–ค ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ํ‚ค๋ณด๋“œ ํฌ์ปค์Šค๋ฅผ ๋ฐ›๊ณ  ์žˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ๋Š” ์šฉ๋„

Keyboard Interaction

ํ•„์š” ๊ธฐ๋Šฅ (์ˆ˜์ง ๋ฆฌ์ŠคํŠธ ๊ธฐ์ค€)

  • ListBox Focus๊ฐ€ ๋  ๋•Œ
    • Single Select Listbox
      • ์˜ต์…˜์ด ์„ ํƒ์ด ์•ˆ ๋˜์—ˆ์„ ๋•Œ์—๋Š” ์ฒซ๋ฒˆ์งธ ์˜ต์…˜ ํฌ์ปค์Šค
      • ์˜ต์…˜์ด ์„ ํƒ ๋œ ์ƒํƒœ์—์„œ Listbox๊ฐ€ ํฌ์ปค์Šค๊ฐ€ ๋˜๋ฉด ์„ ํƒ๋œ ์˜ต์…˜์— ํฌ์ปค์Šค๊ฐ€ ๋งž์ถฐ์ง
    • Multi Select Listbox
      • ์˜ต์…˜์ด ์„ ํƒ์ด ์•ˆ ๋˜์—ˆ์„ ๋•Œ์—๋Š” ์ฒซ๋ฒˆ์งธ ์˜ต์…˜ ํฌ์ปค์Šค
      • ์—ฌ๋Ÿฌ ์˜ต์…˜์ด ์„ ํƒ ๋˜์—ˆ์„ ๊ฒฝ์šฐ (ํ˜น์€ ํ•œ๊ฐœ)์—์„œ 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>
	)
}