React × Swiper で3つのカルーセルを同期させる
概要
React × Swiper を使って、カルーセルを3つ同期させる実装をしました。2つのカルーセルを同期させることは Swiper を使って比較的簡単に実装できますが、3つの同期は少し工夫が必要でした。事例が少ないのか、それらしい記事が見つけられなかったためここに書き残します。
3つを同期させるとはどういうことか
今回は、A / B / Cという3つのカルーセルがあるとした場合の以下の挙動を想定しています。
- AをスライドしたらBとCがスライドする
- BをスライドしたらAとCがスライドする
- Cは直接操作することはできず、AかBがスライドされたら同期される
プレビュー
使用技術
React 18.3.1
Swiper 11.1.1
コード解説
参考
以下の Thumbs のサンプルコードをベースにしています。Thumbs は2つのカルーセルを連動させる仕組みであるため、ref を使うことで3つのカルーセルの同期を実現しています。
唯一同じようなことをしている以下の記事も参考にしました。詳細
上記の StackBlitz のコードではSwiper
要素にいくつものオプションを付与していますが、同期させる上で必要なものだけを以下に抜粋します。
メインのSwiper
で必要なオプションは以下の部分です。
modules={[Thumbs]}
// thumbs={{ swiper: thumbsSwiper }}
thumbs={{
swiper:
thumbsSwiper && !thumbsSwiper.destroyed ? thumbsSwiper : null,
}}
Swiper のドキュメントのサンプルコードでは、thumbs={{ swiper: thumbsSwiper }}
と記述してありますが、それだとエラーになることもあります。その場合は上記のような書き方をしてください。
参考 : https://github.com/nolimits4web/swiper/issues/5630
メイン下部のSwiper
で必要なオプションは以下の部分です。ここは Swiper のドキュメントのサンプルコードのままで OK です。
onSwiper={(swiper) => {
setThumbsSwiper(swiper);
}}
modules={[Thumbs]}
watchSlidesProgress
背景のSwiper
のオプションは、以下のようにonSlideChangeTransitionEnd
でref
を参照することで他のスライドと同期させています。onSlideChangeTransitionEnd
はスライド遷移が終了したときに呼ばれます。
onSlideChangeTransitionEnd={(swiper) => {
swiperRef.current?.slideToLoop(swiper.realIndex, undefined, false);
}}
さいごに
この記事が誰かの一助になれば幸いです🧤
Discussion