【Swiper×React】サムネイル付きのスライダーを作成する

thumbnail slider

当記事では、swiper.jsReactを使用してサムネイル付きのスライダーを作成する方法についてデモ付きで解説します。
swiper.jsのオプションを使用して二つのスライダーを連動させることで実現します。




①メインのSwiperスライダーを作成

npm i swiper@8


ナビゲーションとループだけつけておきます。
画像はサムネイルの方でも同じものを使うので配列で持っておきます。

import { Swiper, SwiperSlide } from 'swiper/react'
import { Navigation } from 'swiper'
import 'swiper/css/navigation'
import 'swiper/css'
import './style.css'

export default function SampleSlider() {
    const images = [
        '/img/sample1.png',
        '/img/sample2.png',
        '/img/sample3.png',
    ];
    return (
        <>
            <Swiper
                loop={true}
                modules={[Navigation]}  
                navigation
            >
                {images.map((src, idx) => <SwiperSlide key={idx}><img src={src} /></SwiperSlide>)}
            </Swiper>
        </>
    )
}
.swiper {
    width: 70%;
}
.swiper img {
    width: 100%;
    vertical-align: bottom;
}


メインのスライダーができました。

slide_image1
slide_image2
slide_image3





②サムネイル用のスライダーを作成

サムネイル用のスライダーなので、矢印もドットもいりません。
slidesPerViewには表示したいサムネイルの数を設定します。

<Swiper
    slidesPerView={3}     
>
    {images.map((src, idx) => <SwiperSlide key={idx}><img src={src} /></SwiperSlide>)}
</Swiper>


見た目はいい感じになりましたが、メインスライダーとサムネイルはまだ連動していません。

slide_image1
slide_image2
slide_image3
slide_image1
slide_image2
slide_image3




③メインスライダーとサムネイルを連動させる

二つのスライダーを連動させるには以下の二つを行う必要があります。

  • useStateを使用してサムネイルを参照できる状態にする
  • thumbsオプションで紐づけを行う

useStateを使用してサムネイルを参照できる状態にする

import { useState } from 'react'  // 追加
export default function SampleSlider() {
  const [thumbs, setThumbs] = useState(null)  // 追加
  .
  .
  .
}
<Swiper
    slidesPerView={3}     
    onSwiper={setThumbs}  // 追加
>
    {images.map((src, idx) => <SwiperSlide key={idx}><img src={src} /></SwiperSlide>)}
</Swiper>


thumbsオプションで紐づけを行う

import { Navigation, Thumbs } from 'swiper' // 修正
<Swiper
  loop={true}
  modules={[Navigation, Thumbs]}                                  // 修正
  thumbs={{swiper: thumbs && !thumbs.destroyed ? thumbs : null}}  // 追加
  navigation
>
  {images.map((src, idx) => <SwiperSlide key={idx}><img src={src} /></SwiperSlide>)}
</Swiper>



メインスライダーとサムネイルが連動しました!
サムネイルをクリックするとメインスライダーが動くと思います。

slide_image1
slide_image2
slide_image3
slide_image1
slide_image2
slide_image3




④サムネイルに枠線とホバースタイルをつける

thumbsオプションを使用するとサムネイルに自動でクラスが付与されるので、それを使用して枠線とホバースタイルをつけることができます。

.swiper-thumbs{
    cursor: pointer;
}
.swiper-slide-thumb-active{
    outline: 2px solid #000;
    outline-offset: -2px;
}

いい感じになりました!

slide_image1
slide_image2
slide_image3
slide_image1
slide_image2
slide_image3




ソースコード全文

最後にソースコードを全文載せておきます。

npm i swiper@8 
import { useState } from 'react'
import { Swiper, SwiperSlide } from 'swiper/react'
import { Navigation, Thumbs } from 'swiper'
import 'swiper/css/navigation'
import 'swiper/css'
import './style.css'

export default function SampleSlider() {
    const [thumbs, setThumbs] = useState(null)
    const images = [
        '/img/sample1.png',
        '/img/sample2.png',
        '/img/sample3.png',
    ];
    return (
        <>
            <Swiper
                loop={true}
                modules={[Navigation, Thumbs]}  
                thumbs={{swiper: thumbs && !thumbs.destroyed ? thumbs : null}}
                navigation
            >
                {images.map((src, idx) => <SwiperSlide key={idx}><img src={src} /></SwiperSlide>)}
            </Swiper>
            <Swiper
                slidesPerView={3}     
                onSwiper={setThumbs}
            >
                {images.map((src, idx) => <SwiperSlide key={idx}><img src={src} /></SwiperSlide>)}
            </Swiper>
        </>
    )
}
.swiper {
    width: 70%;
}
.swiper img {
    width: 100%;
    vertical-align: bottom;
}
.swiper-thumbs{
    cursor: pointer;
}
.swiper-slide-thumb-active{
    outline: 2px solid #000;
    outline-offset: -2px;
}







以上、swiper.jsReactを使用してサムネイル付きのスライダーを作成する方法でした。

スポンサーリンク

You can subscribe by SNS

スポンサーリンク

コメントを残す

*