スライドを簡単に実装できるJavaScriptライブラリ「Swiper」

Swiperというライブラリを使うと、スライドが簡単に実装できます。
jQueryにも依存していないピュアなJavaScriptのライブラリなので、かなり重宝しています。
- オプションが豊富でカスタマイズしやすい
- jQueryに依存しない
- スマホにも対応している
Swiperのインストール

ローカルにファイルを設置したい場合は公式サイトからswiper.min.cssとswiper.min.jsをダウンロードして読み込みます。
CDNでの使用もできて、その場合は下記のコードを読み込みます。
<link rel="stylesheet" href="https://unpkg.com/swiper/css/swiper.min.css">
<script src="https://unpkg.com/swiper/js/swiper.min.js"></script>Swiperの使い方
スライドを使いたい場所に下記のHTMLを記述します。
<div class="swiper-container">
<div class="swiper-wrapper">
<div class="swiper-slide">スライドの内容1</div>
<div class="swiper-slide">スライドの内容2</div>
<div class="swiper-slide">スライドの内容3</div>
</div>
<div class="swiper-pagination"></div>
<div class="swiper-button-prev"></div>
<div class="swiper-button-next"></div>
</div>あとは下記のJavaScriptでスライドが作成できます。
var mySwiper = new Swiper ('.swiper-container', {
effect: "slide",
loop: true,
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
pagination: {
el: '.swiper-pagination'
}
});See the Pen Swiper_basic by Masakazu Saito (@31mskz10) on CodePen.
左右のナビゲーション設定
左右のナビゲーションを設定したいときは下記のコードをJavaScriptに追加しつつ、.swiper-container内にHTMLを追加します。
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
}.swiper-button-nextと.swiper-button-prevであればSwiperのデフォルトCSSが反映されます。
基本的にはそこからCSSを上書きして使う方がラクそうです。
ページネーション設定
ページネーションを設定したいときは下記のコードをJavaScriptに追加しつつ、.swiper-container内にHTMLを追加します。
pagination: {
el: '.swiper-pagination'
}こちらも.swiper-paginationだとSwiperのデフォルトCSSが反映されます。
Swiperのオプション
Swiperのオプションはかなり多く、バージョンアップによって新しく追加されたり、変更も結構されます。
基本は公式のドキュメントを見てください(下記の表は公式のドキュメントを簡単に訳したものです)。
| オプション名 | 初期値 | 内容 |
|---|---|---|
| init | true | スライド生成時にスライドを初期化するかどうか |
| updateOnWindowResize | true | ウインドウのサイズ変更時にスライドの位置を再計算する |
| initialSlide | 0 | 最初に表示させるスライド番号(1番目が0) |
| direction | ‘horizontal’ | スライドの方向を横(’horizontal’)か縦(’vertical’)を選択する |
| speed | 300 | スライドの速度をミリ秒で指定 |
| setWrapperSize | false | .swiper-wrapperに全てのスライドの合計の幅が自動で設定される |
| virtualTranslate | false | アニメーションのtransformが削除される (自分でアニメーションを作成したい場合に使用) |
| width | false | スライドの幅を指定します |
| height | false | スライドの高さを指定します |
| autoHeight | false | trueにすると、スライドの高さが内容に応じて変わるようになる |
| roundLengths | false | スライドの中身のwidthやheightの小数点以下が四捨五入される 中の画像がぼけるときにtrueにするとキレイになる場合がある |
| nested | false | trueにすると入れ子になったスライドのタッチイベントが正常に取得できる |
| uniqueNavElements | true | ページネーションの1つ目をクリックすると1つ目のスライドに移動するようになる |
| effect | ‘slide’ | スライダーのアニメーションを’slide’、’fade’、’cube’、’coverflow’、’flip’から選択する |
| runCallbacksOnInit | true | スライダーの初期化時にTransition / SlideChange・Start / Endイベントを発火させる |
| watchOverflow | false | trueにすると、スライドの枚数が1枚しかないときにボタンやページネーションを削除する |
| on | イベントハンドラを登録できる | |
| cssMode | false | trueにするとCSS Scroll Snap APIが使用される |
| spaceBetween | 0 | スライド間の距離をpx単位で設定する |
| slidesPerView | 1 | 1画面で見えるスライド枚数を指定する |
| slidesPerColumn | 1 | 列ごとのスライド枚数を指定する |
| slidesPerColumnFill | ‘column’ | slidesPerColumnを指定したときに、列(’column’)をベースするか、 行(’row’)をベースにするか指定する |
| slidesPerGroup | 1 | スライドグループ化して1つにまとめる |
| slidesPerGroupSkip | 0 | グループ化した複数スライドをスキップする設定 (グループ化する数はslidesPerGroupの値になる) |
| centeredSlides | false | trueにするとスライドのスタートが真ん中になる falseだと左端がスタートになる |
| centeredSlidesBounds | false | trueにすると、アクティブなスライドはスライダーの最初と最後にギャップを追加せず真ん中に配置される |
| slidesOffsetBefore | 0 | スライドの前に追加の余白を設定する |
| slidesOffsetAfter | 0 | スライドの後に追加の余白を設定する |
| normalizeSlideIndex | true | trueだとslidesPerGroupとcenteredSlidesを使っているときに、 1枚目の認識がズレてしまっているのを修正してくれる |
| centerInsufficientSlides | false | trueだとスライド枚数がslidePerView未満の場合にスライドを中央に配置する |
| grabCursor | false | trueだとカーソルがgrabになる |
| touchEventsTarget | ‘container’ | タッチイベントの対象をcontainerにするかwrapperにするか設定する |
| touchRatio | 1 | 次のスライドにいくまでのスワイプ感度を設定する 数字が大きければ大きいほど、少しスワイプしただけで次のスライドに切り替わる |
| touchAngle | 45 | スワイプを認識する角度を設定する |
| simulateTouch | true | trueだとタッチイベントをマウスイベントのように認識する |
| shortSwipes | true | trueだとタッチ時間の短いスワイプも有効にする |
| longSwipes | true | trueだとタッチ時間が長いスワイプも有効にする |
| longSwipesRatio | 0.5 | タッチ時間の長いスワイプ時に、どのくらいの比率次のスライドが見えていたら 次のスライドに移動するか設定する |
| longSwipesMs | 300 | タッチ時間の長いスワイプで、どのくらい経過したら次のスライドへ移動するのを キャンセルするかミリ秒で設定する |
| followFinger | true | trueだとスワイプ時に前後のスライドの内容が見れる |
| allowTouchMove | true | trueだとスワイプできるようになる。 falseだとナビゲーションでしかスワイプができなくなる |
| threshold | 0 | 設定した数値分スワイプしないとスライダーが動かなくなる |
| touchStartPreventDefault | false | trueだとtouchstartイベントが動かなくなる |
| touchStartForcePreventDefault | false | trueだとイベントのデフォルトを常に禁止する |
| touchMoveStopPropagation | true | trueだとイベントのバブリングを防ぐ |
| iOSEdgeSwipeDetection | false | iOSのUIWebViewでのスワイプイベントを有効にする |
| iOSEdgeSwipeThreshold | 20 | iOSのUIWebViewで画面左端から設定した数より小さい範囲では スワイプイベントが有効にならない |
| touchReleaseOnEdges | false | trueだとスワイプ時も画面がスクロールできるようになる |
| passiveListeners | true | trueだとスマホでのパフォーマンスを高める |
| resistance | true | 最初のスライドから最初のスライドへ移動するときのバウンスアニメーションに 抵抗するようなアニメーションがつく |
| resistanceRatio | 0.85 | resistanceの抵抗力を設定する |
| preventIntercationOnTransition | false | スワイプの最中に別スライドに移動できなくなる |
| allowSlidePrev | true | trueだと前のスライドへ移動できるようになる |
| allowSlideNext | true | trueだと次のスライドへ移動できるようになる |
| noSwiping | true | noSwipingClassで設定したClassが付いたスライドはスワイプできなくなる |
| noSwipingClass | ‘swiper-no-swiping’ | noSwiping用のClassを指定する(noSwipingがtrue前提) |
| noSwipingSelector | セレクタを指定すると、そのセレクタ上ではスワイプできなくなる | |
| swipeHandler | null | スワイプに使用するセレクタを指定する |
| preventClicks | true | trueだとスワイプ中にリンクがクリックできないようになる |
| preventClicksPropagation | true | trueだとスワイプ中にリンク上のクリックイベントの停止させる |
| slideToClickedSlide | false | trueだと任意のスライドへの遷移が生成される |
| freeMode | false | trueだとスライド位置が固定されない |
| freeModeMomentum | true | trueだとスワイプしてカーソルを離したあとに、スライドがしばらく動くようになる |
| freeModeMomentumRatio | 1 | 値が大きいほどスライダーを離したあとの距離が大きくなる |
| freeModeMomentumVelocityRatio | 1 | 値が大きいほどスライダーを離したあとの速度が速くなる |
| freeModeMomentumBounce | true | trueだとバウンスアニメーションが付く |
| freeModeMomentumBounceRatio | 1 | 値が大きいほどバウンス効果が大きくなる |
| freeModeMinimumVelocity | 0.02 | フリーモードの勢いが発生するために必要な、最小タッチ移動速度を設定する |
| freeModeSticky | false | trueだとフリーモードでスライド位置へのスナップが有効になる |
| watchSlidesProgress | false | trueだとプログレスバー(進行状況の表示)を計算するようになる |
| watchSlidesVisibility | false | スライドに追加の表示クラスが追加される (watchSlidesProgressが有効である必要がある) |
| preloadImages | true | trueにするとすべての画像を強制的にロードする |
| updateOnImagesReady | true | trueにするとすべての画像がロードされたあとにSwiperが再初期化される |
| loop | false | 最後のスライドの次に、最初のスライドに戻るようになる |
| loopAdditionalSlides | 0 | ループの実行時に複製されるスライドの追加番号の設定 |
| loopedSlides | null | ループ時に複製するスライドの数を設定 |
| loopFillGroupWithBlank | false | trueにするとスライドグループに空のスライドが作成される |
| observer | false | trueにするとSwiperのスタイルが変更されたり子要素を変更されるたびに再初期化される |
| observeParents | true | Swiperの親要素もobserverの設定がされる |
| observeSlideChildren | false | Swiperの子要素のobserverの設定がされる |
class名の管理
下記のオプションを使うと、class名の変更ができます。
しかし、実際に運用するときはclass名を変えてしまうとあとで訳が分からなくなってしまうのでオススメしません(特に複数人が関わる実装の場合)。
| オプション名 | 初期値 | 内容 |
|---|---|---|
| containerModifierClass | ‘swiper-container’ | Swiperを包括しているClass名の設定 |
| wrapperClass | ‘swiper-wrapper’ | スライドのラッパーのClass名 |
| slideClass | ‘swiper-slide’ | スライドのClass名 |
| slideActiveClass | ‘swiper-slide-active’ | 現在アクティブなスライドのClass名 |
| slideDuplicatedActiveClass | ‘swiper-slide-duplicate-active’ | アクティブなスライドの複製されたスライドのClass名 |
| slideVisibleClass | ‘swiper-slide-visible’ | 現在表示されているスライドのClass名 |
| slideDuplicateClass | ‘swiper-slide-duplicate’ | loopで複製されたスライドのClass名 |
| slideNextClass | ‘swiper-slide-next’ | アクティブなスライドの次のClass名 |
| slideDuplicatedNextClass | ‘swiper-slide-duplicate-next’ | アクティブなスライドの次の複製されたスライドのClass名 |
| slidePrevClass | ‘swiper-slide-prev’ | アクティブなスライドの前のClass名 |
| slideDuplicatedPrevClass | ‘swiper-slide-duplicate-prev’ | アクティブなスライドの前の複製されたスライドのClass名 |
class名を変える代わりにオススメしたいのが、class名の追加です。
レスポンシブの設定
JavaScriptにbreakpointsを追加するとレスポンシブの設定ができます。
breakpoints: {
// 320px以下の場合
320: {
slidesPerView: 1,
spaceBetween: 10
},
// 480px以下の場合
480: {
slidesPerView: 2,
spaceBetween: 20
},
// 640px以下の場合
640: {
slidesPerView: 3,
spaceBetween: 30
}
}ブレークポイントは自分で指定して、その中にオプションを追加して指定します。


SafariでFacebookのPage Pluginに「リクエストを処理できませんでした」とダイアログが表示される問題
Google Maps APIでピンのアクティブ時にピン画像を変える方法
ソースコードをハイライトする軽量ライブラリ「Highlight.js」の導入方法と使い方
CSS疑似要素(::beforeや::after)のcontent内で改行したり半角スペースを複数入力する方法
WordPressで「現在メンテナンス中のため、しばらくの間ご利用いただけません。」の状態でログインできなくなった場合の対処法
Visual Studio Codeの拡張機能「Trailing Spaces」でコードの中にある余計なスペースを表示する
Visual Studio Codeのマルチカーソル機能で文字操作を一括で行う
CSSの読み込みで「its MIME type (‘text/html’) is not a supported stylesheet MIME type」エラーが表示されて読み込みができない場合の解決方法
Vue.jsを使う人が最低限導入しておきたいVisual Studio Codeの拡張機能
サイトを運営する時必ず登録しておきたいGoogle Search Console(サーチコンソール)の登録方法
iTerm2で「Use System Window Restoration Setting」を設定しているとアラートが表示されて機能しない
Google Chromeのサイト内検索(カスタム検索)機能を別のプロファイルに移行する方法
iPadで入力モードを切り替えずに数字や記号をすばやく入力する方法
iPhoneやiPadでYouTubeの再生速度を3倍速や4倍速にする方法
Keynoteで有効にしているはずのフォントが表示されない現象
MacのKeynoteにハイライトされた状態でコードを貼り付ける方法
AirPodsで片耳を外しても再生が止まらないようにする方法
iTerm2でマウスやトラックパッドの操作を設定できる環境設定の「Pointer」タブ
DeepLで「インターネット接続に問題があります」と表示されて翻訳できないときに確認すること
Ulyssesの「第2のエディタ」表示を使って2つのシートを横並びに表示する
Bartender 6で追加されたWidgets機能で自作メニューバーアイテムを簡単に作成する
Googleカレンダーを便利に活用するための小技集(祝日だけを表示・月末の繰り返しイベントを追加)
Obsidianを使った「自己流PKM」で行う知識トレーニング
テキストエディタ・ノートアプリ関連のショートカットキーをKeyboard Maestroで統一する
Path Finderを使ってキーボードだけでファイル操作する方法(応用編)
macOSのコマンドパレット比較!SpotlightとAlfred、Raycastどれを使えばいい?
1つのノートアプリにすべて集約するのをやめた理由|2025年時点のノートアプリの使い分け
Notionログイン時の「マジックリンク」「ログインコード」をやめて普通のパスワードを使う
AlfredでNotion内の検索ができるようになるワークフロー「Notion Search」