본문으로 건너뛰기
내비게이션 / pagination

Pagination

페이지 네비게이션 컨트롤 (DataTable 와 짝).
내비게이션paginationStatic specimenpagination페이지페이지네이션paging
01 · Specimen

먼저 보고, 그다음 계약을 읽습니다

페이지 네비게이션 컨트롤 (DataTable 와 짝).

Workbench 불러오는 중…
Component intent의도와 경계 읽기

page/pageSize/total 세 값만 받으면 페이지 버튼(boundary + sibling + ellipsis), "X-Y / Total" 정보 줄, ←/→ 키보드 이동을 자체 계산해 제공하는 controlled 컴포넌트다. 페이지 수가 boundaryCount·siblingCount 로 정해지는 한계 이하면 ellipsis 없이 전부 표시한다. compact 모드는 좁은 컨테이너/모바일용으로 이전/다음 + "현재/총" 만 노출한다. 숫자는 tabular-nums 로 자리수를 시각적으로 안정시키고 총량은 ko-KR 콤마로 포맷한다.

02 · Use

예제

SSOT에 등록된 실제 API 기준 snippet입니다. standalone 배지만 독립 실행 단위이며, fragment는 주변 state·handler 문맥을 생략합니다.

01기본 (controlled)tsxfragment
기본 (controlled)
import { Pagination } from "@axe/ui";const [page, setPage] = useState(1);<Pagination page={page} pageSize={20} total={480} onPageChange={setPage} />
02compact (모바일)tsxfragment
compact (모바일)
import { Pagination } from "@axe/ui";<Pagination page={3} pageSize={20} total={480} compact onPageChange={setPage} />
03CSS-only 정적 바 (비-React)htmlfragment
CSS-only 정적 바 (비-React)
<nav class="axe-pagination axe-pagination--size-md" aria-label="Pagination">  <div class="axe-pagination__info">    <span class="axe-pagination__info-range">1-20</span>    <span class="axe-pagination__info-sep"> / </span>    <span class="axe-pagination__info-total">480</span>  </div>  <ul class="axe-pagination__list">    <li><button class="axe-pagination__btn axe-pagination__btn--nav" aria-label="이전 페이지" disabled aria-disabled="true">‹</button></li>    <li><button class="axe-pagination__btn axe-pagination__btn--active" aria-current="page" aria-label="1페이지 · 현재">1</button></li>    <li><button class="axe-pagination__btn" aria-label="2페이지">2</button></li>    <li aria-hidden="true"><span class="axe-pagination__ellipsis">…</span></li>    <li><button class="axe-pagination__btn" aria-label="24페이지">24</button></li>    <li><button class="axe-pagination__btn axe-pagination__btn--nav" aria-label="다음 페이지">›</button></li>  </ul></nav>
03 · React

Props

TSX 소스가 진실입니다. 주요 export 컴포넌트의 public API만 노출합니다.

이름타입필수기본값설명
pagenumber필수1-based 현재 페이지. 내부적으로 [1, totalPages] 로 clamp.
pageSizenumber필수페이지당 항목 수 (정보 줄·totalPages 계산에 사용).
totalnumber필수전체 항목 수 (페이지 수가 아님). 0 이면 페이지 리스트 숨김.
onPageChange(page: number) => void필수페이지 변경 콜백. 상위 상태를 갱신 (controlled).
siblingCountnumber1활성 페이지 좌우로 보여줄 페이지 수.
boundaryCountnumber1시작/끝에서 항상 보여줄 페이지 수.
showInfobooleantrue"X-Y / Total" 정보 줄 표시 (compact 시 무시).
size"sm" | "md""md"버튼 크기. md 는 기본(별도 CSS 규칙 없음), sm 은 28px 축소.
compactbooleanfalse모바일/좁은 컨테이너용 — 이전/다음 + "현재/총" 만 표시. size 무시.
ariaLabelstring"Pagination · 페이지 네비게이션 (←/→ 키)"SR 용 nav label.
...restReact.HTMLAttributes<HTMLElement>나머지는 루트 <nav> 로 전파 (onChange 는 Omit).
04 · Any stack

.axe-* 클래스 계약

React 밖에서도 같은 표면을 그리는 공개 계약입니다. stable은 minor 버전 안에서 이름을 바꾸지 않습니다.

클래스안정성용도
.axe-paginationstable<nav> 루트 (flex space-between, tabular-nums).
.axe-pagination--size-smstablesm 크기 변형 (버튼 28px).
.axe-pagination--compactstablecompact 모바일 변형 (중앙 정렬, 이전/다음 + n/총).
.axe-pagination__infostable"X-Y / Total" 정보 줄.
.axe-pagination__info-rangeinternal범위(X-Y) — primary 색.
.axe-pagination__info-sepinternal정보 줄 구분자.
.axe-pagination__info-totalinternal총량.
.axe-pagination__liststable페이지 버튼 <ul> (←/→ 키 핸들러가 붙는 영역).
.axe-pagination__btnstable페이지/nav 버튼 (32px, hover/focus/disabled).
.axe-pagination__btn--activestable현재 페이지 버튼 (accent 배경).
.axe-pagination__btn--navstable이전/다음 (‹ ›) 버튼.
.axe-pagination__ellipsisstable생략(…) 표시.
.axe-pagination__compact-labelinternalcompact 모드 "n / 총" 컨테이너.
.axe-pagination__compact-currentinternalcompact 현재 페이지 (semibold).
.axe-pagination__compact-sepinternalcompact 구분자.
.axe-pagination__compact-totalinternalcompact 총 페이지.
비-React 소비 노트
시각 바는 위 html 예제 마크업으로 재현 가능하나, 페이지 전환·←/→ 키·ellipsis 계산은 컴포넌트 JS(onPageChange)가 담당한다. CSS-only 는 정적 표시용이며 버튼은 동작하지 않는다. size="md" 는 emit 되지만 별도 CSS 규칙이 없는 기본값이다.
05 · Inclusive

접근성

키보드, ARIA, 구현 노트를 함께 검토합니다.

Keyboard
  • <ul> 영역에서 ← / → 로 이전/다음 페이지 이동 (경계에서 무시)
  • 버튼은 Enter/Space 로 실행 (네이티브 button)
ARIA

루트 <nav aria-label>(ariaLabel prop). 현재 페이지 버튼 = aria-current="page". 이전/다음 = aria-label "이전 페이지"/"다음 페이지" + 경계 시 aria-disabled(+실제 disabled). 페이지 버튼 aria-label "N페이지"(현재 시 "· 현재" 추가). ellipsis <li> = aria-hidden="true". compact 라벨 = aria-current="page".

Notes

←/→ 는 리스트 영역 포커스에서만 동작(정보 줄/외곽 nav 는 무시). total=0 이면 페이지 리스트를 숨기고 "0 / 0" 정보만 노출. reduced-motion 시 버튼 트랜지션 없음.

06 · Judgment

권장 · 지양

권장
  • page 는 1-based 로 넘기고 onPageChange 에서 상위 상태를 갱신 (controlled).
  • 좁은 컨테이너/모바일은 compact 사용.
  • 큰 total 은 siblingCount/boundaryCount 로 표시 밀도 조절.
지양
  • total 을 페이지 수로 착각 말 것 — 전체 항목 개수다.
  • onPageChange 없이 순수 표시로만 쓰지 말 것 (버튼이 controlled).
검색창을 열면 컴포넌트 인덱스를 불러옵니다.