【解決】スマートフォンで1ページごとにスクロールが止まるように制御するのが難しい

【解決】スマートフォンで1ページごとにスクロールが止まるように制御するのが難しい

画像を1ページずつ並べて、電子書籍っぽくフリックでスクロールさせるUIを作りたかったのですが、スマートフォンのスクロール制御はPCと同じ気持ちでは上手く動いてくれません。

作ったもの

小学二年生の三女が描いた物語が面白かったので、絵本のような体裁に整えてみようと思ったのがきっかけです。 過去の自費出版経験を活かして書籍にすることも考えましたが、MyISBN では最低12ページないとダメなようで諦めました。

やりたかったこと

電子書籍リーダー風のUI、具体的には1ページごとにスクロール位置をスナップしようと思っていました。 ただし、スクロール操作中はユーザ操作を優先してスナップさせない、というのも盛り込みたい。

結果としては上手くいきませんでした。

PCでは若干怪しい動きがあるものの、一応それっぽく動いています。 一方でスマートフォンではほとんど制御が効いていないように見えます。

上手くいかない原因

スマートフォンのスクロールとPCのスクロールの挙動の違いが主な原因と思われます。

最近では当たり前の動きなのですが、フリック操作でスクロールすると、指を離した後も惰性でスクロールが少し続きます。 PCだとマウスホイールが惰性でちょっと回ることはありますが、あくまでもホイールの惰性であり、スクロールの惰性ではありません。 つまり、惰性で動いている間の制御に対する考慮が足りない、ということだと思います。

ちなみにスクロールの制御は現在位置しか取得できないので、向きやスピード、ページとの位置関係などすべて制御しなければいけません。 おそらく、ユーザが操作していない間の惰性スクロールに介入する必要があり、ページの区切りに近いほどその影響を受ける、という制御が必要なのだと思います。

image

地味ですが思いのほか奥の深いテーマだったので、引き続き改善していこうと思います。

【追記】CSSで解決

ふとCSSで出来ないのか?という考えが浮かび、ググってみたらありました。

scroll-snap-type というCSSであれば、惰性スクロールそのものをコントロールすることができ、期待した動作になりました。

おそらく、ユーザが操作していない間の惰性スクロールに介入する必要があり、ページの区切りに近いほどその影響を受ける、という制御が必要なのだと思います。

ちなみに、CSSにたどり着く前、この方法も試しました。 初期バージョンはPCではそこそこ、スマホでは全然ダメでしたが、このバージョンはスマホでそこそこ、PCでは全然ダメです。 またスマホの挙動も、惰性スクロールの勢いをコントロールできないため、ピタッと止めることができていません。

結論としては、スマホの惰性スクロールはJavaScriptでは制御しようと思わない方がよいです。


謝辞
画像は Pixabay 様より使わせていただきました。