top of page

ページネーション考


ページネーションというと、「次へ」とか、「○ページ目」というリンクのアレです。

いろいろ考えるところはあったのですが、非常にグダグダになりそうだったので、可能な限りシンプルにしてみます。

以下当然のことながら、筆者の勝手な決めつけを多々含みます。 「そんなことはない」「いやそれはおかしい」という意見があって当然だと思います。 そのような様々な意見が、ページネーションそのものに対して向けられるべきだというのが、まさに今回の主旨なのです。

Q1. 「ページネーションをどうするか」は誰が決めるべきですか?

A1. プロデューサーまたはプロジェクトマネージャーだと考えています。 実際の見た目・機能は「何をどう見せたいか」を実現するための手段だからです。

Q2. 何ページ表示するのが正しいですか?

A2. 利用者がたどることが現実的な範囲のページ数とすべきです。 それ以上はページネーションやソートではなく別の手段で提供すべきです。

Q3. 普通でいいんですが、どうしたらいいんですか?

A3. これは要するに「みんなどうしてるんですか?」ということだと思いますが、色々なサービスでページネーションを見てみた上で、自分がどう認識したのか、どう意図を感じ取ったのか、ということが答えだと思います。

ただし、大手のサービスでは当然、自分たちが何をどう見せたいかを実現するための手段を提供しており、その上で利用者の傾向を検証して調整しています。それをそのまま導入しても「同じ方式であるという安心感」以上のものは得られないだろうと思われます。

Q4. たとえば「記事タイトルリスト10件ごと最新順」として、問題ありますか?

A4. ちょっとややこしいですが次のような問題があります。

1つ目は、「1ページ目を見ている間に1件新しい記事が追加されると、2ページ目を開いた時に先頭に見えるのは、先ほど見たばかりの1ページ目の末尾の記事のタイトルとなる」という点です。

2つ目は、「1ページ目を見ている間に11件新しい記事が追加された場合、2ページ目を開いた時に見える10件は、1ページ目の末尾記事に続く10件でも何でもない(本来見えるべき10件は、はるか後方にあるため)」という点です。

前者の問題は「続きを読み込む」で既存リストに追加表示されるタイプの方式や、スクロールダウンにあわせて追加読み込みされるタイプの方式で誤表示として発生しますが、潜在的にページネーションでも同じことです。

後者も同様ではありますが、この場合、利用者は「見るはずだった」記事を見ることができないことになります。この状況は、利用者が1ページ目に戻ったタイミングで、誤表示だと認識されるだろうと思われます。

Q5. A4の問題を回避するためにはどのような手段がありますか?

A5. いくつかあります。ただしデメリットもあります。

1つは、「2ページ目の先頭は1ページ目の末尾の次の項目にする」という方法です。 常に、1ページ目を表示した時点での「○ページ目」になるため、3ページ目の先頭は1ページ目の末尾の11件後から10件、ということになります。

2つ目は、上記1つ目の方法と併用して、表示後のページネーション内で「正しい現在位置」を表示することです。 前者の問題は、先頭に追加された新しい記事が含まれるようにするには1ページ目を表示しなくてはならない、という点です。

後者の問題は、「『2』を選んだはずが『5』にいる」という状況が、やはり利用者にとって誤表示であると見なされるだろう点です。

他にも方法はいくつもあると思います。 ただ一般的に、ページネーションについてそうした選択肢があまり検討されているようには見えないことは残念だと考えています。

Q6. 何を優先して考えるべきですか?

A6. 唯一の優先順位があるとは思えません。

上で挙げたように、たとえば、利用者に何を見てもらいたいのか、または、「2ページ目」あるいは「2」というリンクが利用者にとってどういう意味として受け取られるのか、利用者としての共通認識はどこにあるのか(一般的にも「ふわっと」認識されている点なので、意外と共通認識はバラけているはずですが)などの重要な要素が複数存在するわけです。 それらのどこに線を引いて実物にするのか、という問題だと思います。

現実問題として考えた場合、上記の通りややこしい話なので、言葉で説明するのは骨の折れることになるでしょう。また同時に、画面上の制約等とのトレードオフもあります。 だからこそ、A1.で挙げた通り、これを考えるのはデザイナーやプログラマーではなく、プロデューサー/PMの仕事だと考えているわけです。

最新記事

すべて表示

SQLite(sqlite3)で “no such table”

小ネタです。 SQLiteを使っていて "no such table" とエラーが出た場合、 DBファイル名の指定が空になっている、という凡ミスを起こしていないかを確認してみましょう。 ・・・ そういう凡ミスをしてしばし悩んだので… ファイル名の指定が空になっている場合、一時的なインメモリDBとして保存されます(※1)。 つまりDB接続を切断すると中身は消えます。 なので接続

アプリケーションサーバにポートを指定せずに起動すると?

最近、 Goで書かれたアプリケーションサーバが起動しない! ->原因: .env ファイルが欠けていた というドタバタがありました。 結局Goと関係ないですが、この時、 「あまりGoに慣れてないのでGoの問題かと…」「DockerまだよくわかってなくてDockerの問題かと…」 というような声があったのて、あえてGoで検証してみようと思ったわけです。 さて、Goでサーバサイドのシステムを作

GitLab 9.1.2 (MySQL) を 11.4.0 (PostgreSQL) にアップグレード

弊社ではかなり前からGitLab(CE)を自社環境で運用しているのですが、ふと気付くと、バージョンがだいぶ先に行ってしまっていました。 とくに最近のバージョンでは Auto DevOps なども使えるようになっていたりするので、さすがにそろそろキャッチアップしたいと考えたわけです。 現行の環境は次の通りです: GitLab 9.1.2 sameersbn/gitlab 使用 MySQL 5.6

bottom of page