Bulma Pagination
Bulma Pagination component provides a clean and responsive way to navigate through multiple pages of content. It supports different sizes, styles, and can be easily customized.
Basic Pagination
Simple pagination with page numbers:
<nav class="pagination" role="navigation" aria-label="pagination">
<a class="pagination-previous">Previous</a>
<a class="pagination-next">Next</a>
<ul class="pagination-list">
<li><a class="pagination-link">1</a></li>
<li><a class="pagination-link is-current">2</a></li>
<li><a class="pagination-link">3</a></li>
</ul>
</nav>Disabled States
Disable previous/next buttons when appropriate:
<nav class="pagination">
<!-- Disabled previous button -->
<a class="pagination-previous" disabled>Previous</a>
<!-- Disabled next button -->
<a class="pagination-next" disabled>Next</a>
<ul class="pagination-list">
<li><a class="pagination-link is-current">1</a></li>
<li><a class="pagination-link">2</a></li>
<li><a class="pagination-link">3</a></li>
</ul>
</nav>Pagination with Icons
<nav class="pagination">
<a class="pagination-previous">
<span class="icon">
<i class="fas fa-chevron-left"></i>
</span>
<span>Previous</span>
</a>
<a class="pagination-next">
<span>Next</span>
<span class="icon">
<i class="fas fa-chevron-right"></i>
</span>
</a>
<ul class="pagination-list">
<li><a class="pagination-link">1</a></li>
<li><a class="pagination-link is-current">2</a></li>
<li><a class="pagination-link">3</a></li>
</ul>
</nav>Pagination Sizes
Control the size of pagination elements:
<!-- Small --> <nav class="pagination is-small"> <!-- Default --> <nav class="pagination"> <!-- Medium --> <nav class="pagination is-medium"> <!-- Large --> <nav class="pagination is-large">
Rounded Pagination
<nav class="pagination is-rounded">
<a class="pagination-previous">Previous</a>
<a class="pagination-next">Next</a>
<ul class="pagination-list">
<li><a class="pagination-link">1</a></li>
<li><a class="pagination-link is-current">2</a></li>
<li><a class="pagination-link">3</a></li>
</ul>
</nav>Pagination with Ellipsis
For large number of pages, use ellipsis:
<nav class="pagination">
<a class="pagination-previous">Previous</a>
<a class="pagination-next">Next</a>
<ul class="pagination-list">
<li><a class="pagination-link">1</a></li>
<li><span class="pagination-ellipsis">…</span></li>
<li><a class="pagination-link">45</a></li>
<li><a class="pagination-link is-current">46</a></li>
<li><a class="pagination-link">47</a></li>
<li><span class="pagination-ellipsis">…</span></li>
<li><a class="pagination-link">86</a></li>
</ul>
</nav>Centered and Aligned Pagination
<!-- Centered --> <nav class="pagination is-centered"> <!-- Right aligned --> <nav class="pagination is-right">
Responsive Pagination
Hide page numbers on mobile, show on desktop:
<nav class="pagination">
<a class="pagination-previous">Previous</a>
<a class="pagination-next">Next</a>
<ul class="pagination-list is-hidden-mobile">
<li><a class="pagination-link">1</a></li>
<li><a class="pagination-link is-current">2</a></li>
<li><a class="pagination-link">3</a></li>
</ul>
</nav>JavaScript Integration
Handle pagination clicks dynamically:
// Example: Dynamic pagination
let currentPage = 1;
const totalPages = 10;
function renderPagination() {
const pagination = document.getElementById('pagination');
let html = `
<nav class="pagination" role="navigation" aria-label="pagination">
<a class="pagination-previous" ${currentPage === 1 ? 'disabled' : ''}>
Previous
</a>
<a class="pagination-next" ${currentPage === totalPages ? 'disabled' : ''}>
Next
</a>
<ul class="pagination-list">
`;
// Always show first page
html += `<li><a class="pagination-link ${currentPage === 1 ? 'is-current' : ''}" data-page="1">1</a></li>`;
// Show ellipsis if needed
if (currentPage > 3) {
html += '<li><span class="pagination-ellipsis">…</span></li>';
}
// Show pages around current page
for (let i = Math.max(2, currentPage - 1); i <= Math.min(totalPages - 1, currentPage + 1); i++) {
html += `<li><a class="pagination-link ${currentPage === i ? 'is-current' : ''}" data-page="${i}">${i}</a></li>`;
}
// Show ellipsis if needed
if (currentPage < totalPages - 2) {
html += '<li><span class="pagination-ellipsis">…</span></li>';
}
// Always show last page
if (totalPages > 1) {
html += `<li><a class="pagination-link ${currentPage === totalPages ? 'is-current' : ''}" data-page="${totalPages}">${totalPages}</a></li>`;
}
html += '</ul></nav>';
pagination.innerHTML = html;
// Add event listeners
pagination.querySelectorAll('.pagination-link').forEach(link => {
link.addEventListener('click', (e) => {
e.preventDefault();
currentPage = parseInt(e.target.dataset.page);
renderPagination();
loadPage(currentPage);
});
});
pagination.querySelector('.pagination-previous').addEventListener('click', (e) => {
if (currentPage > 1) {
currentPage--;
renderPagination();
loadPage(currentPage);
}
});
pagination.querySelector('.pagination-next').addEventListener('click', (e) => {
if (currentPage < totalPages) {
currentPage++;
renderPagination();
loadPage(currentPage);
}
});
}
function loadPage(page) {
// Your logic to load page content
console.log('Loading page:', page);
}Practical Examples
Table Pagination
<div class="table-container">
<table class="table is-fullwidth">
<!-- Table content -->
</table>
</div>
<nav class="pagination is-centered mt-4">
<a class="pagination-previous">Previous</a>
<a class="pagination-next">Next</a>
<ul class="pagination-list">
<li><a class="pagination-link">1</a></li>
<li><a class="pagination-link is-current">2</a></li>
<li><a class="pagination-link">3</a></li>
<li><span class="pagination-ellipsis">…</span></li>
<li><a class="pagination-link">10</a></li>
</ul>
</nav>Blog Pagination
<div class="columns is-multiline">
<!-- Blog posts -->
</div>
<nav class="pagination is-centered mt-6">
<a class="pagination-previous">
<span class="icon"><i class="fas fa-arrow-left"></i></span>
<span>Older Posts</span>
</a>
<a class="pagination-next">
<span>Newer Posts</span>
<span class="icon"><i class="fas fa-arrow-right"></i></span>
</a>
<ul class="pagination-list is-hidden-touch">
<li><a class="pagination-link">1</a></li>
<li><a class="pagination-link is-current">2</a></li>
<li><a class="pagination-link">3</a></li>
<li><span class="pagination-ellipsis">…</span></li>
<li><a class="pagination-link">8</a></li>
</ul>
</nav>E-commerce Product Pagination
<div class="level">
<div class="level-left">
<div class="level-item">
<p class="has-text-grey">Showing 1-12 of 120 products</p>
</div>
</div>
<div class="level-right">
<div class="level-item">
<nav class="pagination">
<a class="pagination-previous">Previous</a>
<a class="pagination-next">Next</a>
<ul class="pagination-list">
<li><a class="pagination-link">1</a></li>
<li><a class="pagination-link is-current">2</a></li>
<li><a class="pagination-link">3</a></li>
<li><span class="pagination-ellipsis">…</span></li>
<li><a class="pagination-link">10</a></li>
</ul>
</nav>
</div>
</div>
</div>Best Practices
- Always include ARIA labels for accessibility
- Disable previous button on first page and next button on last page
- Use ellipsis for large page ranges to maintain clean design
- Consider mobile users - hide page numbers on small screens if space is limited
- Highlight current page clearly with
is-currentclass - Provide clear navigation labels (Previous/Next)
Pro Tip: Combine pagination with
.level component to show item counts and page navigation in a clean horizontal layout.Next: Bulma Panel Component