省略記号(…)付きページネーションを作る方法
省略記号(…)付きページネーションを作る方法を紹介します。このサンプルでは、No.1〜No.20までの20枚の記事カードを用意し、1ページにつき2枚ずつ表示します。全10ページのページ番号をすべて並べるのではなく、現在のページや先頭・最後のページを残しながら、途中のページ番号を「…」で省略して表示します。ページ数が多い一覧でも、ページネーションが横に長くなりすぎるのを防げます。
1ページ目ではNo.1とNo.2、2ページ目ではNo.3とNo.4というように、20枚の記事カードを10ページに分けて表示します。現在のページに合わせて表示するページ番号と省略記号の位置が自動で変わるため、前半・中央・後半のどのページを表示しているか確認しながら移動できます。記事数が多いブログの記事一覧、ECサイトの商品一覧、管理画面のデータ一覧、会員サイトのコンテンツ一覧など、ページ数が増えやすい画面で利用できます。
HTMLでは20枚の記事カードとページ番号を表示する領域を配置し、CSSではカード、ページ番号、省略記号のデザインを整えます。JavaScriptでは1ページに表示する件数を2件に設定し、現在のページに該当するカードだけを表示するとともに、現在位置に合わせて必要なページ番号と「…」を生成します。記事カードの内容や枚数、1ページに表示する件数などを用途に合わせて変更でき、レスポンシブにも対応しているため、スマートフォン・タブレット・PCで利用できます。
免責事項 本コードの利用により発生した損害について、当サイトは一切の責任を負いません。
デモ
20枚の記事カードを1ページにつき2枚ずつ表示します。
1件目のサンプル記事です。ここに記事の説明文を表示します。
2件目のサンプル記事です。ここに記事の説明文を表示します。
3件目のサンプル記事です。ここに記事の説明文を表示します。
4件目のサンプル記事です。ここに記事の説明文を表示します。
5件目のサンプル記事です。ここに記事の説明文を表示します。
6件目のサンプル記事です。ここに記事の説明文を表示します。
7件目のサンプル記事です。ここに記事の説明文を表示します。
8件目のサンプル記事です。ここに記事の説明文を表示します。
9件目のサンプル記事です。ここに記事の説明文を表示します。
10件目のサンプル記事です。ここに記事の説明文を表示します。
11件目のサンプル記事です。ここに記事の説明文を表示します。
12件目のサンプル記事です。ここに記事の説明文を表示します。
13件目のサンプル記事です。ここに記事の説明文を表示します。
14件目のサンプル記事です。ここに記事の説明文を表示します。
15件目のサンプル記事です。ここに記事の説明文を表示します。
16件目のサンプル記事です。ここに記事の説明文を表示します。
17件目のサンプル記事です。ここに記事の説明文を表示します。
18件目のサンプル記事です。ここに記事の説明文を表示します。
19件目のサンプル記事です。ここに記事の説明文を表示します。
20件目のサンプル記事です。ここに記事の説明文を表示します。
ページ番号をクリックしてください。現在のページに合わせてページ番号の一部が「…」で省略され、記事カードが2枚ずつ切り替わります。
コードをコピーして使おう!
<!DOCTYPE html>
<html lang="ja">
<head>
<!-- 文字コード -->
<meta charset="UTF-8">
<!-- スマートフォン対応 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- ページタイトル。用途に合わせて自由に変更できます -->
<title>省略記号(…)付きページネーション</title>
<!-- ページネーションと記事カードのデザインを設定するCSS -->
<link rel="stylesheet" href="style.css">
</head>
<body>
<!--
ページネーション全体。
ここは記事一覧とページネーションをまとめる部分です。
-->
<div class="ellipsis-pagination_wrap">
<!-- 一覧のタイトル。用途に合わせて自由に書き換えられます -->
<div class="ellipsis-pagination_title">
記事一覧
</div>
<!-- 一覧の説明文。表示する内容に合わせて変更できます -->
<p class="ellipsis-pagination_text">
20枚の記事カードを1ページにつき2枚ずつ表示します。
</p>
<!--
ページ分割する記事一覧。
この中のarticle要素が実際にページネーションで切り替わります。
タイトルや説明文は自由に書き換えられます。
article要素を追加・削除すると記事カードの総数を変更できます。
-->
<div class="ellipsis-pagination_list">
<!-- 1件目の記事カード -->
<article class="ellipsis-pagination_card" data-ellipsis-pagination-card>
<div class="ellipsis-pagination_number">No.1</div>
<div class="ellipsis-pagination_card-title">サンプル記事 1</div>
<p class="ellipsis-pagination_card-text">
1件目のサンプル記事です。ここに記事の説明文を表示します。
</p>
</article>
<!-- 2件目の記事カード -->
<article class="ellipsis-pagination_card" data-ellipsis-pagination-card>
<div class="ellipsis-pagination_number">No.2</div>
<div class="ellipsis-pagination_card-title">サンプル記事 2</div>
<p class="ellipsis-pagination_card-text">
2件目のサンプル記事です。ここに記事の説明文を表示します。
</p>
</article>
<!-- 3件目の記事カード -->
<article class="ellipsis-pagination_card" data-ellipsis-pagination-card>
<div class="ellipsis-pagination_number">No.3</div>
<div class="ellipsis-pagination_card-title">サンプル記事 3</div>
<p class="ellipsis-pagination_card-text">
3件目のサンプル記事です。ここに記事の説明文を表示します。
</p>
</article>
<!-- 4件目の記事カード -->
<article class="ellipsis-pagination_card" data-ellipsis-pagination-card>
<div class="ellipsis-pagination_number">No.4</div>
<div class="ellipsis-pagination_card-title">サンプル記事 4</div>
<p class="ellipsis-pagination_card-text">
4件目のサンプル記事です。ここに記事の説明文を表示します。
</p>
</article>
<!-- 5件目の記事カード -->
<article class="ellipsis-pagination_card" data-ellipsis-pagination-card>
<div class="ellipsis-pagination_number">No.5</div>
<div class="ellipsis-pagination_card-title">サンプル記事 5</div>
<p class="ellipsis-pagination_card-text">
5件目のサンプル記事です。ここに記事の説明文を表示します。
</p>
</article>
<!-- 6件目の記事カード -->
<article class="ellipsis-pagination_card" data-ellipsis-pagination-card>
<div class="ellipsis-pagination_number">No.6</div>
<div class="ellipsis-pagination_card-title">サンプル記事 6</div>
<p class="ellipsis-pagination_card-text">
6件目のサンプル記事です。ここに記事の説明文を表示します。
</p>
</article>
<!-- 7件目の記事カード -->
<article class="ellipsis-pagination_card" data-ellipsis-pagination-card>
<div class="ellipsis-pagination_number">No.7</div>
<div class="ellipsis-pagination_card-title">サンプル記事 7</div>
<p class="ellipsis-pagination_card-text">
7件目のサンプル記事です。ここに記事の説明文を表示します。
</p>
</article>
<!-- 8件目の記事カード -->
<article class="ellipsis-pagination_card" data-ellipsis-pagination-card>
<div class="ellipsis-pagination_number">No.8</div>
<div class="ellipsis-pagination_card-title">サンプル記事 8</div>
<p class="ellipsis-pagination_card-text">
8件目のサンプル記事です。ここに記事の説明文を表示します。
</p>
</article>
<!-- 9件目の記事カード -->
<article class="ellipsis-pagination_card" data-ellipsis-pagination-card>
<div class="ellipsis-pagination_number">No.9</div>
<div class="ellipsis-pagination_card-title">サンプル記事 9</div>
<p class="ellipsis-pagination_card-text">
9件目のサンプル記事です。ここに記事の説明文を表示します。
</p>
</article>
<!-- 10件目の記事カード -->
<article class="ellipsis-pagination_card" data-ellipsis-pagination-card>
<div class="ellipsis-pagination_number">No.10</div>
<div class="ellipsis-pagination_card-title">サンプル記事 10</div>
<p class="ellipsis-pagination_card-text">
10件目のサンプル記事です。ここに記事の説明文を表示します。
</p>
</article>
<!-- 11件目の記事カード -->
<article class="ellipsis-pagination_card" data-ellipsis-pagination-card>
<div class="ellipsis-pagination_number">No.11</div>
<div class="ellipsis-pagination_card-title">サンプル記事 11</div>
<p class="ellipsis-pagination_card-text">
11件目のサンプル記事です。ここに記事の説明文を表示します。
</p>
</article>
<!-- 12件目の記事カード -->
<article class="ellipsis-pagination_card" data-ellipsis-pagination-card>
<div class="ellipsis-pagination_number">No.12</div>
<div class="ellipsis-pagination_card-title">サンプル記事 12</div>
<p class="ellipsis-pagination_card-text">
12件目のサンプル記事です。ここに記事の説明文を表示します。
</p>
</article>
<!-- 13件目の記事カード -->
<article class="ellipsis-pagination_card" data-ellipsis-pagination-card>
<div class="ellipsis-pagination_number">No.13</div>
<div class="ellipsis-pagination_card-title">サンプル記事 13</div>
<p class="ellipsis-pagination_card-text">
13件目のサンプル記事です。ここに記事の説明文を表示します。
</p>
</article>
<!-- 14件目の記事カード -->
<article class="ellipsis-pagination_card" data-ellipsis-pagination-card>
<div class="ellipsis-pagination_number">No.14</div>
<div class="ellipsis-pagination_card-title">サンプル記事 14</div>
<p class="ellipsis-pagination_card-text">
14件目のサンプル記事です。ここに記事の説明文を表示します。
</p>
</article>
<!-- 15件目の記事カード -->
<article class="ellipsis-pagination_card" data-ellipsis-pagination-card>
<div class="ellipsis-pagination_number">No.15</div>
<div class="ellipsis-pagination_card-title">サンプル記事 15</div>
<p class="ellipsis-pagination_card-text">
15件目のサンプル記事です。ここに記事の説明文を表示します。
</p>
</article>
<!-- 16件目の記事カード -->
<article class="ellipsis-pagination_card" data-ellipsis-pagination-card>
<div class="ellipsis-pagination_number">No.16</div>
<div class="ellipsis-pagination_card-title">サンプル記事 16</div>
<p class="ellipsis-pagination_card-text">
16件目のサンプル記事です。ここに記事の説明文を表示します。
</p>
</article>
<!-- 17件目の記事カード -->
<article class="ellipsis-pagination_card" data-ellipsis-pagination-card>
<div class="ellipsis-pagination_number">No.17</div>
<div class="ellipsis-pagination_card-title">サンプル記事 17</div>
<p class="ellipsis-pagination_card-text">
17件目のサンプル記事です。ここに記事の説明文を表示します。
</p>
</article>
<!-- 18件目の記事カード -->
<article class="ellipsis-pagination_card" data-ellipsis-pagination-card>
<div class="ellipsis-pagination_number">No.18</div>
<div class="ellipsis-pagination_card-title">サンプル記事 18</div>
<p class="ellipsis-pagination_card-text">
18件目のサンプル記事です。ここに記事の説明文を表示します。
</p>
</article>
<!-- 19件目の記事カード -->
<article class="ellipsis-pagination_card" data-ellipsis-pagination-card>
<div class="ellipsis-pagination_number">No.19</div>
<div class="ellipsis-pagination_card-title">サンプル記事 19</div>
<p class="ellipsis-pagination_card-text">
19件目のサンプル記事です。ここに記事の説明文を表示します。
</p>
</article>
<!-- 20件目の記事カード -->
<article class="ellipsis-pagination_card" data-ellipsis-pagination-card>
<div class="ellipsis-pagination_number">No.20</div>
<div class="ellipsis-pagination_card-title">サンプル記事 20</div>
<p class="ellipsis-pagination_card-text">
20件目のサンプル記事です。ここに記事の説明文を表示します。
</p>
</article>
</div>
<!--
ページ番号を表示する場所。
ページ番号と省略記号(…)はscript.jsで自動生成されます。
-->
<nav
class="ellipsis-pagination_nav"
data-ellipsis-pagination-nav
aria-label="ページネーション">
</nav>
</div>
<!-- ページネーションの切り替え処理 -->
<script src="script.js"></script>
</body>
</html>
サンプル一式を取得する場合 HTML・CSSなどすべてのファイルが必要な場合は、「サンプル一式をダウンロード」をクリックしてください。
Q ダウンロードしたけど、これをネット上で動かすにはどうするの?
Googleアカウントがあれば、InfinityFreeで無料サーバーを作成して、ダウンロードしたサンプルをネット上で動かせます。
InfinityFreeを初めて利用する場合は①から、すでにサーバーを作成している場合は②へ進んでください。
ファイル構成と設置方法
このサンプルはHTML・CSS・JavaScriptの3ファイルで構成されています。HTMLにはNo.1〜No.20までの20枚の記事カードと、ページネーションを表示する領域を配置します。CSSでは記事カード、ページ番号、省略記号(…)のデザインを設定し、JavaScriptでは記事カードを1ページにつき2枚ずつ表示して、現在のページに合わせてページ番号と省略記号を自動生成します。
sample/
├── index.html
├── style.css
└── script.js
各ファイルの役割
index.htmlは記事一覧とページネーションの基本構造を作るファイルです。サンプルでは20枚の記事カードを配置しています。No.1〜No.20の番号、記事タイトル、説明文は自由に書き換えられます。記事カードを追加・削除すると、JavaScriptがカード総数から必要なページ数を自動計算します。
style.cssは記事一覧とページネーションのデザインを設定するファイルです。全体の余白、記事カードの枠線や角丸、ページ番号の大きさ、選択中のページ番号、省略記号(…)などの表示を変更できます。
script.jsはページ切り替えを行うファイルです。記事カードの総数から総ページ数を計算し、現在のページに該当するカードだけを表示します。また、現在位置に応じて必要なページ番号を表示し、途中のページ番号を「…」へ置き換えます。
設置方法・使い方
sampleフォルダへindex.html、style.css、script.jsを同じ階層で配置します。index.htmlからstyle.cssとscript.jsを読み込む構成になっているため、3ファイルを配置したあとsample/index.htmlをブラウザで開いてください。外部ライブラリやサーバーは必要ありません。
最初はNo.1とNo.2の記事カードが表示されます。ページ番号をクリックすると、選択したページに該当する2枚の記事カードへ切り替わります。全10ページを常に並べるのではなく、現在のページ位置に合わせて途中のページ番号が「…」へ変わります。
カスタマイズできる内容
index.htmlでは「記事一覧」のタイトル、説明文、No.1〜No.20の記事番号、記事タイトル、記事説明文を変更できます。記事カードのarticle要素を追加・削除すると、記事数に応じて総ページ数が自動計算されます。
style.cssでは全体の背景色や余白、記事カードの枠線、角丸、文字色、ページ番号の大きさ、ページ番号同士の間隔、選択中のページ番号の色、省略記号の文字サイズなどを変更できます。
script.jsではellipsisPaginationItemsPerPageを変更すると、1ページに表示する記事カードの件数を変更できます。例えば2を4へ変更すると、1ページにつき4枚の記事カードを表示します。記事カードの総数と表示件数から総ページ数を自動計算するため、HTMLへページ番号を手動で追加する必要はありません。
数値調整
style.css
margin:40px auto;
ページネーション全体の上下余白です。40pxを大きくすると上下の間隔が広がり、小さくすると狭くなります。
padding:32px;
ページネーション全体の内側余白です。値を大きくすると内容と枠線の間隔が広がり、小さくするとコンパクトになります。
border-radius:18px;
ページネーション全体を囲む部分の角丸です。値を大きくすると丸みが強くなり、0にすると四角になります。
font-size:22px;
「記事一覧」のタイトル文字サイズです。値を大きくすると文字が大きくなり、小さくすると控えめになります。
gap:16px;
記事カード同士の間隔です。値を大きくするとカード同士が離れ、小さくすると近くなります。
padding:24px;
記事カードの内側余白です。値を大きくすると文章と枠線の間隔が広がります。
border-radius:12px;
記事カードの角丸です。値を大きくすると丸みが強くなり、0にすると四角になります。
gap:10px;
ページ番号と省略記号の間隔です。値を大きくすると各項目の間隔が広がり、小さくすると狭くなります。
margin-top:28px;
記事カードとページネーションの間隔です。28pxを大きくすると上下の間隔が広がります。
min-width:48px;
ページ番号ボタンの最小横幅です。値を大きくするとボタンが横に広がります。
height:48px;
ページ番号ボタンの高さです。値を大きくするとボタンが高くなります。
border-radius:10px;
ページ番号ボタンの角丸です。値を大きくすると丸みが強くなり、0にすると四角になります。
transition:0.3s;
ページ番号へマウスを重ねたときの色が切り替わる時間です。値を大きくするとゆっくり、小さくすると速く切り替わります。
min-width:32px;
省略記号(…)を表示する部分の最小横幅です。値を大きくすると省略記号の左右の空間が広がります。
font-size:18px;
省略記号(…)の文字サイズです。値を大きくすると省略記号が大きく表示されます。
script.js
const ellipsisPaginationItemsPerPage = 2;
1ページに表示する記事カードの件数です。2を4へ変更すると1ページにつき4枚表示するなど、用途に合わせて変更できます。
let ellipsisPaginationCurrentPage = 1;
現在ページを管理する初期値です。このサンプルでは1ページ目から開始します。
ellipsisPaginationShowPage(1);
ページを開いた直後に表示するページです。1を変更すると最初に表示するページを変更できます。
レスポンシブ対応
このサンプルはレスポンシブ対応です。style.cssのwidth:100%によってページネーション全体が親要素の横幅に合わせて表示され、ページ番号部分にはflex-wrap:wrap;を設定しているため、横幅が不足した場合は折り返して表示されます。
画面幅640px以下では、全体の余白をpadding:24px 18px;、記事カードをpadding:20px 16px;へ変更します。ページ番号ボタンは最小横幅と高さを44px、省略記号は最小横幅24px・高さ44pxへ調整しているため、スマートフォン・タブレット・PCで利用できます。
コメント