【プラグインなし】jQueryでスライダーを作る方法

スライダーの作り方 html
スライダーの作り方

webサイトのメインビジュアルによく使用される写真がスライドして切り替わるやつ。

あれを作ろうと思います。

プラグインのswiper.js(スワイパー)を使用すればかなりクオリティーの高いスライダーを作ることは可能ですが、プラグインのデメリットとして

  • 余計な処理が入っており、動作重くなりがち
  • 細かなカスタムが難しい

という点があります。

 

今回は プラグインを使用せずにスライダーを作る方法を紹介します。

 

製作物の確認:スライダーデモ

  1. 1〜5の画像があり、次へを押すと次の画像へ、前へを押すと前の画像へ
  2. 一番初めの画像が表示されている際に前へを押すと一番最後の画像を表示
  3. 一番最後の画像が表示されている際に次へを押すと一番最初の画像を表示

挙動については上記の通りです(スライドのスピードはお好みで)

この挙動をするスライダーを作って行きましょう。

結論

コードだけを知りたい方のために結論から書きます。

省略していますが、headでjqueryを読み込んでいます。

html

css

js

解説

スライダーの仕組み

まずはスライダーがどのように再現されているのかを知る必要があります。

st1:画像横並びにした画像を用意します。

carouselの仕組み1

st2:その画像1枚分と同じ大きさの画像を見せたいエリアを用意します。

carouselの仕組み2

st3:表示させたいエリアにぶち込みます。

carouselの仕組み3

st4:画像を表示させたいエリア以外では画像を表示させたくないので、overflow:hidden;ではみ出たエリアを非表示にします。

すると現在の見た目は一番初めの画像、画像1のみが見える状態になります。

carouselの仕組み4

st5:あとは横並びにした画像群をtransletで動かしてしまえば画像がスライドして現れているように見えます。

carouselの仕組み5

作り方

jsでプログラムを組む際のおすすめの方法はまず、処理を日本語で考えるということです。

大事なものはロジックですのでそこを固め、プログラムを書くという行為はロジックの翻訳という感覚で行います。

 

今回はメインの処理としてスライダーの部分。サブの処理として何番目の画像が表示されているのかを表示するナビバー(名前は適当に命名したのであってるかわかりません)の部分に分けられます。

まずはメインの処理となるスライドの部分を作っていきましょう。

「次へ」「前へ」ボタンをそれぞれ押した場合の処理を考えていきます。

【メインの処理】「次へ」ボタンが押された場合

「次へ」が押されたことを検知

横並びになった画像群を左に画像1枚分スライドさせたいのでcssのtransformの値を変更する

 

これでとりあえず画像をスライドさせることができます。

 

では翻訳しましょう。

 

翻訳はgoogleで調べます。

調べ方は「言語名 + やりたいこと」です。

jquery クリックイベント別タブで開きます

jquery cssの変更別タブで開きます

 

この情報を元に翻訳するとこうなりますね。

window.onloadはhtmlの読み込みが終了したらカッコ内の処理を実行させるものです。

移動させる距離を保存する変数transValを作り、初期値に0を入れその変数を「次へ」がクリックされる毎に画像1枚分変更しています。

左に移動させたいので値はマイナスです。

今回はcssで画像の幅を600pxに設定しています。
そして$(‘~’).css();でtransformの値を変更します。
実行して見ると、「次へ」を押すたんびに画像がスライドするかと思います。
ですが、最後の画像「5」で「次へ」を押すと何も映りません。なので画像1に戻してやる必要があります。
「次へ」が押されたことを検知

現在表示している画像が最後の画像かどうかを確認。
比較には現在表示している画像が何枚目なのかを知る必要があるので変数を用意し、画像がスライドする毎に変数の値を更新する
そして最後の画像が何枚目なのかを知る必要もあるので、画像全部の枚数を取得する

もし、最後の画像なら、最初の画像を表示させる。横並びになった画像群を一番最初に移動させたいのでcssのtransformの値を変更する
最後の画像じゃないなら、次の画像を表示させる。横並びになった画像群を左に画像1枚分スライドさせたいのでcssのtransformの値を変更する
jquery もし だったら別タブで開きます
jquery 要素の数別タブで開きます
翻訳します

現在の何枚目の画像を表示しているのかを保存する変数をindexとし、初めは、1枚目の画像を表示するので、indexに1を入れておきます。

そして最後の画像が何枚目なのかを知る必要もありますのでlengthという変数を作り、画像全部の枚数を取得して保存します。

もし、最後の画像だった場合、一番最初の画像に戻したいので、transValの値を0にし、indexも1にします。

最後の画像じゃない場合の処理は同じです。

【メインの処理】「前へ」が押された場合

これと同じ要領で「前へ」が押された場合の処理も考えて翻訳しコードを書きます。

 

これでメインの処理は完成です。

次はナビバーの部分の処理を作りましょう。

サブの処理。ナビバーの作り方

画像が全部で何枚存在し、そのうちの何番目が表示されているのかを表すナビバーですが、indexも現在の画像が何番目なのかを把握するために使っているのでこれを流用すれば作れそうですね。

動きの仕組みは要素の横幅を%で変化させます。

今回の画像の枚数は5枚ですのでバーの幅を1/5%づつ増やすことで実装できます。

carouselナビ

今回もcssの値を変更するので$(‘~’).css();を使用します。

これを適切な場所へ入れます。

入れる箇所は3箇所あります

  1. サイトアクセス時に画像1がされているので、ボタンを押す処理の前に入れます
  2. 次へボタンを押し、スライド処理が終わった後に入れます
  3. 前へボタンを押し、スライド処理が終わった後に入れます

 

これでスライダーが完成です!!

 

コードをブラッシュアップしよう

このままでもスライダーは機能しますが、コードをブラッシュアップしてのちの変更などに対応できる保守性の高いコードにしましょう。

ポイントは2つ

  1. DOMアクセスは変数で管理
  2. 複数回使用される処理は関数にまとめる

DOMアクセスは変数で管理

複数使用される処理は関数にまとめる

まとめ

仕組み

画像横並びにした画像を用意します。

その画像1枚分と同じ大きさの画像を見せたいエリアを用意します。

表示させたいエリアにぶち込みます。

画像を表示させたいエリア以外では画像を表示させたくないので、overflow:hidden;ではみ出たエリアを非表示にします。

あとは横並びにした画像群をtransletで動かしてしまえば画像がスライドして現れているように見えます。

処理の流れ

「次へ」「前へ」が押されたことを検知

現在表示している画像が最後の画像かどうかを確認。
比較には現在表示している画像が何枚目なのかを知る必要があるので変数を用意し、画像がスライドする毎に変数の値を更新する
そして最後の画像が何枚目なのかを知る必要もあるので、画像全部の枚数を取得する

もし、最後の画像なら、最初の画像を表示させる。横並びになった画像群を一番最初に移動させたいのでcssのtransformの値を変更する
最後の画像じゃないなら、次の画像を表示させる。横並びになった画像群を左に画像1枚分スライドさせたいのでcssのtransformの値を変更する
ナビバーの横幅を現在の画像の番目/全ての画像%に変更
2つのポイントを意識しブラッシュアップ
  1. DOMアクセスは変数で管理
  2. 複数回使用される処理は関数にまとめる

次のステップ

お次はスライダーを自動再生してみましょう。

そして、現在はボタンを連打するとスライドの途中であっても次のスライドへ移動してしまうのでスライド中はボタンを無効にしてみましょう。

次のページ…準備中…

 

コメント

タイトルとURLをコピーしました