進捗バーが0から始まらないのは、測る場所を1つ間違えていたからだった
記事を開いた瞬間、読み進み具合のバーが9.5%を指していました。まだ何もしていません。
「あと90%」と出ているのを見て、指摘をもらいました。言われてみると、進み具合を名乗るものが0から始まらないのは変です。
なぜ0から始まらなかったのか、どこを基準に測るかで何が変わるのか。そして、終わりの位置を動かさずに始まりだけ直す方法です。
分母を本文の高さに変えたところまでは合っていた
このバーは一度直しています。
最初はページ全体の高さを分母にしていました。ところがページの下には、前後の記事へのリンク、一覧へ戻るリンク、フッターが続きます。実測するとその部分だけで1205pxありました。
つまり本文を読み終えても90%前後にしかならず、100%にするには読むもののないフッターまでスクロールする必要がありました。勢いよく動かす人は慣性で最下端まで行くので満たせてしまい、文章を追って読む人ほど100%にならない。そこで分母を本文の高さに変えました。
ここまでは正しい判断でした。それでも、始まりの値は0になりませんでした。
下端で測ると、開いた時点ですでに進んでいる
計算はこうなっていました。
画面の下端が、本文の上端からどれだけ入ったか。それを本文の高さで割る。
この式だと、ページを開いた時点で本文の一部がすでに画面に映っています。実測した記事では、本文の上端がページの297px地点にあり、画面の高さが745pxでした。開いた瞬間に本文の448pxぶんが映っていることになります。本文の高さが4731pxなので、9.5%です。
「画面に映った本文の割合」としては、9.5%は正確な値です。計算間違いではありません。
ただし、この数字が名乗っていたのは「読み進み具合」でした。読み進み具合なら、読み始める前は0です。式が答えていた問いと、表示が名乗っていた問いが、別のものでした。
上端で測り、分母を移動量に合わせる
基準を画面の下端から上端に変えました。
あわせて分母も変えています。上端で測ると、本文の末尾まで読み切ったときの移動量は「本文の高さ − 画面の高さ」になります。本文の高さのままだと、最後まで読んでも100%に届きません。
| スクロール位置 | 旧(下端で測る) | 新(上端で測る) |
|---|---|---|
| 0(先頭) | 9.5% | 0.0% |
| 297(本文の上端) | 15.7% | 0.0% |
| 2000 | 51.7% | 42.7% |
| 4283(本文の末尾) | 100.0% | 100.0% |
直したのは始まりの側だけに見えますが、実際には分子と分母を同時に取り替えています。それでも100%になる位置は同じ4283pxのままでした。
分子から画面1つぶんを引いたなら、分母からも画面1つぶんを引く。両方に同じ量を効かせているので、終点は動きません。片方だけ直していたら、今度は末尾で100%に届かなくなっていました。
割り算の正しさは、分子だけを見ても分母だけを見ても判断できません。
そしてこの4283pxは、読了として記録される位置でもあります。バーが満杯になるのと「読了済み」に変わるのが同じ瞬間になりました。
本文が画面に収まる記事はどうなるか
短い記事では「本文の高さ − 画面の高さ」が0以下になります。割り算が壊れる形です。
この場合は100%を返しています。動かす余地が無く、開いた時点で最後まで見えているからです。読了の判定も同じ扱いになっていて、開いた時点で全区画が埋まります。2つの表示が同じ答えを出すので、ここでも食い違いません。
今回の学び
まず、0から始まらない指標は、測る対象と名乗りがずれている合図だということ。9.5%という値そのものは正確でした。式が答えていたのは「画面に映った割合」で、表示が名乗っていたのは「読み進み具合」です。数字が合っているかより先に、何を名乗っているかを確かめる必要がありました。
次に、割り算は分子と分母を組で見ること。基準を1つずらすと、分子と分母の両方に同じ量が効きます。片方だけ直すと、始まりが直って終わりが壊れます。今回は両方に効かせたので、終点を動かさずに始点だけ直せました。
そして、同じことを指す表示は、同じ場所で切り替わるべきだということ。バーの100%と読了の記録は、以前は別の位置にありました。いまは同じ4283pxで揃っています。揃っていれば、片方を見て他方を推測できます。ずれていると、どちらが本当なのかを毎回確かめることになります。
関連記事

「画面に入った」で数えたら、17%残して読了になった
記事を最後まで読んだかどうかを、サイト側で判定しています。その作りを一度入れ替えたあとで、まだ食い違っているという指摘をもらいました。 調べたら、本文をまだ17%残している位置で読了が成立していました。 この記事で扱うこ […]

一覧が長くなると、探せなくなる
記事の一覧に検索欄を付けました。サーバーには問い合わせず、すでに手元にある一覧をその場で絞り込みます。本文を検索の対象にしなかった理由も書いています。

測れるもので代用すると、測りたいものから離れる
記事を最後まで読んだ人を数えたいだけでしたが、判定を4回作り直しました。そのたびに別の壊れ方をした経緯と、そもそも何を測ろうとしていたのかを整理します。