Chuyển đến nội dung chính

CSS-only Tailwind CSS pagination for numbered pages, prev/next arrows, ellipsis gaps, accessible radio inputs, and a page-jump select. No JavaScript required. WCAG AA accessible, works with Django, HTMX, Laravel, React, and any stack.

Các thành phần phân trang cho phép người dùng điều hướng giữa các trang nội dung - kết quả tìm kiếm, bảng dữ liệu, kho lưu trữ bài viết và danh sách sản phẩm. Được xây dựng bằng cách kết hợp các thành phần Tham giaNút, phân trang Frutjam không yêu cầu JavaScript và không cần CSS bổ sung. Hỗ trợ các trang được đánh số, mũi tên trước/tiếp theo, khoảng trống dấu ba chấm, đầu vào radio có thể truy cập và chọn nhảy trang.

Chỉ CSS, không cần JavaScript — xây dựng khả năng phân trang có thể truy cập bằng HTML thuần túy và CSS Tailwind. WCAG AA có thể truy cập và không phụ thuộc vào khung — hoạt động với Django, HTMX, Laravel, React, Next.js và bất kỳ ngăn xếp nào.

Lớp học Kiểu Sự miêu tả
joinCăn cứNhóm các nút vào một dải phân trang được kết nối
join-itemCông cụ sửa đổiMỗi nút trang hoặc đầu vào bên trong liên kết
btn-activeStateLàm nổi bật trang hiện tại
btn-disabledStateDấu chấm lửng không tương tác hoặc trang không có sẵn

Phân trang cơ bản

Một dải trang được đánh số với một trang đang hoạt động. Áp dụng btn-active để đánh dấu trang hiện tại. Sử dụng thẻ neo thay vì nút cho các liên kết trang do máy chủ hiển thị.

1
2
3
4
5
6
7
<div class="join">
  <button class="join-item btn">1</button>
  <button class="join-item btn btn-active">2</button>
  <button class="join-item btn">3</button>
  <button class="join-item btn">4</button>
  <button class="join-item btn">5</button>
</div>
1
2
3
4
5
6
7
<div className="join">
  <button className="join-item btn">1</button>
  <button className="join-item btn btn-active">2</button>
  <button className="join-item btn">3</button>
  <button className="join-item btn">4</button>
  <button className="join-item btn">5</button>
</div>

Sizes

Phân trang kế thừa tất cả các kích thước nút. Sử dụng btn-xs hoặc btn-sm cho các bảng nhỏ gọn và btn-lg cho giao diện cảm ứng đầu tiên.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<div class="flex flex-col gap-3 items-start">
  <div class="join">
    <button class="join-item btn btn-xs">1</button>
    <button class="join-item btn btn-xs btn-active">2</button>
    <button class="join-item btn btn-xs">3</button>
    <button class="join-item btn btn-xs">4</button>
  </div>
  <div class="join">
    <button class="join-item btn btn-sm">1</button>
    <button class="join-item btn btn-sm btn-active">2</button>
    <button class="join-item btn btn-sm">3</button>
    <button class="join-item btn btn-sm">4</button>
  </div>
  <div class="join">
    <button class="join-item btn">1</button>
    <button class="join-item btn btn-active">2</button>
    <button class="join-item btn">3</button>
    <button class="join-item btn">4</button>
  </div>
  <div class="join">
    <button class="join-item btn btn-lg">1</button>
    <button class="join-item btn btn-lg btn-active">2</button>
    <button class="join-item btn btn-lg">3</button>
    <button class="join-item btn btn-lg">4</button>
  </div>
</div>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<div className="flex flex-col gap-3 items-start">
  <div className="join">
    <button className="join-item btn btn-xs">1</button>
    <button className="join-item btn btn-xs btn-active">2</button>
    <button className="join-item btn btn-xs">3</button>
    <button className="join-item btn btn-xs">4</button>
  </div>
  <div className="join">
    <button className="join-item btn btn-sm">1</button>
    <button className="join-item btn btn-sm btn-active">2</button>
    <button className="join-item btn btn-sm">3</button>
    <button className="join-item btn btn-sm">4</button>
  </div>
  <div className="join">
    <button className="join-item btn">1</button>
    <button className="join-item btn btn-active">2</button>
    <button className="join-item btn">3</button>
    <button className="join-item btn">4</button>
  </div>
  <div className="join">
    <button className="join-item btn btn-lg">1</button>
    <button className="join-item btn btn-lg btn-active">2</button>
    <button className="join-item btn btn-lg">3</button>
    <button className="join-item btn btn-lg">4</button>
  </div>
</div>

Với dấu ba chấm

Sử dụng btn-disabled để tạo khoảng cách dấu chấm lửng giữa nhiều trang. Trình đọc màn hình bỏ qua các nút bị tắt để ghép nối với aria-hidden="true" trên dấu chấm lửng.

1
2
3
4
5
6
7
8
9
<div class="join">
  <button class="join-item btn">1</button>
  <button class="join-item btn">2</button>
  <button class="join-item btn btn-disabled" aria-hidden="true">...</button>
  <button class="join-item btn btn-active">12</button>
  <button class="join-item btn btn-disabled" aria-hidden="true">...</button>
  <button class="join-item btn">99</button>
  <button class="join-item btn">100</button>
</div>
1
2
3
4
5
6
7
8
9
<div className="join">
  <button className="join-item btn">1</button>
  <button className="join-item btn">2</button>
  <button className="join-item btn btn-disabled" aria-hidden="true">...</button>
  <button className="join-item btn btn-active">12</button>
  <button className="join-item btn btn-disabled" aria-hidden="true">...</button>
  <button className="join-item btn">99</button>
  <button className="join-item btn">100</button>
</div>

Điều hướng Trước/Tiếp theo

Phân trang dựa trên mũi tên là mẫu phổ biến nhất cho blog, danh sách sản phẩm và bất kỳ nguồn cấp dữ liệu được phân trang nào mà việc hiển thị số trang chính xác là không thực tế.

Với các biểu tượng mũi tên

1
2
3
4
5
6
7
8
9
<div class="join">
  <button class="join-item btn" aria-label="Previous page">
    <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 18l-6-6 6-6"/></svg>
  </button>
  <button class="join-item btn">Page 12</button>
  <button class="join-item btn" aria-label="Next page">
    <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 18l6-6-6-6"/></svg>
  </button>
</div>
1
2
3
4
5
6
7
8
9
<div className="join">
  <button className="join-item btn" aria-label="Previous page">
    <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M15 18l-6-6 6-6"/></svg>
  </button>
  <button className="join-item btn">Page 12</button>
  <button className="join-item btn" aria-label="Next page">
    <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M9 18l6-6-6-6"/></svg>
  </button>
</div>

Chiều rộng bằng nhau Trước / Tiếp theo

Sử dụng trình bao bọc grid Grid-cols-2 trên vùng chứa liên kết để cung cấp cho cả hai nút chiều rộng bằng nhau — lý tưởng cho bố cục ưu tiên thiết bị di động và thanh phân trang có chiều rộng đầy đủ.

1
2
3
4
<div class="join grid grid-cols-2 w-72">
  <button class="join-item btn btn-outline">← Previous</button>
  <button class="join-item btn btn-outline">Next →</button>
</div>
1
2
3
4
<div className="join grid grid-cols-2 w-72">
  <button className="join-item btn btn-outline"> Previous</button>
  <button className="join-item btn btn-outline">Next </button>
</div>

Với Đầu tiên / Cuối cùng

Thêm các nút mũi tên kép để cho phép người dùng chuyển trực tiếp đến trang đầu tiên hoặc trang cuối cùng. Hữu ích cho các bảng dữ liệu có hàng trăm trang.

1
2
3
4
5
6
7
8
9
<div class="join">
  <button class="join-item btn btn-ghost btn-sm" aria-label="First page">«</button>
  <button class="join-item btn btn-sm" aria-label="Previous page"></button>
  <button class="join-item btn btn-sm">4</button>
  <button class="join-item btn btn-sm btn-active">5</button>
  <button class="join-item btn btn-sm">6</button>
  <button class="join-item btn btn-sm" aria-label="Next page"></button>
  <button class="join-item btn btn-ghost btn-sm" aria-label="Last page">»</button>
</div>
1
2
3
4
5
6
7
8
9
<div className="join">
  <button className="join-item btn btn-ghost btn-sm" aria-label="First page">«</button>
  <button className="join-item btn btn-sm" aria-label="Previous page"></button>
  <button className="join-item btn btn-sm">4</button>
  <button className="join-item btn btn-sm btn-active">5</button>
  <button className="join-item btn btn-sm">6</button>
  <button className="join-item btn btn-sm" aria-label="Next page"></button>
  <button className="join-item btn btn-ghost btn-sm" aria-label="Last page">»</button>
</div>

Phân trang vô tuyến có thể truy cập

Sử dụng đầu vào type="radio" làm mục kết hợp để chọn trang chỉ có CSS, có thể điều hướng hoàn toàn bằng bàn phím mà không có JavaScript. Mỗi đầu vào hoạt động như một nút có thể nhấn trong khi vẫn giữ trạng thái đã chọn ở trạng thái dạng gốc.

1
2
3
4
5
6
7
<div class="join">
  <input class="join-item btn btn-square" type="radio" name="page" aria-label="1" />
  <input class="join-item btn btn-square" type="radio" name="page" aria-label="2" checked />
  <input class="join-item btn btn-square" type="radio" name="page" aria-label="3" />
  <input class="join-item btn btn-square" type="radio" name="page" aria-label="4" />
  <input class="join-item btn btn-square" type="radio" name="page" aria-label="5" />
</div>
1
2
3
4
5
6
7
<div className="join">
  <input className="join-item btn btn-square" type="radio" name="page" aria-label="1" />
  <input className="join-item btn btn-square" type="radio" name="page" aria-label="2" defaultChecked />
  <input className="join-item btn btn-square" type="radio" name="page" aria-label="3" />
  <input className="join-item btn btn-square" type="radio" name="page" aria-label="4" />
  <input className="join-item btn btn-square" type="radio" name="page" aria-label="5" />
</div>

Phân trang bằng cách nhảy trang

Kết hợp các nút nối, nút và lựa chọn cho thanh phân trang nhỏ gọn cho phép người dùng chuyển trực tiếp đến bất kỳ trang nào — phổ biến trong bảng thông tin quản trị viên, giao diện CMS và ứng dụng nặng dữ liệu. Không cần JavaScript cho chính lựa chọn đó; ghép nối với HTMLX hoặc gửi biểu mẫu để điều hướng phía máy chủ.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<div class="join">
  <button class="join-item btn btn-sm" aria-label="Previous page"></button>
  <select class="join-item select select-sm" aria-label="Go to page">
    <option>Page 1</option>
    <option>Page 2</option>
    <option selected>Page 3</option>
    <option>Page 4</option>
    <option>Page 5</option>
  </select>
  <button class="join-item btn btn-sm" aria-label="Next page"></button>
</div>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<div className="join">
  <button className="join-item btn btn-sm" aria-label="Previous page"></button>
  <select className="join-item select select-sm" aria-label="Go to page">
    <option>Page 1</option>
    <option>Page 2</option>
    <option>Page 3</option>
    <option>Page 4</option>
    <option>Page 5</option>
  </select>
  <button className="join-item btn btn-sm" aria-label="Next page"></button>
</div>

Phong cách phác thảo

Sử dụng btn-outline trên tất cả các nút để có hình ảnh nhẹ nhàng hơn, phù hợp với các phần nội dung phụ và thanh bên.

1
2
3
4
5
6
7
<div class="join">
  <button class="join-item btn btn-outline btn-sm" aria-label="Previous page"></button>
  <button class="join-item btn btn-outline btn-sm">1</button>
  <button class="join-item btn btn-outline btn-sm btn-active">2</button>
  <button class="join-item btn btn-outline btn-sm">3</button>
  <button class="join-item btn btn-outline btn-sm" aria-label="Next page"></button>
</div>
1
2
3
4
5
6
7
<div className="join">
  <button className="join-item btn btn-outline btn-sm" aria-label="Previous page"></button>
  <button className="join-item btn btn-outline btn-sm">1</button>
  <button className="join-item btn btn-outline btn-sm btn-active">2</button>
  <button className="join-item btn btn-outline btn-sm">3</button>
  <button className="join-item btn btn-outline btn-sm" aria-label="Next page"></button>
</div>