fumi WEB フミウェブ

お見積もり・ご相談はこちら

fumi Blog

コーディング中心に活動中のフリーランス、
fumicaのブログ。
日々取得した技術や勉強の記録をまとめています。

Swiperスライダーを複数設置する場合の注意点

WEBサイトにSwiperスライダーを使用する時、ファーストビュー、実績紹介のようにSwiperを複数設置する機会があるかと思います。

その場合、コードはどうすればいい?そのまま設置しても壊れない?と不安になりますが、数点だけ気を付ければ大丈夫です。

今回はその注意点に関して解説していきたいと思います。

Swiperスライダーを複数設置する場合の注意点

  • constの名前を分ける
  • それぞれ別の親要素で .swiper を指定する
  • pagination:、navigation:に必ず別の親要素を指定

コード

以下はメインビジュアルスライダーと採用情報スライダーを設置した時の例です。

まず、constの名前を付け、それぞれ別の親要素で .swiper を指定しましょう。

const mvSwiper = new Swiper(".mv .swiper", { ... });// メインビジュアル
const recruitSwiper = new Swiper(".recruit .swiper", { ... });// 採用情報

constの後のmvSwiperなどの部分は変更可能です。

役割ベースで命名すると後で見返した時に分かりやすいのでおすすめです。

オプションがほぼ同じなら共通化してもOK

const baseOptions = { で共通化するとより保守しやすいです。

// 共通の動き
const baseOptions = {
  loop: true,
  effect: "fade",
  slidesPerView: 1,
  spaceBetween: 0,
  autoHeight: true,
  speed: 2000,
};
// メインビジュアル
const mvSwiper = new Swiper(".mv .swiper", {
  ...baseOptions,
  pagination: {
    el: ".mv .swiper-pagination",
    clickable: true,
  },
});
// 採用情報
const recruitSwiper = new Swiper(".recruit .swiper", {
  ...baseOptions,
  pagination: {
    el: ".recruit .swiper-pagination",
    clickable: true,
  },
});

pagination:、navigation:を設定している場合の注意

ここも別の親要素で設定する必要があります。

共通クラスにするとどれか1つしか効かない or 全部連動することがあるがあるので注意です。

必ず以下のように、前に親クラスを設定しましょう。

pagination: {
  el: ".mv .swiper-pagination",
}

【もっと増える予定なら】同じ構造のSwiperを量産する方法

この書き方が向いてるケース
  • 同じデザインのスライダーを複数使う
  • WordPressでループ表示してる
  • 今後スライダーが増える予定

デザインが全く同じ構造の複数のSwiperを設置する場合はこちらの方法がおすすめ。
HTML構造が同じなら querySelectorAll を使って一括で初期化できます。

HTML(例)

<div class="js-swiper">
  <div class="swiper">
    ...
  </div>
  <div class="swiper-pagination"></div>
</div>

<div class="js-swiper">
  <div class="swiper">
    ...
  </div>
  <div class="swiper-pagination"></div>
</div>

JavaScript

const swipers = document.querySelectorAll('.js-swiper');

swipers.forEach((el) => {
  new Swiper(el.querySelector('.swiper'), {
    loop: true,
    effect: "fade",
    slidesPerView: 1,
    spaceBetween: 0,
    autoHeight: true,
    speed: 2000,
    pagination: {
      el: el.querySelector('.swiper-pagination'),
      clickable: true,
    },
  });
});

ポイント解説

親要素ごとにループさせる
document.querySelectorAll('.js-swiper')

ここでSwiper1個分の「まとまり」を取得します。

el.querySelector を使うのが重要
el.querySelector('.swiper')
el.querySelector('.swiper-pagination')

ページ全体の中から、最初に見つかった .swiper を1個だけ取るという処理をしています。

この処理があることでループの中でこのような処理がされます。

  • 1回目 → Aを取得
  • 2回目 → Bを取得

それぞれのSwiperをちゃんと取れるので、以下のバグを防げます。

  • ページネーションが1個しか動かない
  • 変な連動する
  • 最後のSwiperだけ動く

最初の方法では、Swiperごとにそれぞれ別の親要素で .swiper を指定するをやっていましたが、

今回の量産スライダーの場合、それを一括でやっているというイメージです。

まとめ

今回はSwiperのSwiperスライダーを複数設置する場合の注意点について解説しました。

複数スライダーがある場合は、デザインをしっかり確認し、どのパターンで実装するか慎重に見分けましょう。

  • constで名前分けが必要
  • new Swiper、pagination:、navigation:には親classを必ず設定

これさえ気を付ければバグも防げます。