こんにちは、「ふ」です。
以前、
CSSを使ったスナップスクロール
を紹介しましたが、
今このページを訪問してくださった(有難うです!)あなたは、スマホですか? だとしたら快適にスナップスクロールが味わえると思います。
一方。PCで観てもらっている方(有難うです!)。マウスでスクロールバーをつかんでから、ドラッグして次の画像を観る。・・とてももどかしい思いをさせてしまっていると思います。
というわけで、PCで訪問してくださった方のために、「ボタンをクリックする事で要素をスナップスクロールさせる」UIを実装してみたいと思います。CSSではなくJavaScriptを使います。
3枚の画像が横にスクロールすることで順に登場する部分と、その下に「◀︎」「▶︎」ボタンをテキトーに作って配置します。
横スクロールの実装方法については
こちら。
HTML
buttonには「onclick」で関数が実行されるように仕込んでおきます。
CSS
横スクロール部分の親要素のCSSについてですが、この部分をタッチ操作でスクロールできてしまうとこのあと記述するJavaScriptでうまく動作しません。「overflow:hidden」でタッチ操作を無効にしておきます。
以上、UIが準備できたところで、
どのようにJavaScriptを実装していくか、作戦を立てていきましょう。
以下Js。
まづは変数「element」として親要素を取得。
element.childrenで子要素のHTMLCollectionが取得できます。
これは配列のように操作が可能で、個別の子要素をelement.children[n]で取得することができ、子要素の数はelement.children.lengthで取得できます。
var numを宣言。この値を増減させることで、取得する子要素を切り替え、そこにスクロールさせるという作戦です。
スナップスクロールをJavaScriptで行うためには、scrollIntoView()メソッドを使用します。これを実行すると、指定した要素がウィンドウ上の表示範囲に入るまでページがスクロールされます。
そのパラメータとして、behavior:"smooth"と指定することでスムーススクロール(画面が急に切り替わるのではなく、スクロールアニメーションを伴って切り替わる)が実装できます。
そのあとに記述されている、「block」と「inline」。これは縦/横方向のスクロール位置を指定するパラメータになります。いずれも「nearest」(現在の表示位置から近い方にスクロールさせる)に設定しておきましょう。
以上を踏まえて・・・・・
scriptを書いていきます。まづグローバル部分にて親要素の取得、子要素参照のための変数「num」を定義します。
「susumu]関数。現在表示されている子要素の次の要素が存在する場合、すなはち「num+1」がelement.childrenの要素数よりも少ない時に次の要素「child」にスクロール。
そうでなければreturnで何も起こらない。
「num」はインクリメントされて次回はそのまた次の要素を取得できるようにする。
「modoru」関数。現在表示されている子要素の前の要素が存在する、「num-1」が0以上の場合に前の要素「child」にスクロール。
同じく条件を満たさなければreturn。
「num」はデクリメント、そのまた前にある要素を取得できるようにする。
scriptは以上です。ビルドしてみましょう!
実際に動かしてみてください。
タッチ操作のできないPC上でもこのUIであればユーザもわかりやすく、ストレスなく閲覧できそうです。
こうなると「現在何番目の要素が表示されているか」が視認できるようなインジゲーターも配置してみたくなりました。そしてメディアクエリでモバイル/PCのUIを切り替えられるようにしたい。
やってみたい事がどんどん増えてきて忙しい♪
また開発に成功したら「フーノページ」で紹介したいと思います。
swift、web、ガジェットなど。役立つ情報や観ていてたのしいページを書いていきたいと思います。
🐧 twitter 🐧