Pagination
Pagination은 대량의 데이터나 콘텐츠를 페이지 단위로 나눠 원하는 페이지로 이동할 수 있게 하는 내비게이션 컴포넌트입니다. 표시할 페이지 범위와 양 끝 페이지 수를 세밀하게 설정할 수 있으며, 생략 기호(…)가 포함된 페이지 범위를 자동으로 계산합니다.
3
Variants
5
Sizes
4
Navigation
Pure
React
Playground
Preview
DdefaultPage 1/20
Variant
Color
Size
Radius
Pages
Options
const [page, setPage] = useState(1)
<Pagination total={20} value={page} onChange={setPage}>
<Pagination.Content>
<Pagination.Item>
<Pagination.Previous />
</Pagination.Item>
<Pagination.Items />
<Pagination.Item>
<Pagination.Next />
</Pagination.Item>
</Pagination.Content>
</Pagination>Variants
Default
활성 페이지에 솔리드 배경 적용, 가장 일반적인 스타일
기본 UI
Outline
테두리 있음, 활성 페이지는 솔리드 배경 적용
폼, 리스트
Ghost
활성 페이지에 은은한 하이라이트, 최소한의 시각적 존재감
보조 UI
Sizes
xs높이28px
폰트12px
아이콘14px
sm높이32px
폰트13px
아이콘14px
default높이36px
폰트14px
아이콘16px
lg높이40px
폰트14px
아이콘16px
xl높이48px
폰트16px
아이콘16px
| Size | 높이 | 폰트 | 아이콘 | 미리보기 |
|---|---|---|---|---|
xs | 28px | 12px | 14px | |
sm | 32px | 13px | 14px | |
default | 36px | 14px | 16px | |
lg | 40px | 14px | 16px | |
xl | 48px | 16px | 16px |
Features
Edge Navigation (withEdges)
첫 페이지/마지막 페이지 이동 버튼 표시, 많은 페이지를 빠르게 이동할 때 유용
<Pagination total={20} defaultValue={10} withEdges>
<Pagination.Content>
<Pagination.Item><Pagination.First /></Pagination.Item>
<Pagination.Item><Pagination.Previous /></Pagination.Item>
<Pagination.Items />
<Pagination.Item><Pagination.Next /></Pagination.Item>
<Pagination.Item><Pagination.Last /></Pagination.Item>
</Pagination.Content>
</Pagination>Loop Navigation (loop)
마지막 페이지에서 첫 페이지로, 첫 페이지에서 마지막 페이지로 순환 이동
<Pagination total={5} defaultValue={5} loop>
<Pagination.Content>
<Pagination.Item><Pagination.Previous /></Pagination.Item>
<Pagination.Items />
<Pagination.Item><Pagination.Next /></Pagination.Item>
</Pagination.Content>
</Pagination>Disabled State
모든 조작 비활성화, 데이터 로딩 중 사용
<Pagination total={10} defaultValue={3} disabled>
<Pagination.Content>
<Pagination.Item><Pagination.Previous /></Pagination.Item>
<Pagination.Items />
<Pagination.Item><Pagination.Next /></Pagination.Item>
</Pagination.Content>
</Pagination>Custom Icons
icon prop으로 내장 아이콘을 원하는 ReactNode로 교체
<Pagination total={10} defaultValue={5}>
<Pagination.Content>
<Pagination.Item>
<Pagination.Previous icon={
<svg className="icon-sm" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
<path strokeLinecap="round" strokeLinejoin="round" d="M10 19l-7-7m0 0l7-7m-7 7h18" />
</svg>
} />
</Pagination.Item>
<Pagination.Items />
<Pagination.Item>
<Pagination.Next icon={
<svg className="icon-sm" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
<path strokeLinecap="round" strokeLinejoin="round" d="M14 5l7 7m0 0l-7 7m7-7H3" />
</svg>
} />
</Pagination.Item>
</Pagination.Content>
</Pagination>API
Component Structure
Pagination— Pure React.Content.Item.LinkProps.PreviousProps.NextProps.FirstProps.LastProps.Ellipsis.Items
.Content페이지 목록 컨테이너.Item페이지 아이템 래퍼.LinkProps페이지 번호 버튼 (page prop).PreviousProps이전 버튼.NextProps다음 버튼.FirstProps첫 페이지 버튼.LastProps마지막 페이지 버튼.Ellipsis생략 기호.Items자동 페이지네이션Props
Pagination
total1number전체 페이지 수
valueundefinednumber현재 페이지 (controlled 모드)
defaultValue1number초기 페이지 (uncontrolled 모드)
onChangeundefined(page: number) => void페이지 변경 시 콜백
siblings1number현재 페이지 양쪽에 표시할 페이지 수
boundaries1number시작/끝에 항상 표시할 페이지 수
size"default""xs" | "sm" | "default" | "lg" | "xl"컴포넌트 사이즈 (28/32/36/40/48px)
variant"default""default" | "outline" | "ghost"시각적 variant
color"default""default" | "primary"활성 페이지 색상
radius"md""sm" | "base" | "md" | "lg" | "xl" | "full"테두리 radius
disabledfalseboolean모든 조작 비활성화
withControlstrueboolean이전/다음 버튼 표시
withEdgesfalseboolean첫/마지막 이동 버튼 표시
loopfalseboolean마지막 페이지에서 첫 페이지로 순환
| Name | Type | Default | Description |
|---|---|---|---|
total | number | 1 | 전체 페이지 수 |
value | number | undefined | 현재 페이지 (controlled 모드) |
defaultValue | number | 1 | 초기 페이지 (uncontrolled 모드) |
onChange | (page: number) => void | undefined | 페이지 변경 시 콜백 |
siblings | number | 1 | 현재 페이지 양쪽에 표시할 페이지 수 |
boundaries | number | 1 | 시작/끝에 항상 표시할 페이지 수 |
size | "xs" | "sm" | "default" | "lg" | "xl" | "default" | 컴포넌트 사이즈 (28/32/36/40/48px) |
variant | "default" | "outline" | "ghost" | "default" | 시각적 variant |
color | "default" | "primary" | "default" | 활성 페이지 색상 |
radius | "sm" | "base" | "md" | "lg" | "xl" | "full" | "md" | 테두리 radius |
disabled | boolean | false | 모든 조작 비활성화 |
withControls | boolean | true | 이전/다음 버튼 표시 |
withEdges | boolean | false | 첫/마지막 이동 버튼 표시 |
loop | boolean | false | 마지막 페이지에서 첫 페이지로 순환 |
Pagination.Link
pageundefinednumber이동할 페이지 번호
isActiveautoboolean활성 상태 (생략 시 Context에서 자동 판단)
| Name | Type | Default | Description |
|---|---|---|---|
page | number | undefined | 이동할 페이지 번호 |
isActive | boolean | auto | 활성 상태 (생략 시 Context에서 자동 판단) |
Pagination.Previous / Pagination.Next / Pagination.First / Pagination.Last
iconBuilt-in SVG iconReactNode커스텀 아이콘
| Name | Type | Default | Description |
|---|---|---|---|
icon | ReactNode | Built-in SVG icon | 커스텀 아이콘 |
Anatomy
1
2
3
Prev4
17
…4
5
56
…
10
6
NextHeight
36pxMin width
min-w-9Gap
gap-1Icon
icon-sm1
Root
nav 컨테이너
2
Content
플렉스 리스트
3
Prev / Next
이전/다음 버튼
4
Page Item
페이지 번호
5
Active Page
현재 페이지
6
Ellipsis
생략 기호
Best Practices
✓
권장
- ✓데이터 양이 많을 때 페이지네이션을 사용합니다
- ✓현재 페이지 위치를 명확하게 표시합니다
- ✓siblings, boundaries로 적절한 페이지 범위를 설정합니다
- ✓페이지가 많은 경우 withEdges로 첫/마지막 이동 버튼을 제공합니다
✕
지양
- ✗데이터가 적을 때는 페이지네이션을 사용하지 않습니다
- ✗페이지 이동 시 스크롤 위치 초기화를 빠뜨리지 않습니다
- ✗모든 페이지 번호를 한 번에 표시하지 않습니다
- ✗무한 스크롤과 함께 사용하지 않습니다
Accessibility
키보드 조작
모든 페이지 버튼은
Tab 키로 포커스 이동이 가능하며, Enter 또는 Space 키로 선택합니다. disabled 상태에서는 포커스가 이동하지 않습니다.ARIA / WCAG
role="navigation"nav 요소에 설정aria-label="pagination"내비게이션 영역 식별aria-current="page"현재 페이지에 설정aria-label="Go to page N"각 버튼에 설정- default 36px, lg 40px 이상 (WCAG 2.5.8 준수)
aria-hidden="true"Ellipsis에 설정