Skip to content

ButtonΒ #5

@hsskey

Description

@hsskey

πŸ“‹ μ»΄ν¬λ„ŒνŠΈ 정보

  • μ»΄ν¬λ„ŒνŠΈ 이름: Button
  • μ»΄ν¬λ„ŒνŠΈ μ„€λͺ…: λ²„νŠΌμ€ μ‚¬μš©μžκ°€ 폼 제좜, λŒ€ν™”μƒμž μ—΄κΈ°, μž‘μ—… μ·¨μ†Œ, μ‚­μ œ μž‘μ—… μˆ˜ν–‰ λ“±μ˜ μž‘μ—…μ΄λ‚˜ 이벀트λ₯Ό νŠΈλ¦¬κ±°ν•  수 있게 ν•΄μ£ΌλŠ” μœ„μ ―
  • μ‚¬μš© 사둀: 폼 제좜, λŒ€ν™”μƒμž μ—΄κΈ°, μž‘μ—… μ·¨μ†Œ, μ‚­μ œ μž‘μ—… λ“± λ‹€μ–‘ν•œ μ‚¬μš©μž μž‘μ—…μ„ νŠΈλ¦¬κ±°ν•  λ•Œ μ‚¬μš©. λ˜ν•œ ν† κΈ€ λ²„νŠΌμ΄λ‚˜ 메뉴 λ²„νŠΌ λ“± λ‹€μ–‘ν•œ ν˜•νƒœλ‘œλ„ ν™œμš© κ°€λŠ₯

πŸ“š μ°Έμ‘° 및 레퍼런슀

  • ARIA Authoring Practices: W3C ARIA Button Pattern
    • λ²„νŠΌ νŒ¨ν„΄μ˜ μ„€λͺ…κ³Ό μ˜ˆμ‹œ, ν‚€λ³΄λ“œ μΈν„°λž™μ…˜, μ ‘κ·Όμ„± 고렀사항 등을 μ°Έκ³ ν•  수 있음
  • 기타 레퍼런슀:
    • Web.dev - Building a button component
      • λ²„νŠΌ μ»΄ν¬λ„ŒνŠΈ μ œμž‘ 과정을 μžμ„Ένžˆ μ„€λͺ…ν•œ κΈ€
    • MUI, Ant Design λ“±μ˜ UI λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ λ²„νŠΌ μ»΄ν¬λ„ŒνŠΈ κ΅¬ν˜„ 방식을 μ°Έκ³ ν•  수 있음

πŸ“ μ ‘κ·Όμ„± 및 ARIA 적용 μ—¬λΆ€

  • ARIA Pattern 적용: W3C ARIA Button Pattern
    • μ‚¬μš©λœ ARIA 속성:
      • role="button": μš”μ†Œκ°€ λ²„νŠΌμž„μ„ λ‚˜νƒ€λƒ„
      • aria-pressed: ν† κΈ€ λ²„νŠΌμ˜ μƒνƒœ(pressed/not pressed)λ₯Ό λ‚˜νƒ€λƒ„
      • aria-expanded: 메뉴 λ²„νŠΌ λ“±μ—μ„œ μ—°κ²°λœ μš”μ†Œκ°€ νŽΌμ³μ‘ŒλŠ”μ§€ μ—¬λΆ€λ₯Ό λ‚˜νƒ€λƒ„
      • aria-describedby: λ²„νŠΌμ— λŒ€ν•œ μ„€λͺ…이 μžˆλŠ” μš”μ†Œμ˜ IDλ₯Ό μ°Έμ‘°
      • aria-labelledby: λ²„νŠΌμ˜ λ ˆμ΄λΈ” 역할을 ν•˜λŠ” μš”μ†Œμ˜ IDλ₯Ό μ°Έμ‘°
  • μ ‘κ·Όμ„± κ΄€λ ¨ 고렀사항:
    • λ²„νŠΌ ν…μŠ€νŠΈλŠ” λ²„νŠΌμ˜ λͺ©μ μ„ λͺ…ν™•ν•˜κ²Œ 전달해야 함
    • λΉ„ν™œμ„±ν™”λœ λ²„νŠΌμ—λŠ” aria-disabled="true"λ₯Ό μ‚¬μš©
    • ν† κΈ€ λ²„νŠΌμ˜ μƒνƒœ λ³€ν™”λ₯Ό aria-pressed둜 전달
    • 포컀슀 κ°€λŠ₯ν•œ λ²„νŠΌμ—λŠ” ν‚€λ³΄λ“œλ‘œλ„ μ ‘κ·Ό 및 ν™œμ„±ν™”ν•  수 μžˆμ–΄μ•Ό 함
  • μ ‘κ·Όμ„± κΈ°λŠ₯ μš”μ•½:
    • λ²„νŠΌμ˜ 이름은 ν…μŠ€νŠΈ μ½˜ν…μΈ λ‘œ μ œκ³΅λ˜κ±°λ‚˜ aria-label, aria-labelledby둜 제곡
    • λ²„νŠΌ μƒνƒœ μ •λ³΄λŠ” aria-pressed, aria-expanded λ“±μ˜ μ†μ„±μœΌλ‘œ 전달
    • λΉ„ν™œμ„±ν™”λœ λ²„νŠΌμ€ aria-disabled="true"λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‚˜νƒ€λƒ„

πŸ—οΈ λ§ˆν¬μ—… ꡬ쑰 뢄석

  • HTML μ‹œλ§¨ν‹± νƒœκ·Έ μ‚¬μš©: <button> μš”μ†Œλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 κ°€μž₯ μ ν•©ν•˜μ§€λ§Œ, <div>, <a>, <input> λ“±μ˜ μš”μ†Œμ— role="button"을 μ‚¬μš©ν•˜μ—¬ λ²„νŠΌμœΌλ‘œ λ§Œλ“€ μˆ˜λ„ 있음
  • λ§ˆν¬μ—… ꡬ쑰 비ꡐ:
    • W3C의 μ˜ˆμ‹œ:
      <div tabindex="0" role="button">Print Page</div>
      <a tabindex="0" role="button" aria-pressed="false">Mute</a>
    • Web.dev의 μ˜ˆμ‹œ:
      <button>Default</button>
      <button type="submit">Submit</button>
      <button type="reset">Reset</button>
      <button disabled>Disabled</button>
    • Ant Design의 μ˜ˆμ‹œ:
      <button type="button" class="ant-btn ant-btn-primary">Primary Button</button>
      <button type="button" class="ant-btn ant-btn-dashed">Dashed Button</button>
      <button type="button" class="ant-btn ant-btn-link">Link Button</button>
    • MUI의 μ˜ˆμ‹œ:
      <button class="MuiButton-root">Button</button>
      <button class="MuiButton-root Mui-disabled">Disabled</button>
  • ꡬ쑰적 선택 이유:
    • λ„€μ΄ν‹°λΈŒ <button> μš”μ†Œκ°€ κ°€μž₯ μ‹œλ§¨ν‹±ν•˜κ³  접근성이 우수
    • <div>, <a> 등을 λ²„νŠΌμœΌλ‘œ μ‚¬μš©ν•  λ•ŒλŠ” role="button"κ³Ό tabindex="0"을 μΆ”κ°€ν•΄μ•Ό 함
    • Ant Design, MUI 등은 <button> μš”μ†Œμ— 클래슀λ₯Ό μΆ”κ°€ν•˜μ—¬ μŠ€νƒ€μΌμ„ μ μš©ν•˜λŠ” 방식을 μ‚¬μš©

πŸ’‘ UI 라이브러리 비ꡐ 뢄석

  • Ant Design:
    • <button> μš”μ†Œμ— ant-btn 클래슀λ₯Ό μΆ”κ°€ν•˜μ—¬ μŠ€νƒ€μΌμ„ 적용
    • λ²„νŠΌ νƒ€μž…(primary, dashed, link λ“±)에 따라 λ‹€λ₯Έ 클래슀λ₯Ό μΆ”κ°€
  • MUI:
    • <button> μš”μ†Œμ— MuiButton-root 클래슀λ₯Ό μΆ”κ°€ν•˜μ—¬ κΈ°λ³Έ μŠ€νƒ€μΌμ„ 적용
    • λΉ„ν™œμ„±ν™”λœ λ²„νŠΌμ—λŠ” Mui-disabled 클래슀λ₯Ό μΆ”κ°€
    • λ²„νŠΌ κ·Έλ£Ή μ»΄ν¬λ„ŒνŠΈ(ButtonGroup)λ₯Ό 제곡

βš™οΈ κ΅¬ν˜„ 및 섀계 고렀사항

  • μ£Όμš” 섀계 고렀사항:
    • λ²„νŠΌ ν…μŠ€νŠΈλŠ” λͺ…ν™•ν•˜κ³  κ°„κ²°ν•΄μ•Ό 함
    • λ²„νŠΌμ˜ μƒνƒœ(ν™œμ„±ν™”/λΉ„ν™œμ„±ν™”, ν† κΈ€ λ“±)λ₯Ό μ‹œκ°μ μœΌλ‘œ λͺ…ν™•νžˆ 전달해야 함
    • ν‚€λ³΄λ“œ 포컀슀 및 ν™œμ„±ν™”λ₯Ό 지원해야 함
    • λ²„νŠΌμ˜ λͺ©μ μ— 따라 μ μ ˆν•œ type 속성(button, submit, reset λ“±)을 μ‚¬μš©ν•΄μ•Ό 함
  • μ½”λ“œ μ˜ˆμ‹œ:
    <button type="button">일반 λ²„νŠΌ</button>
    <button type="submit">제좜 λ²„νŠΌ</button>
    <button type="reset">리셋 λ²„νŠΌ</button>
    <button disabled>λΉ„ν™œμ„±ν™” λ²„νŠΌ</button>
    
    <a role="button" tabindex="0" aria-pressed="false">ν† κΈ€ λ²„νŠΌ</a>

πŸ” ν…ŒμŠ€νŠΈ 및 κ²€ν† 

  • μ ‘κ·Όμ„± ν…ŒμŠ€νŠΈ:
    • ν‚€λ³΄λ“œλ‘œ λ²„νŠΌμ— μ ‘κ·Όν•˜κ³  ν™œμ„±ν™”ν•  수 μžˆλŠ”μ§€ 확인
    • 슀크린 λ¦¬λ”λ‘œ λ²„νŠΌμ˜ 이름, μ—­ν• , μƒνƒœ 등이 μ œλŒ€λ‘œ μ½νžˆλŠ”μ§€ 확인
  • λΈŒλΌμš°μ € ν˜Έν™˜μ„± ν…ŒμŠ€νŠΈ: λ‹€μ–‘ν•œ λΈŒλΌμš°μ €μ—μ„œ λ²„νŠΌμ˜ μŠ€νƒ€μΌκ³Ό κΈ°λŠ₯이 λ™μΌν•˜κ²Œ λ™μž‘ν•˜λŠ”μ§€ 확인
  • μ‚¬μš©μž ν”Όλ“œλ°±: μ‹€μ œ μ‚¬μš©μžλ“€μ΄ λ²„νŠΌμ„ μ‚¬μš©ν•˜λ©΄μ„œ κ²ͺλŠ” λ¬Έμ œμ μ΄λ‚˜ κ°œμ„ μ μ„ μˆ˜λ ΄ν•˜κ³  반영

πŸ“Œ μΆ”κ°€ μ°Έκ³  사항

  • κ΄€λ ¨ λ¬Έμ„œ:
  • 의견 및 μ œμ•ˆ:
    • λ²„νŠΌμ˜ μŠ€νƒ€μΌμ€ μ‚¬μ΄νŠΈμ˜ 전체적인 λ””μžμΈ μ‹œμŠ€ν…œκ³Ό μΌκ΄€λ˜κ²Œ μ„€κ³„ν•˜λŠ” 것이 μ’‹μŒ
    • μ•„μ΄μ½˜λ§Œ μžˆλŠ” λ²„νŠΌμ˜ 경우 aria-label 속성을 μ‚¬μš©ν•˜μ—¬ λ²„νŠΌμ˜ λͺ©μ μ„ μ„€λͺ…ν•΄μ•Ό 함

🎯 μ—­ν• , 속성, μƒνƒœ 및 νƒœκ·Έ 속성

  • Role, Attribute, State
    • Role: button
      • <button> μš”μ†Œμ—λŠ” 기본적으둜 button 역할이 적용됨
      • <div>, <a> λ“±μ˜ μš”μ†Œλ₯Ό λ²„νŠΌμœΌλ‘œ μ‚¬μš©ν•  λ•ŒλŠ” role="button"을 λͺ…μ‹œμ μœΌλ‘œ μΆ”κ°€ν•΄μ•Ό 함
    • Attribute:
      • aria-pressed: ν† κΈ€ λ²„νŠΌμ˜ μƒνƒœ(pressed/not pressed)λ₯Ό λ‚˜νƒ€λƒ„
      • aria-expanded: 메뉴 λ²„νŠΌ λ“±μ—μ„œ μ—°κ²°λœ μš”μ†Œκ°€ νŽΌμ³μ‘ŒλŠ”μ§€ μ—¬λΆ€λ₯Ό λ‚˜νƒ€λƒ„
      • aria-describedby: λ²„νŠΌμ— λŒ€ν•œ μ„€λͺ…이 μžˆλŠ” μš”μ†Œμ˜ IDλ₯Ό μ°Έμ‘°
      • aria-labelledby: λ²„νŠΌμ˜ λ ˆμ΄λΈ” 역할을 ν•˜λŠ” μš”μ†Œμ˜ IDλ₯Ό μ°Έμ‘°
      • tabindex="0": 포컀슀 κ°€λŠ₯ν•œ λ²„νŠΌμ„ λ§Œλ“€ λ•Œ μ‚¬μš©
    • State:
      • disabled: λ²„νŠΌμ„ λΉ„ν™œμ„±ν™”ν•  λ•Œ μ‚¬μš©
  • JavaScript 및 CSS μ‚¬μš© μ—¬λΆ€
    • JavaScript μ‚¬μš© μ—¬λΆ€: λ²„νŠΌμ˜ μƒνƒœ λ³€κ²½, 클릭 이벀트 처리 등을 μœ„ν•΄ JavaScriptλ₯Ό μ‚¬μš©ν•  수 있음
    • CSS 적용 사항: λ²„νŠΌμ˜ μŠ€νƒ€μΌ(크기, 색상, λ°°κ²½, ν…Œλ‘λ¦¬ λ“±)을 CSS둜 적용. μƒνƒœ(hover, focus, active, disabled)에 λ”°λ₯Έ μŠ€νƒ€μΌ λ³€ν™”λ₯Ό κ³ λ €ν•΄μ•Ό 함

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions