「画面に入った」で数えたら、17%残して読了になった
記事を最後まで読んだかどうかを、サイト側で判定しています。その作りを一度入れ替えたあとで、まだ食い違っているという指摘をもらいました。
調べたら、本文をまだ17%残している位置で読了が成立していました。
「画面に入った」で数えると何が起きるか、それを「通り過ぎた」に変えると何が揃うか。そして、速く動かしたときに何を数えていいのかです。
本文を区画に分けて、通った跡を見ている
判定の仕組みはこうです。本文の高さを6つの区画に分け、画面に映った区画に印を付けます。全部に印が付いたら読了とします。
時間では測っていません。開いて放置しても時間は進むので、読まずに読了になってしまうからです。通った経路そのものを見れば、連続して読んだ人は必ず全部を通り、途中を飛ばした人には穴が残ります。
ここまでは意図どおりに動いていました。問題は「映った」をどう数えるかのほうにありました。
最後の区画は、画面に入った瞬間に埋まる
最初の数え方は「画面と少しでも重なった区画に印を付ける」でした。素直な書き方に見えます。
この数え方だと、最後の区画は画面の下から顔を出した瞬間に埋まります。まだ読んでいない部分が画面の下に残っていても、区画としては「映った」ことになります。
実際の記事で測りました。本文の高さが4731px、画面の高さが745px、1区画は788pxです。最後の区画が画面に入るのは、本文の83%まで進んだところでした。
| 数え方 | 最後の区画が埋まる位置 | そのとき画面の下に残っている量 |
|---|---|---|
| 画面に入ったら | 本文の83% | 17% |
| 下端まで通り過ぎたら | 本文の100% | 0% |
読み終わりを指す数字が、2つとも違う場所にあった
同じページには、読み進み具合を出す細いバーもあります。こちらは「本文の末尾が画面の下端に来たら100%」で計算していました。
つまり同じ「読み終わり」を指しているはずの2つが、17%ずれた場所を指していました。バーはまだ「あと17%」と言っているのに、記録のほうはもう読了になっている。どちらも動いていて、どちらも例外を出しません。
どちらも「読み終わり」と呼んでいました。呼び名が同じだと、中身も同じだと思ってしまいます。
実際には片方は「画面に入ったか」、もう片方は「画面を通り過ぎたか」を見ていました。言葉のほうが先に一致してしまうと、数字がずれていても照らし合わせる動機が生まれません。
「通り過ぎた」に変えると、位置が揃う
区画に印を付ける条件を、下端まで通り過ぎたかどうかに変えました。
最後の区画の下端は、本文の末尾と同じ位置です。そこを画面の下端が越えるのは、本文を読み切ったときになります。バーが100%になるのと、読了が成立するのが、同じ瞬間になりました。
直したのは条件式の不等号ひとつぶんですが、意味はかなり変わっています。「見えた」を「見終えた」にしたので、読む側の実感と一致するようになりました。
速く動かしたときに、何を数えていいのか
もうひとつ直したところがあります。
目次から飛んだときに、途中を読んだことにしてはいけません。かといって、速くスクロールしただけの人を弾いてもいけません。この2つを分けるのに、以前は移動量のしきい値を置くことを考えていました。
置かずに済む書き方がありました。前回の画面の下端と、いまの画面の上端の、大きいほうを下限にします。
ふつうにスクロールしているあいだは、前回の下端のほうが大きくなります。1回の移動が画面の高さに収まるので、通り過ぎた範囲は全部目に入っています。
大きく飛んだときは、いまの画面の上端のほうが大きくなります。飛んだ距離のうち画面の高さを超えた部分は一度も表示されていないので、そこは数えません。いま映っている1画面ぶんだけが残ります。
場合分けが要らないだけでなく、処理が詰まって移動が飛び飛びに見えたときも、表示された範囲だけが自然に残ります。しきい値を決めていたら、その値の妥当性を考え続けることになっていました。
実際のジオメトリで確かめました。連続して100px、300px、700px、744pxずつ動かした場合とPageDownでは、いずれも読了になります。一気に最下部へ飛んだ場合は成立しません。目次から中ほどへ飛んで最後まで読んだ場合は、手前に穴が残って成立しません。飛んだあとに戻って全部読めば成立します。
今回の学び
まず、同じ名前で呼んでいるものが、同じものだとは限らないこと。「読み終わり」を2か所で判定していて、どちらもそう呼んでいました。呼び名が一致していると、中身を照らし合わせる機会が来ません。ずれていたのは実装ではなく、言葉のほうが先に揃ってしまったことでした。
次に、「見えた」と「見終えた」は別の状態だということ。画面に入った時点で数えると、まだ読んでいない部分が残ります。人が読み終えたと感じるのは通り過ぎたときなので、そちらに合わせるほうが実感と一致します。
そして、しきい値を置く前に、置かずに書ける形を探すこと。今回は下限の取り方を変えるだけで場合分けが消えました。しきい値は、決めた瞬間から「その値でよいのか」を考え続ける対象になります。要らないなら、無いほうが軽い。
関連記事
読む体験をつくる — 目次の自動生成から読了状態の保存まで
記事を5本公開したあと、読む側の体験を作り込みました。目次の自動生成、追従する目次、読了状況の表示と保存、スマートフォンのメニュー、読了目安の時間。あわせて、トップページの見た目も見直しています。 この記事は、その実装記 […]

進捗バーが0から始まらないのは、測る場所を1つ間違えていたからだった
記事を開いた瞬間、読み進み具合のバーが9.5%を指していました。まだ何もしていません。 「あと90%」と出ているのを見て、指摘をもらいました。言われてみると、進み具合を名乗るものが0から始まらないのは変です。 この記事で […]

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