페이지네이션

Pagination

긴 목록을 여러 페이지로 나누고 번호를 눌러 이동하는 내비게이션.

다른 이름: Page navigationPager
···
html
<nav aria-label="pagination" class="pg">
  <button class="pgnav" id="pgp">‹</button>
  <ol id="pgl">
    <li><button aria-current="page">1</button></li><li><button>2</button></li><li><button>3</button></li><li><button>4</button></li><li><button>5</button></li>
  </ol>
  <button class="pgnav" id="pgn">›</button>
</nav>
css
.pg{display:flex;align-items:center;gap:6px}
.pg ol{display:flex;list-style:none;gap:5px;margin:0;padding:0}
.pg button{width:28px;height:28px;border-radius:7px;border:1px solid var(--line);background:var(--surface);color:var(--muted);font-size:12px;cursor:pointer}
.pg li button[aria-current]{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:700}
.pgnav{background:none}
js
const btns = [...document.querySelectorAll('#pgl button')];
const prev = document.getElementById('pgp'), next = document.getElementById('pgn');
let cur = 0, auto = true;
function paint() {
  btns.forEach((b, i) => i === cur ? b.setAttribute('aria-current', 'page') : b.removeAttribute('aria-current'));
  prev.disabled = cur === 0; next.disabled = cur === btns.length - 1;
}
paint();
btns.forEach((b, i) => b.addEventListener('click', () => { auto = false; cur = i; paint(); }));
prev.addEventListener('click', () => { auto = false; cur = Math.max(0, cur - 1); paint(); });
next.addEventListener('click', () => { auto = false; cur = Math.min(btns.length - 1, cur + 1); paint(); });
setInterval(() => { if (!auto) return; cur = (cur + 1) % btns.length; paint(); }, 1100);

<nav aria-label="pagination"> 안에 페이지 번호 버튼들을 두고, 현재 페이지에는 aria-current="page"를 줍니다. 이전/다음 버튼은 텍스트로 명확히 라벨링하고(화살표 아이콘만으로는 부족합니다), 첫/마지막 페이지에서는 비활성화합니다.

무한 스크롤과 자주 비교됩니다. 페이지네이션은 "지금 3페이지째 보고 있다"는 위치 감각을 주고 북마크·공유가 가능하지만, 무한 스크롤은 끊김없이 탐색할 수 있는 대신 특정 항목으로 되돌아가기 어렵습니다. 캐러셀과는 다릅니다 — 캐러셀은 콘텐츠 자체를 슬라이드 형태로 순환 전시하는 것이고, 페이지네이션은 목록 데이터를 페이지 단위로 나눠 탐색하는 것입니다.

페이지가 아주 많으면 전부 나열하지 않고 현재 페이지 주변 몇 개 + 처음/끝 번호 + "…" 생략 표시를 함께 씁니다.