Swiperでウィンドウ幅と、スライド個数によってスタイルを変える

下記のようなスライドショーを作成したかったのでメモ。使用プラグインはSwiper.jsです。

2021/8/17 : 一部記述に不備があったためcodepenとブログを修正しました。

・横幅が下記の時に1画面に表示するスライドを表示させる
 0px ~ 768px:スライド1つ
 769px ~ 1080px:スライド2つ
 1081px ~ :スライド4つ
・スライドはループ表示
・1画面のスライドの数が満たない時はスライドさせない。ナビゲーションを出さない。ループ表示を解除

See the Pen 210113_横幅とスライドの個数によってスライドのスタイルを変更する by nekuta (@nekuta) on CodePen.

スライドの作成

//swiper-slideの個数を取得
let swiperItems = demoSlide.getElementsByClassName("swiper-slide").length;
  //swiperの設定
let mySwiper;    
const createSwiper = function (loop) {
      let parm = {
        slidesPerView: 1,//1画面に表示するスライド数
          loop: true,//スライドをループ
          allowTouchMove: true,//フリック操作を有効に
          spaceBetween: 20,//スライド左右の余白
          pagination: {//ページネーションの設定
            el: '.swiper-pagination',
            type: 'fraction',
          },
          navigation: {//ナビゲーションの設定
            prevEl: '.swiper-button-prev',
            nextEl: '.swiper-button-next',
          },
          breakpoints: {//breakpoints
            768: {
              slidesPerView: 2,
              spaceBetween: 20,
            },
            1080: {
              slidesPerView: 4,
              spaceBetween: 20,
            },
          },
        };
      if (!loop) {//loopしない場合は下記を書き換え
        parm.loop = false;
        parm.allowTouchMove = false;
      }
      mySwiper = new Swiper('#demo-slide', parm);//スライドを作成
        slideNum(mySwiper, swiperItems);
    };

//下記のような感じで呼び出す
createSwiper(true)//loopするスライド
createSwiper(false);//loopしないスライド
//スライドの数に応じてページネーションとナビゲーションにクラスを振る
function slideNum(swiperName, num) {
      var _this = swiperName.$el[0];//{作成したswiper}.$elでhtml要素を見ることができる
      let thisSwiperPagenation = _this.getElementsByClassName('swiper-pagination')[0];
      let thisSwiperNav = _this.getElementsByClassName('swiper-nav')[0];
      if (num === 1) {
        thisSwiperPagenation.classList.add('num-1');
        thisSwiperNav.classList.add('num-1');
      } else if (num <= 2) {
        thisSwiperPagenation.classList.add('num-2');
        thisSwiperNav.classList.add('num-2');
      } else if (num <= 3) {
        thisSwiperPagenation.classList.add('num-3');
        thisSwiperNav.classList.add('num-3');
      } else if (num <= 4) {
        thisSwiperPagenation.classList.add('num-4');
        thisSwiperNav.classList.add('num-4');
      } else if (num <= 5) {
        thisSwiperPagenation.classList.add('num-5');
        thisSwiperNav.classList.add('num-5');
      }
  }

読み込まれたとき

    function slideWidthWatch(load) {
      if(!load){
          mySwiper.destroy(false, true);//作成したswiperを一度削除する
      }
      if (swiperItems === 1) {
        createSwiper(false);
      }else if(swiperItems === 2){
        if (768 < window.innerWidth) {
          createSwiper(false);
        } else {
          createSwiper(true);
        }
      }else if(swiperItems === 3 || swiperItems === 4){
        if (1080 < window.innerWidth) {
          createSwiper(false);
        } else {
          createSwiper(true);
        }     
      }else{
        createSwiper(true);
      }
    }
    
    if (swiperItems <= 4) {//スライドの個数が4個以下の時resizeイベントをつける
      window.addEventListener('resize', function () { 
        slideWidthWatch(false);
      });
    }
    slideWidthWatch(true);

参考サイト

Swiper API : https://swiperjs.com/api/
swiper.js使ってみたからそのオプションについて(v4.1.6) | なんかいろいろデザインする人 : https://reiwinn-web.net/2018/03/15/swiper-4-1-6/

プラグイン

Swiper : https://swiperjs.com/