Open demo

CSS code

HTML
<div><span class="lbl">Filled pills</span><nav aria-label="Pagination">
<div class="pg pill"><a href="#" aria-label="Previous page">‹</a><a href="#">1</a><a href="#">2</a><a href="#" aria-current="page">3</a><a href="#">4</a><a href="#">5</a><span class="gap">…</span><a href="#">24</a><a href="#" aria-label="Next page">›</a></div></nav></div>

<div><span class="lbl">Ring on the current page</span><nav aria-label="Pagination">
<div class="pg ring"><a href="#" aria-label="Previous page">‹</a><a href="#">1</a><a href="#">2</a><a href="#" aria-current="page">3</a><a href="#">4</a><a href="#">5</a><span class="gap">…</span><a href="#">24</a><a href="#" aria-label="Next page">›</a></div></nav></div>

<div><span class="lbl">Compact for a card footer</span><nav aria-label="Pagination">
<div class="pg pill tight"><a href="#" aria-label="Previous page">‹</a><a href="#">1</a><a href="#">2</a><a href="#" aria-current="page">3</a><a href="#">4</a><a href="#">5</a><span class="gap">…</span><a href="#">24</a><a href="#" aria-label="Next page">›</a></div></nav></div>
CSS
.pg{display:inline-flex;flex-wrap:wrap;align-items:center;gap:6px;list-style:none}
.pg a{box-sizing:border-box;display:grid;place-items:center;min-width:38px;height:38px;padding:0 11px;
  text-decoration:none;font-size:.88rem;font-weight:600;color:#475569;border-radius:9px;
  transition:background .15s,color .15s,border-color .15s}
.pg a:hover{background:#e2e8f0;color:#0f172a}
.pg a:focus-visible{outline:2px solid #2563eb;outline-offset:2px}
.pg .gap{min-width:26px;color:#64748b;display:grid;place-items:center;height:38px;font-weight:600}
.pg a[aria-current]{background:#2563eb;color:#fff}

.pill a,.pill .gap{border-radius:999px}
.pill a{background:#f1f5f9}
.pill a:hover{background:#e2e8f0}
.pill a[aria-current]{background:#0f172a;color:#fff}
.ring a{background:#fff;border:1px solid #e2e8f0;border-radius:999px}
.ring a[aria-current]{background:#fff;color:#2563eb;border-color:#2563eb;box-shadow:0 0 0 3px #dbeafe}
.tight{gap:3px}
.tight a{min-width:32px;height:32px;font-size:.82rem;padding:0 9px}

@media(prefers-reduced-motion:reduce){.pg a{transition:none}}

Bootstrap 5 code

Requires: Bootstrap 5.3.8 CSS

HTML
<div><span class="lbl">Filled pills</span>
<nav aria-label="Pagination">
<ul class="pagination pagination-uic pagination-pill mb-0">
  <li class="page-item"><a class="page-link" href="#" aria-label="Previous page">‹</a></li>
  <li class="page-item"><a class="page-link" href="#">1</a></li>
  <li class="page-item"><a class="page-link" href="#">2</a></li>
  <li class="page-item"><a class="page-link active" href="#" aria-current="page">3</a></li>
  <li class="page-item"><a class="page-link" href="#">4</a></li>
  <li class="page-item"><a class="page-link" href="#">5</a></li>
  <li class="page-item disabled page-gap"><span class="page-link">…</span></li>
  <li class="page-item"><a class="page-link" href="#">24</a></li>
  <li class="page-item"><a class="page-link" href="#" aria-label="Next page">›</a></li>
</ul>
</nav></div>

<div><span class="lbl">Ring on the current page</span>
<nav aria-label="Pagination">
<ul class="pagination pagination-uic pagination-ring mb-0">
  <li class="page-item"><a class="page-link" href="#" aria-label="Previous page">‹</a></li>
  <li class="page-item"><a class="page-link" href="#">1</a></li>
  <li class="page-item"><a class="page-link" href="#">2</a></li>
  <li class="page-item"><a class="page-link active" href="#" aria-current="page">3</a></li>
  <li class="page-item"><a class="page-link" href="#">4</a></li>
  <li class="page-item"><a class="page-link" href="#">5</a></li>
  <li class="page-item disabled page-gap"><span class="page-link">…</span></li>
  <li class="page-item"><a class="page-link" href="#">24</a></li>
  <li class="page-item"><a class="page-link" href="#" aria-label="Next page">›</a></li>
</ul>
</nav></div>

<div><span class="lbl">Compact for a card footer</span>
<nav aria-label="Pagination">
<ul class="pagination pagination-uic pagination-pill pagination-tight mb-0">
  <li class="page-item"><a class="page-link" href="#" aria-label="Previous page">‹</a></li>
  <li class="page-item"><a class="page-link" href="#">1</a></li>
  <li class="page-item"><a class="page-link" href="#">2</a></li>
  <li class="page-item"><a class="page-link active" href="#" aria-current="page">3</a></li>
  <li class="page-item"><a class="page-link" href="#">4</a></li>
  <li class="page-item"><a class="page-link" href="#">5</a></li>
  <li class="page-item disabled page-gap"><span class="page-link">…</span></li>
  <li class="page-item"><a class="page-link" href="#">24</a></li>
  <li class="page-item"><a class="page-link" href="#" aria-label="Next page">›</a></li>
</ul>
</nav></div>
CSS
.pagination-uic{
  --bs-pagination-padding-x:11px;--bs-pagination-padding-y:0;--bs-pagination-font-size:.88rem;
  --bs-pagination-color:#475569;--bs-pagination-bg:transparent;
  --bs-pagination-border-width:1px;--bs-pagination-border-color:transparent;--bs-pagination-border-radius:9px;
  --bs-pagination-hover-color:#0f172a;--bs-pagination-hover-bg:#e2e8f0;--bs-pagination-hover-border-color:transparent;
  --bs-pagination-focus-color:#475569;--bs-pagination-focus-bg:transparent;--bs-pagination-focus-box-shadow:none;
  --bs-pagination-active-color:#fff;--bs-pagination-active-bg:#2563eb;--bs-pagination-active-border-color:#2563eb;
  --bs-pagination-disabled-color:#64748b;--bs-pagination-disabled-bg:transparent;--bs-pagination-disabled-border-color:transparent;
  flex-wrap:wrap;align-items:center;gap:6px}
.pagination-uic .page-item .page-link{display:grid;place-items:center;min-width:38px;height:38px;font-weight:600;
  margin-left:0;border-radius:var(--bs-pagination-border-radius)}
.pagination-uic .page-link:focus-visible{outline:2px solid #2563eb;outline-offset:2px}
.pagination-uic .page-gap .page-link{min-width:26px;padding:0;background:transparent;border-color:transparent}
.pagination-pill{--bs-pagination-border-radius:999px;--bs-pagination-bg:#f1f5f9;--bs-pagination-focus-bg:#f1f5f9;
  --bs-pagination-active-bg:#0f172a;--bs-pagination-active-border-color:#0f172a}
.pagination-ring{--bs-pagination-border-radius:999px;--bs-pagination-bg:#fff;--bs-pagination-focus-bg:#fff;
  --bs-pagination-border-color:#e2e8f0;--bs-pagination-hover-border-color:#e2e8f0;
  --bs-pagination-active-bg:#fff;--bs-pagination-active-color:#2563eb;--bs-pagination-active-border-color:#2563eb}
.pagination-ring .page-link.active{box-shadow:0 0 0 3px #dbeafe}
.pagination-tight{--bs-pagination-padding-x:9px;--bs-pagination-font-size:.82rem;gap:3px}
.pagination-tight .page-item .page-link{min-width:32px;height:32px}
.pagination-tight .page-gap .page-link{min-width:26px}

Tailwind 4 code

Requires: Tailwind CSS 4

HTML
<div><span class="mb-4 block text-[.72rem] uppercase tracking-[.12em] text-slate-500">Filled pills</span>
<nav aria-label="Pagination">
<div class="inline-flex flex-wrap items-center gap-1.5">
  <a href="#" aria-label="Previous page" class="grid h-[38px] min-w-[38px] place-items-center text-[.88rem] font-semibold rounded-full px-[11px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand bg-slate-100 text-slate-600 hover:bg-slate-200 hover:text-slate-900 transition-[color,background-color,border-color] motion-reduce:transition-none">‹</a>
  <a href="#" class="grid h-[38px] min-w-[38px] place-items-center text-[.88rem] font-semibold rounded-full px-[11px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand bg-slate-100 text-slate-600 hover:bg-slate-200 hover:text-slate-900 transition-[color,background-color,border-color] motion-reduce:transition-none">1</a>
  <a href="#" class="grid h-[38px] min-w-[38px] place-items-center text-[.88rem] font-semibold rounded-full px-[11px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand bg-slate-100 text-slate-600 hover:bg-slate-200 hover:text-slate-900 transition-[color,background-color,border-color] motion-reduce:transition-none">2</a>
  <a href="#" aria-current="page" class="grid h-[38px] min-w-[38px] place-items-center text-[.88rem] font-semibold rounded-full px-[11px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand bg-slate-900 text-white">3</a>
  <a href="#" class="grid h-[38px] min-w-[38px] place-items-center text-[.88rem] font-semibold rounded-full px-[11px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand bg-slate-100 text-slate-600 hover:bg-slate-200 hover:text-slate-900 transition-[color,background-color,border-color] motion-reduce:transition-none">4</a>
  <a href="#" class="grid h-[38px] min-w-[38px] place-items-center text-[.88rem] font-semibold rounded-full px-[11px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand bg-slate-100 text-slate-600 hover:bg-slate-200 hover:text-slate-900 transition-[color,background-color,border-color] motion-reduce:transition-none">5</a>
  <span class="grid h-[38px] min-w-[26px] place-items-center font-semibold text-slate-500">…</span>
  <a href="#" class="grid h-[38px] min-w-[38px] place-items-center text-[.88rem] font-semibold rounded-full px-[11px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand bg-slate-100 text-slate-600 hover:bg-slate-200 hover:text-slate-900 transition-[color,background-color,border-color] motion-reduce:transition-none">24</a>
  <a href="#" aria-label="Next page" class="grid h-[38px] min-w-[38px] place-items-center text-[.88rem] font-semibold rounded-full px-[11px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand bg-slate-100 text-slate-600 hover:bg-slate-200 hover:text-slate-900 transition-[color,background-color,border-color] motion-reduce:transition-none">›</a>
</div>
</nav></div>

<div><span class="mb-4 block text-[.72rem] uppercase tracking-[.12em] text-slate-500">Ring on the current page</span>
<nav aria-label="Pagination">
<div class="inline-flex flex-wrap items-center gap-1.5">
  <a href="#" aria-label="Previous page" class="grid h-[38px] min-w-[38px] place-items-center text-[.88rem] font-semibold rounded-full px-[11px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand border border-slate-200 bg-white text-slate-600 hover:bg-slate-200 hover:text-slate-900 transition-[color,background-color,border-color] motion-reduce:transition-none">‹</a>
  <a href="#" class="grid h-[38px] min-w-[38px] place-items-center text-[.88rem] font-semibold rounded-full px-[11px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand border border-slate-200 bg-white text-slate-600 hover:bg-slate-200 hover:text-slate-900 transition-[color,background-color,border-color] motion-reduce:transition-none">1</a>
  <a href="#" class="grid h-[38px] min-w-[38px] place-items-center text-[.88rem] font-semibold rounded-full px-[11px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand border border-slate-200 bg-white text-slate-600 hover:bg-slate-200 hover:text-slate-900 transition-[color,background-color,border-color] motion-reduce:transition-none">2</a>
  <a href="#" aria-current="page" class="grid h-[38px] min-w-[38px] place-items-center text-[.88rem] font-semibold rounded-full px-[11px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand border border-brand bg-white text-brand shadow-[0_0_0_3px_#dbeafe]">3</a>
  <a href="#" class="grid h-[38px] min-w-[38px] place-items-center text-[.88rem] font-semibold rounded-full px-[11px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand border border-slate-200 bg-white text-slate-600 hover:bg-slate-200 hover:text-slate-900 transition-[color,background-color,border-color] motion-reduce:transition-none">4</a>
  <a href="#" class="grid h-[38px] min-w-[38px] place-items-center text-[.88rem] font-semibold rounded-full px-[11px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand border border-slate-200 bg-white text-slate-600 hover:bg-slate-200 hover:text-slate-900 transition-[color,background-color,border-color] motion-reduce:transition-none">5</a>
  <span class="grid h-[38px] min-w-[26px] place-items-center font-semibold text-slate-500">…</span>
  <a href="#" class="grid h-[38px] min-w-[38px] place-items-center text-[.88rem] font-semibold rounded-full px-[11px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand border border-slate-200 bg-white text-slate-600 hover:bg-slate-200 hover:text-slate-900 transition-[color,background-color,border-color] motion-reduce:transition-none">24</a>
  <a href="#" aria-label="Next page" class="grid h-[38px] min-w-[38px] place-items-center text-[.88rem] font-semibold rounded-full px-[11px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand border border-slate-200 bg-white text-slate-600 hover:bg-slate-200 hover:text-slate-900 transition-[color,background-color,border-color] motion-reduce:transition-none">›</a>
</div>
</nav></div>

<div><span class="mb-4 block text-[.72rem] uppercase tracking-[.12em] text-slate-500">Compact for a card footer</span>
<nav aria-label="Pagination">
<div class="inline-flex flex-wrap items-center gap-[3px]">
  <a href="#" aria-label="Previous page" class="grid h-8 min-w-8 place-items-center rounded-full px-[9px] text-[.82rem] font-semibold focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand bg-slate-100 text-slate-600 hover:bg-slate-200 hover:text-slate-900 transition-[color,background-color,border-color] motion-reduce:transition-none">‹</a>
  <a href="#" class="grid h-8 min-w-8 place-items-center rounded-full px-[9px] text-[.82rem] font-semibold focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand bg-slate-100 text-slate-600 hover:bg-slate-200 hover:text-slate-900 transition-[color,background-color,border-color] motion-reduce:transition-none">1</a>
  <a href="#" class="grid h-8 min-w-8 place-items-center rounded-full px-[9px] text-[.82rem] font-semibold focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand bg-slate-100 text-slate-600 hover:bg-slate-200 hover:text-slate-900 transition-[color,background-color,border-color] motion-reduce:transition-none">2</a>
  <a href="#" aria-current="page" class="grid h-8 min-w-8 place-items-center rounded-full px-[9px] text-[.82rem] font-semibold focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand bg-slate-900 text-white">3</a>
  <a href="#" class="grid h-8 min-w-8 place-items-center rounded-full px-[9px] text-[.82rem] font-semibold focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand bg-slate-100 text-slate-600 hover:bg-slate-200 hover:text-slate-900 transition-[color,background-color,border-color] motion-reduce:transition-none">4</a>
  <a href="#" class="grid h-8 min-w-8 place-items-center rounded-full px-[9px] text-[.82rem] font-semibold focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand bg-slate-100 text-slate-600 hover:bg-slate-200 hover:text-slate-900 transition-[color,background-color,border-color] motion-reduce:transition-none">5</a>
  <span class="grid h-[38px] min-w-[26px] place-items-center font-semibold text-slate-500">…</span>
  <a href="#" class="grid h-8 min-w-8 place-items-center rounded-full px-[9px] text-[.82rem] font-semibold focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand bg-slate-100 text-slate-600 hover:bg-slate-200 hover:text-slate-900 transition-[color,background-color,border-color] motion-reduce:transition-none">24</a>
  <a href="#" aria-label="Next page" class="grid h-8 min-w-8 place-items-center rounded-full px-[9px] text-[.82rem] font-semibold focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand bg-slate-100 text-slate-600 hover:bg-slate-200 hover:text-slate-900 transition-[color,background-color,border-color] motion-reduce:transition-none">›</a>
</div>
</nav></div>
CSS
@theme {
  --color-brand: #2563eb;
}

About this set

Fully rounded pagination for softer, friendlier interfaces. Filled pills gives every page a light grey circle and marks the current page with a solid near-black fill, which works well on white cards and marketing pages. Ring on the current page uses white bordered circles and shows the active page as a blue outline with a pale halo instead of a fill, a lighter option when the page already has several solid buttons. Compact for a card footer shrinks the same filled pills to 32px with a tighter gap so the control fits under a card, a comment list or a small table. All three are real links inside a nav labelled Pagination, with aria-current on the active page, aria-labels on the chevron arrows and an ellipsis for skipped pages. The rounded shape comes from a 999px radius, so single digits render as circles and two-digit numbers stretch into pills without extra markup. Rows wrap on narrow screens. The Bootstrap version sets –bs-pagination-border-radius on the native .pagination component; the Tailwind version uses rounded-full.

What’s included

  • Filled, ring and compact pill variants
  • Circles for single digits that stretch into pills for longer numbers
  • Ring variant marks the current page without a solid fill
  • Compact 32px size for card footers
  • Bootstrap version restyles .pagination through its CSS variables

Accessibility

Each row is a nav labelled Pagination with aria-current="page" on the active link and Previous page / Next page names on the arrows. Links show a 2px blue focus outline that sits outside the pill, separate from the ring used for the current page. Text and captions meet 4.5:1 contrast, and hover transitions are disabled under prefers-reduced-motion.

Customise it

In plain CSS change the #f1f5f9 pill background and #0f172a current fill in .pill, or the #2563eb ring colour in .ring. In Bootstrap edit --bs-pagination-bg and --bs-pagination-active-bg on .pagination-pill or .pagination-ring. In Tailwind swap bg-slate-100, bg-slate-900 and border-brand.