1. トップページ
  2. JavaScript(ES6) でページネーションを作成する

JavaScript(ES6) でページネーションを作成する

ページネーションとは

情報がたくさんあり、そのまま表示してしまうと読みづらいため、
ページを分割して情報を読みやすくするコンポーネントのことを指します。



Googleの検索結果ページの一番下などにも設置されており、
日常的に使用されているのはないでしょうか。
今回はES2015(ES6)を使用して、このコンポーネントを作成してみたいと思います。

成果物

CodeSandboxを使用して実装致しました。


解説

必要なHTMLを記述

<div class="container">
    <div>
        <span id="js-pagination-result-total"></span>件中
        <span id="js-pagination-result-range-text"></span>
    </div>
    <div>
        <button id="js-button-prev">
            前へ
        </button>
        <button id="js-button-next">
            次へ
        </button>
    </div>
    <div>
        <nav id="js-pagination-result-range"></nav>
        現在のページ: <span id="js-pagination-current"></span>
    </div>
</div>


必要なJavaScriptを記述する

jQueryは使用せず、ES2015(ES6)で書きました。
IE11などレガシーブラウザではそのままでは動作しません。
Babelなどを用いてトランスパイルしてください。

// 前へ_DOM指定
const prevButton = document.getElementById("js-button-prev");
// 次へ_DOM指定
const nextButton = document.getElementById("js-button-next");

// 総数
const globalTotalItem = 100;
// 1ページに表示したい件数
const PER_PAGE = 10;
// 初期ページ
var initialPage = 0;
// 現在のページ
var currentPage = 0;

// 配列を任意の数だけ作成
const range = (start, end) => {
  const array = [...Array(end - start + 1)].map((_, i) => {
    return start + i;
  });
  return array;
};

// 閲覧中の情報の件数の範囲を表示
const rangeCurrentPage = () => {
  if (!globalTotalItem) return;
  const start = currentPage * PER_PAGE + 1;
  const text =
    (currentPage + 1) * PER_PAGE < globalTotalItem
      ? `${start}件〜${(currentPage + 1) * PER_PAGE}件目を表示`
      : `${start}件〜${globalTotalItem}件目を表示`;
  return text;
};

// 前へボタン_アクション
prevButton.addEventListener("click", () => {
  if (initialPage >= currentPage) return;
  currentPage = currentPage - 1;
  render();
});
// 次へボタン_アクション
nextButton.addEventListener("click", () => {
  if (PER_PAGE * (currentPage + 1) >= globalTotalItem) return;
  currentPage = currentPage + 1;
  render();
});

// レンダリング
const render = () => {
  document.getElementById(
    "js-pagination-result-total"
  ).innerHTML = globalTotalItem;
  document.getElementById("js-pagination-result-range").innerHTML = range(
    1,
    Math.ceil(globalTotalItem / PER_PAGE)
  );
  document.getElementById(
    "js-pagination-result-range-text"
  ).innerHTML = rangeCurrentPage();
  document.getElementById("js-pagination-current").innerHTML = currentPage + 1;
};

render();


ここまでに紹介したHTMLとJSをコピペいただければ
問題なく動作するはずです。
ページ番号にリンクは指定されていないため、必要であれば自身で追加をお願いします。

最後に

もともと「○○件中 ○○件 ~ ○○件を表示」のテキストを出力するためスクリプトでしたが、
それだけではテストしづらいため、ページ番号を操作できるパーツをいくつか追加致しました。

参考にさせていただいたページ

参考サイトなし