Pagination Control
This control lets you split large amounts of content into pages with navigation buttons and items per page dropdown.
See the Pen jPList Pagination Control by 1rosehip (@1rosehip) on CodePen.
HTML Structure
Pagination control is defined by required data-jplist-control="pagination"
data attribute. The data-group
attribute defines group of elements that should be paginated. The full list of data attributes can be found here.
<!-- jplist styles - should not be added if bootstrap or other CSS framework is used -->
<link href="jplist.styles.css" rel="stylesheet" type="text/css" />
<!-- pagination control -->
<div
data-jplist-control="pagination"
data-group="group1"
data-items-per-page="5"
data-current-page="0"
data-name="pagination1">
<button type="button" data-type="first">«</button>
<button type="button" data-type="prev">‹</button>
<div class="jplist-holder" data-type="pages">
<button type="button" data-type="page">Page {pageNumber}</button>
</div>
<button type="button" data-type="next">›</button>
<button type="button" data-type="last">»</button>
</div>
<!-- content to paginate -->
<div data-jplist-group="group1">
<!-- item -->
<div data-jplist-item>
...
</div>
<!-- item -->
<div data-jplist-item>
...
</div>
<!-- item -->
<div data-jplist-item>
...
</div>
</div>
<!-- jplist library -->
<script src="jplist.min.js"></script>
<script>
jplist.init();
</script>
Add / remove buttons
To show only page buttons just remove the other buttons:
<!-- pagination control -->
<div
data-jplist-control="pagination"
data-group="group1"
data-items-per-page="5"
data-current-page="0"
data-name="pagination1">
<div class="jplist-holder" data-type="pages">
<button type="button" data-type="page">Page {pageNumber}</button>
</div>
</div>
The same way it's possible to remove all buttons except previous and next buttons:
<!-- pagination control -->
<div
data-jplist-control="pagination"
data-group="group1"
data-items-per-page="5"
data-current-page="0"
data-name="pagination1">
<button type="button" data-type="prev">‹</button>
<button type="button" data-type="next">›</button>
</div>
Information Labels
Information labels can be used to print current page number, the whole pages number and other pagination data.
<!-- pagination control -->
<div
data-jplist-control="pagination"
data-group="group1"
data-items-per-page="5"
data-current-page="0"
data-name="pagination1">
...
<span data-type="info">
Page {pageNumber} of {pagesNumber}
</span>
<span data-type="info">
{startItem} - {endItem} of {itemsNumber}
</span>
</div>
Top and bottom panels
Pagination control can be placed in both top and bottom panels for the better user experience. In this case data-name
attribute with the same value should be added. data-items-per-page
and data-current-page
should also have the same values, but HTML structure including macros can be different:
<!-- pagination control in the top panel -->
<div
data-jplist-control="pagination"
data-group="group1"
data-name="name1"
data-items-per-page="5"
data-current-page="0">
<button type="button" data-type="first">«</button>
<button type="button" data-type="prev">‹</button>
<div class="jplist-holder" data-type="pages">
<button type="button" data-type="page">Page {pageNumber}</button>
</div>
<button type="button" data-type="next">›</button>
<button type="button" data-type="last">»</button>
<span data-type="info">
Page {pageNumber} of {pagesNumber}
</span>
</div>
<!-- content to paginate -->
<div data-jplist-group="group1">
<!-- item -->
<div data-jplist-item>
...
</div>
<!-- item -->
<div data-jplist-item>
...
</div>
<!-- item -->
<div data-jplist-item>
...
</div>
</div>
<!-- pagination control in the bottom panel -->
<div
data-jplist-control="pagination"
data-group="group1"
data-name="name1"
data-items-per-page="5"
data-current-page="0">
<button type="button" data-type="first">First Page</button>
<button type="button" data-type="prev">Previous Page</button>
<div class="jplist-holder" data-type="pages">
<button type="button" data-type="page">Page #{pageNumber}</button>
</div>
<button type="button" data-type="next">Next Page</button>
<button type="button" data-type="last">Last Page</button>
<span data-type="info">
{startItem} - {endItem} of {itemsNumber}
</span>
</div>
Items per page select
The number of items per page can be selected by the user using inner select control. The number of items is defined by the option value, where 0 means all items (1 page). data-items-per-page
data attribute defines the initial selected option.
<div
data-jplist-control="pagination"
data-group="group1"
data-items-per-page="10"
data-current-page="0"
data-name="pagination1">
<button type="button" data-type="first">«</button>
<button type="button" data-type="prev">‹</button>
<div class="jplist-holder" data-type="pages">
<button type="button" data-type="page">Page {pageNumber}</button>
</div>
<button type="button" data-type="next">›</button>
<button type="button" data-type="last">»</button>
<!-- items per page select -->
<select data-type="items-per-page">
<option value="3"> 3 per page </option>
<option value="5"> 5 per page </option>
<option value="10"> 10 per page </option>
<option value="0"> view all </option>
</select>
</div>
Items per page dropdown
UL / LI dropdown with custom styles can be used instead of SELECT as items per page selector. The number of items is defined by data-value data attribute, where 0 means all items (1 page). data-items-per-page
data attribute defines the initial selected value.
<div
data-jplist-control="pagination"
data-group="group1"
data-items-per-page="5"
data-current-page="0"
data-name="pagination1">
<button type="button" data-type="first">«</button>
<button type="button" data-type="prev">‹</button>
<div class="jplist-holder" data-type="pages">
<button type="button" data-type="page">Page {pageNumber}</button>
</div>
<button type="button" data-type="next">›</button>
<button type="button" data-type="last">»</button>
<!-- items per page dropdown -->
<div data-type="items-per-page-dd" class="jplist-dd">
<div data-type="panel" class="jplist-dd-panel">Items per page</div>
<div data-type="content" class="jplist-dd-content">
<div class="jplist-dd-item" data-value="3">3 per page</div>
<div class="jplist-dd-item" data-value="5">5 per page</div>
<div class="jplist-dd-item" data-value="10">10 per page</div>
<div class="jplist-dd-item" data-value="0">View all</div>
</div>
</div>
</div>
Bootstrap pagination example
The following example demonstrates how to use jPList pagination with bootstrap controls:
<!-- pagination control -->
<nav
data-jplist-control="pagination"
data-group="group1"
data-items-per-page="3"
data-current-page="0"
data-disabled-class="disabled"
data-selected-class="active"
data-name="pagination1">
<!-- first and previous buttons -->
<ul class="pagination d-inline-flex">
<li class="page-item" data-type="first"><a class="page-link" href="#">«</a></li>
<li class="page-item" data-type="prev"><a class="page-link" href="#">‹</a></li>
</ul>
<!-- pages buttons -->
<ul class="pagination d-inline-flex" data-type="pages">
<li class="page-item" data-type="page"><a class="page-link" href="#">{pageNumber}</a></li>
</ul>
<!-- next and last buttons -->
<ul class="pagination d-inline-flex">
<li class="page-item" data-type="next"><a class="page-link" href="#">›</a></li>
<li class="page-item" data-type="last"><a class="page-link" href="#">»</a></li>
</ul>
<!-- items per page dropdown -->
<div class="dropdown d-inline-flex ml-3"
data-type="items-per-page-dd"
data-opened-class="show">
<button
data-type="panel"
class="btn btn-primary dropdown-toggle"
type="button">
Dropdown button
</button>
<div
data-type="content"
class="dropdown-menu"
aria-labelledby="dropdownMenuButton">
<a class="dropdown-item" href="#" data-value="3">3 per page</a>
<a class="dropdown-item" href="#" data-value="6">6 per page</a>
<a class="dropdown-item" href="#" data-value="9">9 per page</a>
<a class="dropdown-item" href="#" data-value="0">View All</a>
</div>
</div>
<!-- information labels -->
<span data-type="info" class="badge badge-secondary ml-3 p-2">
Page {pageNumber} of {pagesNumber}
</span>
</nav>
Jump to top
data-jump
data attribute can be used to scroll page to the specified location when user clicks a page button. data-jump="top"
scrolls page to the top. Any CSS selector can be used instead of top keyword.
<!-- pagination control -->
<div
data-jplist-control="pagination"
data-group="group1"
data-items-per-page="5"
data-current-page="0"
data-jump="top"
data-name="pagination1">
...
</div>
<!-- content to paginate -->
<div data-jplist-group="group1">
<!-- item -->
<div data-jplist-item>
...
</div>
<!-- item -->
<div data-jplist-item>
...
</div>
<!-- item -->
<div data-jplist-item>
...
</div>
</div>
Pagination Classes
Pagination control has dynamically updated classes jplist-pages-number-... and jplist-items-number-.... For example it has jplist-pages-number-0 and jplist-items-number-0 classes after search that returns no results. This behaviour can be used to apply special styles to the inner pagination elements in different cases.
Also pagination control can accept different styles via data attributes. More details can be found here.
Deep Linking
Deep links can be used to keep user selections and control states after the page refresh. To implement them data-id
attribute should be added to HTML structure and deepLinking setting should be true in jPList parameters.
In the example below deep link may look like http://www.example.com/page#group=group1&paging1=0-5 where group1 is taken from data-jplist-group="group1"
, 0 is current selected page and 5 is the current number of items per page.
<!-- pagination control -->
<div
data-jplist-control="pagination"
data-group="group1"
data-items-per-page="5"
data-current-page="0"
data-id="paging1"
data-name="paging1">
...
</div>
<!-- content to paginate -->
<div data-jplist-group="group1">
<!-- item -->
<div data-jplist-item>
...
</div>
<!-- item -->
<div data-jplist-item>
...
</div>
<!-- item -->
<div data-jplist-item>
...
</div>
</div>
<script src="jplist.min.js"></script>
<script>
jplist.init({
deepLinking: true
});
</script>
Storage
Local storage, session storage or cookies can be used to keep user selections and control states after the page refresh. To implement them data-id
attribute should be added to HTML structure and storage setting should be passed to jPList constructor.
<!-- pagination control -->
<div
data-jplist-control="pagination"
data-group="group1"
data-items-per-page="5"
data-current-page="0"
data-id="paging1"
data-name="paging1">
...
</div>
<!-- content to paginate -->
<div data-jplist-group="group1">
<!-- item -->
<div data-jplist-item>
...
</div>
<!-- item -->
<div data-jplist-item>
...
</div>
<!-- item -->
<div data-jplist-item>
...
</div>
</div>
<script src="jplist.min.js"></script>
<script>
jplist.init({
storage: 'localStorage', //'localStorage', 'sessionStorage' or 'cookies'
storageName: 'my-page-storage' //the same storage name can be used to share storage between multiple pages
});
</script>
Data Attributes
The full list of pagination data attributes.
Name | Description | Values |
---|---|---|
data-jplist-control |
Defines pagination control. | "pagination" |
data-group |
Defines group of items that should be paginated. For example, if pagination control has data-group="group1" then items group should have data-jplist-group="group1" data attribute. | any text value |
data-name |
The data-name attribute is used to identify the same controls in different panels. Different controls should have different data-name attributes. By default, data-name attribute has default value. | any text value |
data-items-per-page |
Defines number of items per page. | numeric value |
data-current-page |
Defines initial page number starting from 0. | numeric value |
data-range |
Defines the maximal number of visible pagination button. | numeric value |
data-selected-class |
Optional data attribute that defines CSS class of selected / active page button. | CSS class name, by default jplist-selected |
data-disabled-class |
Optional data attribute that defines CSS class of disabled buttons and can be applied on first, previous, next, and last buttons. | CSS class name, by default jplist-disabled |
data-opened-class |
Optional data attribute that defines CSS class of opened items per page dropdown with custom styles. | CSS class name, by default jplist-dd-opened |
data-jump |
This data attribute can be used to scroll page to the specified location when user clicks a page button. data-jump="top" scrolls page to the top. Any CSS selector can be used instead of top keyword. | top keyword or any CSS selector |
data-id |
This attribute is used for deep linking. | any text value that may contain letters, digits, underscores or dashes |
Inner elements
Data attributes of inner elements.
Name | Description | Values |
---|---|---|
data-type="first" |
Defines a button. Once clicked, the first page will be opened. | "first" |
data-type="last" |
Defines a button. Once clicked, the last page will be opened. | "last" |
data-type="prev" |
Defines a button. Once clicked, the previous page will be opened. | "prev" |
data-type="next" |
Defines a button. Once clicked, the next page will be opened. | "next" |
data-type="page" |
Defines HTML of page button. Once clicked, the specified page number will be opened. | "next" |
data-type="info" |
Defines information label. | "info" |
data-type="items-per-page" |
Items per page select control. | "items-per-page" |
data-type="items-per-page-dd" |
Items per page UL / LI dropdown with custom styles. | "items-per-page-dd" |
Macros
The macros represent pagination data and can be used in information labels and other places.
Name | Description |
---|---|
{pageNumber} |
Indicates the current page number. Can be used in page button and in information labels. |
{pagesNumber} |
Indicates the whole pages number. Can be used in information labels. |
{startItem} |
Indicates starting content item. |
{endItem} |
Indicates ending content item. |
{itemsNumber} |
Indicates the number of content items. |