JavaScript : スクロールのインジゲータを作成。
〽️ 一目で位置がわかるよう・・。
新たな野望(笑)。
こんにちは、「ふ」です。
以前作った、「JavaScriptによるスナップスクロール」。その完成後。
新たな野望が生まれる。
現在のスクロール位置が認識できるように、画像の下にインジゲータを表示したい。
今回これに挑戦したいと思います。
要素の数だけ●を表示。
インジゲータの「●」を配置する親要素を作っておきます。
JavaScriptのappendChild()を使って、「indicate」の内部に「●」を書き込みます。
「●」の文字実体参照は「●」です。
「「3//要素を作成」」
var maru = document.createElement("div");
「「3//要素のhtml」」
maru.innerHTML = "●";
「「3//親要素を取得」」
var indicate = document.getElementById("indicate");
「「3作成した要素を子要素として追加」」
indicate.appendChild(maru);
「●」が子要素として追加されました。
このcodeをfor文で囲んで、5個追加してみます。親要素取得の1文だけはグローバルで扱いたいので、{ }の外に出しておきましょう。
「「3//親要素取得はグローバルで扱う。」」
var indicate = document.getElementById("indicate");
「「1for(i = 1; i <= 5; i++)」」 {
var maru = document.createElement("div");
maru.innerHTML = "●";
indicate.appendChild(maru);
}
子要素が5個追加されました。縦並びではしょうがないので、flexboxを使って中央揃いの横並びにします。
#indicate {
display:flex;
「「3/*中央に要素を揃える*/」」
justify-content : center;
}
原型ができました。次に、現在のスクロール位置を表示するために、colorを変えていきます。
現在位置の「●」を青に、その他は薄いグレーにしてみます。CSSではなくJavaScript内で指定しましょう。
「「3//基本の色」」
indicate.style.color = "lightgray";
「「3//現在のスクロール位置の色」」
indicate.「「1children[0]」」.style.color = "blue";
これでUIは完成です。うまくできましたか?
スクロール画面に取り込もう。
では実際に、スクロールのUIにインジゲータを取り込んでいきましょう。以前作ったUIをそのまま使います。
詳細を確認したい方のために、再度リンクを貼っておきます。
スクロールエリアとボタンの間にインジゲータを追加しましょう。
「「3//横スクロール部分。3枚の画像を配置 」」
「「1//インジゲータを追加
」」
「「3//ボタンエリア。」」
「「3〜略〜 」」
こんな感じになりました。
〜腑に落ちない点があります。画像は3枚なのに、インジゲータの
「●」は5個になっています。画像の数と同じにしたいですよね。
以前の記事で、確か画像スクロール部分の要素は変数「element」で取得していました。
var element = document.getElementById("jsnap");
「●」の数はfor文の条件内で設定していましたよね。その条件を「element」の要素数に変更しましょう。
for(i = 1; i <= 「「1element.children.length」」; i++) {
var maru = document.createElement("div");
maru.innerHTML = "●";
indicate.appendChild(maru);
}
はい ♪ 「●」の数が画像と同じになりました。
「●」をスクロールに連動させる。
扨(さて)、いよいよインジゲータを画像のスクロールに連動させていきましょう。これも以前の記事になりますが、スクロールエリアの親要素を「jsnap」、子要素である各画像を参照するための番号を変数「num」としていました。
「「3//子要素を参照するための番号」」
var num = 0;
この「num」をインジゲータの「●」の管理にも使います。画像をスクロールさせると、「num」番目の「●」が青色になるための関数を定義しましょう。
「「3//スクロールを進めたとき」」
function maru_susumu () {
//「num」番目の「●」を青色に。
indicate.children[「「1num」」].style.color = "blue";
//前の「●」をgrayに。
indicate.children[「「1num-1」」].style.color = "lightgray";
}
「「3//スクロールを戻したとき」」
function maru_modoru () {
//「num」番目の「●」を青色に。
indicate.children[「「1num」」].style.color = "blue";
//前の「●」をgrayに。
indicate.children[「「1num+1」」].style.color = "lightgray";
}
スナップスクロール部分の「susumu( )」「modoru( )」関数では、変数「num」をそれぞれインクリメント、デクリメントさせています。その後で「maru_susumu( )」「maru_modoru( )」関数を実行させましょう。
function susumu() {
if(num+1 < element.children.length) {
「「3〜略〜」」
num++;
「「1maru_susumu();」」
}
else {
return;
}
}
function modoru() {
if(num-1 >= 0) {
「「3〜略〜」」
num--;
「「1maru_modoru();」」
}
else {
return;
}
}
できました。
お疲れ様でした、完成です ♪
「●」の数はimgの要素数に対応させているので、汎用的に使えて便利です。
今回の全コードはココ に貼っておきます。よかったら是非、自分のサイトに取り入れてみてください。
「ふ」です。
swift、web、ガジェットなど。役立つ情報や観ていてたのしいページを書いていきたいと思います。
🐧 twitter 🐧