I HATE FLYING BUGS logoFE Chapter
Design SystemAction

Checkbox

여러 항목을 선택/해제할 수 있는 입력 컴포넌트입니다. 폼·테이블·체크리스트에서 사용합니다.

개요

  • 다중 선택, 전체 선택/해제, 행 단위 선택
  • 폼에서 약관 동의, 옵션 토글

이렇게 활용하세요

✅ 권장 사용 방식

  • 폼 / 동의

    • 필수·선택 동의를 구분해 보여주고, 빠뜨린 항목은 에러 메시지로 바로 알려줍니다.
    • '전체 동의'는 상단에서 한 번에 체크하고, 하위 항목들은 각각 선택할 수 있게 합니다.
  • 리스트 / 테이블

    • 헤더에 '전체 선택'을 두고, 행마다 개별 선택을 지원하며 선택 개수도 함께 보여줍니다.
    • 표의 정보 밀도가 높다면 마우스 호버 시 체크박스가 나타나게 합니다.
  • 그룹 / 계층

    • 일부만 선택되면 부모는 "-" 표시로 부분 선택을 표기합니다(indeterminate).
    • 부모를 체크하면 전부 선택되며, 해제하면 전부 해제되도록 동기화합니다.
  • 모바일 / 접근성

    • 손가락으로 누르기 편한 크기의 라벨을 늘려도 체크가 토글되게 합니다.
    • 스크린리더가 상태를 인식하도록 aria-checked="mixed"와 설명 연결을 적용합니다.

❌ 비권장 사례

  • 폼 / 동의

    • 여러 약관을 한 체크박스에 묶어 통합 동의만 받는 것을 금지합니다.
    • 필수 항목을 빠뜨려도 제출이 되고 나중에야 오류를 알리는 것을 금지합니다.
  • 리스트 / 테이블

    • 단일 선택만 필요한 목록에 체크박스를 써서 헷갈리게 하는 것을 금지합니다.
    • 헤더의 전체 선택 없이 행마다 두어 일괄 선택/해제가 안 되게 하는 것을 금지합니다.
  • 그룹 / 계층

    • 자식 일부 선택인데 부모를 체크로 표시해 사용자가 혼란을 겪게 합니다.
    • 부모를 눌러도 자식 상태가 동기화되지 않는 상호작용을 금지합니다.
  • 모바일 / 접근성

    • 체크박스·라벨이 너무 작아 손가락으로 누르기 어렵게 구성합니다.
    • 라벨을 늘려도 토글되지 않아 작은 박스만 정확히 눌러야 하게 만듭니다.

Variants

With Label

가장 기본형으로 라벨 클릭만으로도 토글되도록 연결된 체크박스입니다.

Unchecked

Checked

Disabled

<Checkbox label="라벨이 있는 체크박스" />
<Checkbox label="라벨이 있는 체크박스" defaultChecked />
<Checkbox label="비활성화된 체크박스" disabled />

With Description

짧은 설명(1–2줄)로 추가 맥락을 제공하는 체크박스입니다. 약관/폼에 적합합니다.

Unchecked

Description

Checked

Description

Disabled

Description

<Checkbox label="체크박스" description="Description" />
<Checkbox label="체크박스" description="Description" defaultChecked />
<Checkbox label="체크박스" description="Description" disabled />

With End Icon

라벨 우측에 아이콘을 표시하여 의미를 보강하는 체크박스입니다. 과도한 장식은 지양합니다.

Unchecked

Checked

Disabled

<Checkbox 
  label="체크박스" 
  endIcon={
    <IconButton size="xSmall">
      <InfoOutline aria-label="info" />
    </IconButton>
  } 
/>

Indeterminate State

전체 선택 체크박스에서 일부 항목만 선택되었을 때의 중간 상태(indeterminate)를 보여주는 체크박스입니다.

<Checkbox label="전체 선택" indeterminate />
<div className="ml-6 flex flex-col gap-2">
  <Checkbox label="항목 1" />
  <Checkbox label="항목 2" defaultChecked />
  <Checkbox label="항목 3" />
</div>

Sizes

체크박스는 사용 맥락에 따라 두 가지 사이즈로 제공됩니다. 상황과 밀도에 맞춰 선택합니다.

<Checkbox size="medium" label="medium" />
<Checkbox size="small" label="small" />
Size NameUse Case
medium폼·리스트·테이블 등 대부분의 기본 상황
small데이터 그리드·카드 내부 등 조밀 레이아웃(PC 우선, 모바일 핵심 입력엔 비권장)

Group Layouts

Horizontal Group

항목이 적을 때 가로 정렬로 한눈에 비교·선택이 쉽습니다.

Description

Description

<div className="flex gap-4 items-center">
  <Checkbox label="Label" size="medium" description="Description" />
  <Checkbox label="Label" size="medium" description="Description" />
</div>

Vertical Group

라벨이 길거나 항목이 많을 때 세로 스택으로 가독성과 스크롤을 확보합니다.

Description

Description

<div className="flex flex-col gap-1">
  <Checkbox label="Label" size="medium" description="Description" />
  <Checkbox label="Label" size="medium" description="Description" />
</div>

Controlled State

상태를 외부에서 관리하는 체크박스입니다.

import { useState } from 'react';

function ControlledCheckbox() {
  const [checked, setChecked] = useState(false);
  
  return (
    <Checkbox 
      label="Controlled Checkbox" 
      checked={checked} 
      onCheckedChange={setChecked} 
    />
  );
}

With Ref

ref를 사용하여 체크박스에 직접 접근할 수 있습니다.

import { useRef } from 'react';

function CheckboxWithRef() {
  const ref = useRef<HTMLButtonElement>(null);
  
  const handleClick = () => {
    console.log(ref.current);
  };
  
  return (
    <Checkbox ref={ref} label="Checkbox with Ref" />
  );
}

Props

PropTypeDefault
checked?
boolean
undefined
indeterminate?
boolean
false
onCheckedChange?
(checked: boolean) => void
undefined
defaultChecked?
boolean
false
size?
"small" | "medium"
"small"
label?
string
undefined
description?
string
undefined
endIcon?
React.ReactNode
undefined
disabled?
boolean
false
required?
boolean
false
name?
string
undefined
value?
string
undefined
id?
string
undefined
Edit on GitHub

Last updated on