スマホでSwiperがピンチアウト(拡大)できない?その原因と対策を解説!

先日、実務でSwiperがスマホのときに拡大できない。と指摘を受けました。

私自身も意識して、Swiperを拡大したことなかったので、まさかと思って試したらできませんでした。

確かに、スマホでは画像が細かいとみにくいので、拡大したくなる気持ちは分かります。

今回は、どのようにして、Swiperの画像を拡大できるようにしたのかを、記録しておきます。

同じような問題で困っている方の参考になれば幸いです!

Swiperの構築から学びたい方、見直したい方は【Swiperの基本】シンプルで美しいスライダーを作成する方法!をご覧ください。

関連記事

Webサイトでスライダーを使用すると、コンテンツを魅力的に見せることができます。 しかし、スライダーを自分で一から実装するのは難しく、手間がかかます。 そんな時に役立つのが「Swiper」というライブラリです。 Swip[…]

それでは、スマホでSwiperを拡大できるようにしていきましょう。

  1. Swiperがスマホで拡大できない原因
  2. Swiperをスマホで拡大させる方法
  3. SwiperのデフォルトのCSSを変更したさいの注意事項

Swiperがピンチアウト(拡大)できない原因はなに?

では最初に問題点の切り分けをしたいと思います。

原因があるとすれば、HTML全体のCSSか、Swiperのどちらかです。

動作を確認したとこと、Swiper上で拡大を使用とすると、確かに拡大できません。

Swiper以外のところ、他のセクションなどは問題ありませんでした。

ということは、Swiper自体に問題がありそうです。

では、なぜSwiperは拡大ができないのでしょうか。まずは、原因を調べていこうともいます!

スマホでのピンチアウト(拡大)に対応していない。

調べてみると、Swiperはピンチアウト(拡大)に対応していないみたいです。

CSSかjsか、どちらかで拡大ができないように制御をかけているようです。

では、その制御を解除して、拡大ができるようにしてみます。

Swiperの拡大オプション「zoom」を使ってみる。

Swiperの拡大オプションのzoomとは、Swiperに挿入されている画像を拡大させるためのオプションです。

では、zoomオプションを追記してみます。

<div class="swiper">
  <div class="swiper-wrapper">
    <div class="swiper-slide">
      <div class="swiper-zoom-container">
        <img src="./images/img-01.jpg">
      </div>
    </div>
    <div class="swiper-slide">
      <div class="swiper-zoom-container">
        <img src="./images/img-01.jpg">
      </div>
    </div>
  </div>
</div>
const swiperMain = new Swiper('.main-swiper', {
  zoom: {
    maxRatio: 5,
    minRatio: 1,
  }
});

オプションの詳しい解説については、Swiperの公式サイトをご覧ください。

上記のリンクから飛んでもらえれば、zoomオプションの箇所へ遷移します。

では、本題に戻りますが…「zoom」オプションを入れただけではダメでした。

HTMLも公式のものを参考して導入、コンソールにもエラーがでていない。

動作は、画像がSwiperのコンテンツ内で画像が拡大縮小できるようになりました。

私は、Swiper全体を拡大したいので、Swiperのコンテンツ内、swiper-slideの中だけで拡大するのでは、実装したい動作とは違います。

Swiperにデフォルトで適用されているCSSを確認してみる。

Swiperの拡大縮小が、jsでの制御でないとすれば、CSSでの制御が考えられます。

CSSを見直してたところ、swiper-horizontalというクラス名に、なにやらあやしいCSSの記述を見つけました。

.swiper-horizontal {
    touch-action: pan-y;
}

swiper-horizontalに適用されているtouch-actionについて調べてみた。

touch-actionは、スマホデバイスでのタッチ操作の制御に使われます。

主な動作は、以下の通りです。

動作
autoデフォルト(制御しない)
noneタッチで反応させない
pan-y縦方向のスクロールのみ許可
pinch-zoomズームのみ許可
manipulationダブルタップでの拡大を無効化。スクロールとズームは可能。

つまり、touch-action: pan-y;が設定されているというこは、「縦スクロール」のみしかSwiperのコンテンツ上では許されていないということです。

Swiperには、多様なオプションがあるので、そのオプションを制御するために設定されているのでしょう。

今回は、拡大したいので「auto」に上書きして動作を試したいと思います。

.swiper.swiper-horizontal {
 touch-action: auto;
}

touch-action: auto;で無事にスマホで拡大ができるようになった!

うまくいきました!これで、スマホ表示のときに拡大ができるようになりました。

拡大といっても、スマホでいうピンチアウトなので、通常の動作に戻した。という方が正しいですが。

Swiperのオプションによっては、touch-action: auto;を適用させない方がいい。

前述しましたが、Swiperは多様なオプションがあります。

今回は、シンプルなSwiperでしたので、.swiper-horizontalにtouch-action: auto;で解決することができました。

ですが、設置するSwiperの設定によっては、動作エラーが起きる可能があります。

縦スクロールのみをデフォルトで指定しているということは、何かしらのSwiperオプションに影響すると考えた方がいいです。

私は、まだそのようなSwiperの設置をしたことがないので、案件であたったら本記事をに記載して共有します。