Open demo

CSS code

HTML
<div><span class="lbl">Bordered segments</span><nav aria-label="Pagination">
<div class="pg seg"><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">Floating bar</span><nav aria-label="Pagination">
<div class="pg seg float2"><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">Arrows at the ends</span><nav aria-label="Pagination">
<div class="pg split"><a href="#">← Previous</a>
<span class="mid"><a href="#">1</a><a href="#" aria-current="page">2</a><a href="#">3</a><span class="gap">…</span><a href="#">9</a></span>
<a href="#">Next →</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{box-sizing:border-box;min-width:26px;color:#64748b;display:grid;place-items:center;height:38px;font-weight:600}
.pg a[aria-current]{background:#2563eb;color:#fff}

.seg{flex-wrap:nowrap;border:1px solid #e2e8f0;border-radius:10px;overflow:hidden;background:#fff;gap:0}
.seg a,.seg .gap{border-radius:0;border-right:1px solid #e2e8f0}
.seg a:last-child,.seg .gap:last-child{border-right:0}
.seg a:focus-visible{outline-offset:-3px}
.seg a[aria-current]{background:#2563eb;color:#fff}
.float2{box-shadow:0 3px 12px rgba(15,23,42,.13);border:0}
.split{display:flex;align-items:center;justify-content:space-between;row-gap:12px;width:100%;max-width:560px}
.split .mid{display:inline-flex;gap:5px}
.split a{border:1px solid #e2e8f0;background:#fff;border-radius:9px}
.split a[aria-current]{background:#2563eb;color:#fff;border-color:#2563eb}

@media(max-width:520px){
  .seg a{min-width:34px;padding:0 8px}
  .split .mid{order:-1;width:100%;justify-content:center}
}
@media(prefers-reduced-motion:reduce){.pg a{transition:none}}

Bootstrap 5 code

Requires: Bootstrap 5.3.8 CSS

HTML
<div><span class="lbl">Bordered segments</span>
<nav aria-label="Pagination">
<ul class="pagination pagination-seg 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">Floating bar</span>
<nav aria-label="Pagination">
<ul class="pagination pagination-seg pagination-float 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">Arrows at the ends</span>
<nav aria-label="Pagination" class="pagination-split">
<ul class="pagination pagination-uic pagination-bordered mb-0">
  <li class="page-item"><a class="page-link" href="#">← Previous</a></li>
</ul>
<ul class="pagination pagination-uic pagination-bordered pagination-pages mb-0">
  <li class="page-item"><a class="page-link" href="#">1</a></li>
  <li class="page-item"><a class="page-link active" href="#" aria-current="page">2</a></li>
  <li class="page-item"><a class="page-link" href="#">3</a></li>
  <li class="page-item disabled page-gap"><span class="page-link">…</span></li>
  <li class="page-item"><a class="page-link" href="#">9</a></li>
</ul>
<ul class="pagination pagination-uic pagination-bordered mb-0">
  <li class="page-item"><a class="page-link" href="#">Next →</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-bordered{--bs-pagination-bg:#fff;--bs-pagination-focus-bg:#fff;
  --bs-pagination-border-color:#e2e8f0;--bs-pagination-hover-border-color:#e2e8f0}
.pagination-seg{
  --bs-pagination-padding-x:11px;--bs-pagination-padding-y:0;--bs-pagination-font-size:.88rem;
  --bs-pagination-color:#475569;--bs-pagination-bg:#fff;--bs-pagination-border-color:#e2e8f0;--bs-pagination-border-radius:10px;
  --bs-pagination-hover-color:#0f172a;--bs-pagination-hover-bg:#e2e8f0;--bs-pagination-hover-border-color:#e2e8f0;
  --bs-pagination-focus-color:#475569;--bs-pagination-focus-bg:#fff;--bs-pagination-focus-box-shadow:none;
  --bs-pagination-active-bg:#2563eb;--bs-pagination-active-border-color:#2563eb;
  --bs-pagination-disabled-color:#64748b;--bs-pagination-disabled-bg:#fff;--bs-pagination-disabled-border-color:#e2e8f0}
.pagination-seg .page-link{display:grid;place-items:center;min-width:38px;height:38px;font-weight:600}
.pagination-seg .page-link:focus-visible{outline:2px solid #2563eb;outline-offset:-3px}
.pagination-seg .page-gap .page-link{min-width:26px;padding:0}
.pagination-float{width:fit-content;box-shadow:0 3px 12px rgba(15,23,42,.13);border-radius:10px}
.pagination-float .page-item .page-link{border-top-color:transparent;border-bottom-color:transparent}
.pagination-float .page-item:first-child .page-link{border-left-color:transparent}
.pagination-float .page-item:last-child .page-link{border-right-color:transparent}
.pagination-split{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px 6px;max-width:560px}
.pagination-split .pagination-pages{gap:5px}
@media(max-width:520px){
  .pagination-seg{--bs-pagination-padding-x:8px}
  .pagination-seg .page-link{min-width:34px}
  .pagination-split .pagination-pages{order:-1;width:100%;justify-content:center}
}

Tailwind 4 code

Requires: Tailwind CSS 4

HTML
<div><span class="mb-4 block text-[.72rem] uppercase tracking-[.12em] text-slate-500">Bordered segments</span>
<nav aria-label="Pagination">
<div class="inline-flex overflow-hidden rounded-[10px] border border-slate-200 bg-white">
  <a href="#" aria-label="Previous page" class="grid h-[38px] min-w-[38px] place-items-center border-r border-slate-200 px-[11px] text-[.88rem] font-semibold last:border-r-0 max-[520px]:min-w-[34px] max-[520px]:px-2 focus-visible:outline-2 focus-visible:outline-offset-[-3px] focus-visible:outline-brand 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 border-r border-slate-200 px-[11px] text-[.88rem] font-semibold last:border-r-0 max-[520px]:min-w-[34px] max-[520px]:px-2 focus-visible:outline-2 focus-visible:outline-offset-[-3px] focus-visible:outline-brand 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 border-r border-slate-200 px-[11px] text-[.88rem] font-semibold last:border-r-0 max-[520px]:min-w-[34px] max-[520px]:px-2 focus-visible:outline-2 focus-visible:outline-offset-[-3px] focus-visible:outline-brand 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 border-r border-slate-200 px-[11px] text-[.88rem] font-semibold last:border-r-0 max-[520px]:min-w-[34px] max-[520px]:px-2 focus-visible:outline-2 focus-visible:outline-offset-[-3px] focus-visible:outline-brand bg-brand text-white">3</a>
  <a href="#" class="grid h-[38px] min-w-[38px] place-items-center border-r border-slate-200 px-[11px] text-[.88rem] font-semibold last:border-r-0 max-[520px]:min-w-[34px] max-[520px]:px-2 focus-visible:outline-2 focus-visible:outline-offset-[-3px] focus-visible:outline-brand 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 border-r border-slate-200 px-[11px] text-[.88rem] font-semibold last:border-r-0 max-[520px]:min-w-[34px] max-[520px]:px-2 focus-visible:outline-2 focus-visible:outline-offset-[-3px] focus-visible:outline-brand 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 border-r border-slate-200 font-semibold text-slate-500">…</span>
  <a href="#" class="grid h-[38px] min-w-[38px] place-items-center border-r border-slate-200 px-[11px] text-[.88rem] font-semibold last:border-r-0 max-[520px]:min-w-[34px] max-[520px]:px-2 focus-visible:outline-2 focus-visible:outline-offset-[-3px] focus-visible:outline-brand 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 border-r border-slate-200 px-[11px] text-[.88rem] font-semibold last:border-r-0 max-[520px]:min-w-[34px] max-[520px]:px-2 focus-visible:outline-2 focus-visible:outline-offset-[-3px] focus-visible:outline-brand 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">Floating bar</span>
<nav aria-label="Pagination">
<div class="inline-flex overflow-hidden rounded-[10px] bg-white shadow-[0_3px_12px_rgba(15,23,42,.13)]">
  <a href="#" aria-label="Previous page" class="grid h-[38px] min-w-[38px] place-items-center border-r border-slate-200 px-[11px] text-[.88rem] font-semibold last:border-r-0 max-[520px]:min-w-[34px] max-[520px]:px-2 focus-visible:outline-2 focus-visible:outline-offset-[-3px] focus-visible:outline-brand 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 border-r border-slate-200 px-[11px] text-[.88rem] font-semibold last:border-r-0 max-[520px]:min-w-[34px] max-[520px]:px-2 focus-visible:outline-2 focus-visible:outline-offset-[-3px] focus-visible:outline-brand 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 border-r border-slate-200 px-[11px] text-[.88rem] font-semibold last:border-r-0 max-[520px]:min-w-[34px] max-[520px]:px-2 focus-visible:outline-2 focus-visible:outline-offset-[-3px] focus-visible:outline-brand 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 border-r border-slate-200 px-[11px] text-[.88rem] font-semibold last:border-r-0 max-[520px]:min-w-[34px] max-[520px]:px-2 focus-visible:outline-2 focus-visible:outline-offset-[-3px] focus-visible:outline-brand bg-brand text-white">3</a>
  <a href="#" class="grid h-[38px] min-w-[38px] place-items-center border-r border-slate-200 px-[11px] text-[.88rem] font-semibold last:border-r-0 max-[520px]:min-w-[34px] max-[520px]:px-2 focus-visible:outline-2 focus-visible:outline-offset-[-3px] focus-visible:outline-brand 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 border-r border-slate-200 px-[11px] text-[.88rem] font-semibold last:border-r-0 max-[520px]:min-w-[34px] max-[520px]:px-2 focus-visible:outline-2 focus-visible:outline-offset-[-3px] focus-visible:outline-brand 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 border-r border-slate-200 font-semibold text-slate-500">…</span>
  <a href="#" class="grid h-[38px] min-w-[38px] place-items-center border-r border-slate-200 px-[11px] text-[.88rem] font-semibold last:border-r-0 max-[520px]:min-w-[34px] max-[520px]:px-2 focus-visible:outline-2 focus-visible:outline-offset-[-3px] focus-visible:outline-brand 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 border-r border-slate-200 px-[11px] text-[.88rem] font-semibold last:border-r-0 max-[520px]:min-w-[34px] max-[520px]:px-2 focus-visible:outline-2 focus-visible:outline-offset-[-3px] focus-visible:outline-brand 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">Arrows at the ends</span>
<nav aria-label="Pagination">
<div class="flex w-full max-w-[560px] flex-wrap items-center justify-between gap-x-1.5 gap-y-3">
  <a href="#" class="grid h-[38px] min-w-[38px] place-items-center text-[.88rem] font-semibold rounded-[9px] border px-[11px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand 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">← Previous</a>
  <span class="inline-flex gap-[5px] max-[520px]:order-first max-[520px]:w-full max-[520px]:justify-center">
    <a href="#" class="grid h-[38px] min-w-[38px] place-items-center text-[.88rem] font-semibold rounded-[9px] border px-[11px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand 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="#" aria-current="page" class="grid h-[38px] min-w-[38px] place-items-center text-[.88rem] font-semibold rounded-[9px] border px-[11px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand border-brand bg-brand text-white">2</a>
    <a href="#" class="grid h-[38px] min-w-[38px] place-items-center text-[.88rem] font-semibold rounded-[9px] border px-[11px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand 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">3</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-[9px] border px-[11px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand 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">9</a>
  </span>
  <a href="#" class="grid h-[38px] min-w-[38px] place-items-center text-[.88rem] font-semibold rounded-[9px] border px-[11px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand 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">Next →</a>
</div>
</nav></div>
CSS
@theme {
  --color-brand: #2563eb;
}

About this set

Pagination that reads as one joined object rather than a row of separate buttons. Bordered segments places every page in a single outlined bar with thin dividers and a solid blue current segment, the familiar look of admin panels and data tools. Floating bar removes the outline and lifts the same bar on a soft shadow, suited to controls that sit over content or on a tinted surface. Arrows at the ends is a split layout: Previous is pushed to the left, Next to the right, and the page numbers stay centred between them, which suits article lists and search results that span the full content width. Below 520px the segmented bars tighten their padding so all nine segments still fit a phone screen, and the split layout moves the numbers onto their own centred row above the two arrows. Focus outlines on the joined bars are drawn inside each segment so the bar’s rounded clipping cannot hide them. Bootstrap’s own .pagination already joins its items, so the Bootstrap version keeps that behaviour and only restyles it with –bs-pagination variables.

What’s included

  • Joined bar with dividers and a solid current segment
  • Shadowed floating variant without an outline
  • Split layout with arrows pushed to the ends
  • Responsive tightening and re-flow below 520px
  • Focus outline drawn inside segments so it is never clipped

Accessibility

Every bar is a nav labelled Pagination; the active page has aria-current="page" and the chevrons are named Previous page and Next page. Keyboard focus shows a 2px blue outline, inset on the joined bars so the rounded container does not clip it. Captions and the ellipsis meet 4.5:1 contrast, and hover transitions stop under prefers-reduced-motion.

Customise it

In plain CSS change the #e2e8f0 divider and #2563eb current colour on .seg, and the shadow on .float2. In Bootstrap edit --bs-pagination-border-color and --bs-pagination-active-bg on .pagination-seg. In Tailwind swap border-slate-200, bg-brand and the shadow-[…] class.