ページネーション(Bootstrap)とレスポンシブ対応(rpage)
今回の記事では、主にページネーション機能の実装について書いていきます。ページネーションとは記事や検索結果をすべて表示するのではなく、複数のページに分割して1ページでは10件だけ表示するような以下の画像みたいなやつです。
Bootstrapによるページネーション
まずはHTMLでページネーションを作っていきます。Bootstrapによるページネーションを利用すると簡単なのでこちらを利用していきます。
getbootstrap.jp
レスポンシブ対応
上記のページネーションは、簡単に実装できますが、レスポンシブ対応になっていません。なのでページ数や画面サイズによっては2行、3行となってしまいきれいではないです。そこで、レスポンシブ対応にしていきたいのですが、そのためにはサードパーティー製の「rpage」というライブラリを使います。
github.com
上のGitHubレポジトリをダウンロードしてresponsive-paginate.jsをディレクトリ以下好きな場所に配置します。HTMLファイルでこのファイルを呼び出し、以下のコードを記述するだけで動きます。非常に簡単です!
$(document).ready(function () { $(".pagination").rPage(); });
ただBootstarpのコードをコピペしただけだとうまく動かないと思います。綺麗に表示させるためにいくつか変更を加えます。
- デフォルトのNext、Previousを消す
これを
<nav aria-label="Page navigation example"> <ul class="pagination"> <li class="page-item"><a class="page-link" href="#">Previous</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" href="#">3</a></li> <li class="page-item"><a class="page-link" href="#">Next</a></li> </ul> </nav>
このようにします。
<nav aria-label="Page navigation example"> <ul class="pagination"> <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" href="#">3</a></li> </ul> </nav>
- 「rpage」のGitHubページに書いてあるNext、Previousを追加
以下のコードを加えclassに「page-link」を記述(Next、Previous、disableのところ)
<nav aria-label="Page navigation example"> <ul class="pagination"> <li class="pagination-prev"><a href="#" class="page-link">Previous</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" href="#">3</a></li> <li class="pagination-next"><a href="#" class="page-link">Next</a></li> </ul> </nav>
- うまく幅が調整できないとき
一部がはみ出してしまう時などは、responsive-paginate.jsの44行目にある以下の数字を変更(例:10→100)
while (width > this.els.parent().parent().width() - 10)
- ページネーションを大きいサイズにする
Bootstarp公式のやり方でHTMLのコードをclass="pagenation pagenation-lg" (pagenation-lg追加)に変更するとともに、「rpage」における「...」を大きくするために以下のようにresponsive-paginate.jsの106、110行目のspanに「style='display: inline-block!important;padding: .75rem 1.5rem;'」を追加
this.els.eq(farthest_index - 2).before("<li class='disabled removable'><span style='display: inline-block!important;padding: .75rem 1.5rem;'>...</span></li>");
- 「...」を「・・・」に変更
上記のspanの中だけでなく76、137行目のIF文も変更
if (element.text() == "・・・")
Djangoにおけるページネーション
今までの内容でフロント部分は実装できると思います。最後に、Djangoのプロジェクトで、バックエンド側におけるページネーションを実装する時に参考にしたURLを貼っておきます。
office54.net