React Slickでのスライダー

Posted at 2023 年 08 月 13 日

React Slickとは?

React Slickは、Reactを使用して構築されたカルーセル(スライダー)コンポーネントです。

これは、人気の高いslickカルーセルライブラリのReact版の一つとして開発されました。

React Slickを使用することで、jQueryのslickライブラリの強力な機能をReactアプリケーション内でシームレスに利用できます。Reactに最適化されており、モジュール化されているため、簡単に素晴らしいカルーセルを作成することができます。

また、React SlickにはCSSも付属しているため、設定とスタイリングがより簡単に行えます。

ドキュメント

設定と構成

以下はReact Slickの主な設定と構成オプションです。

プロパティ

タイプ

デフォルト値

説明

accessibility

bool

true

タブキー、矢印キーの有効/無効化

adaptiveHeight

bool

false

スライダーの高さの自動調整の有効化/無効化

arrows

bool

true

ナビゲーションアロー(矢印)の表示/非表示

autoplaySpeed

int

3000

各自動スクロール間の遅延時間

afterChange

func

Default

スライドのインデックスが変更された後に呼び出されるコールバック関数。indexパラメータの設定が必要

(現在表示しているスライドのインデックス)

appendDots

func

dots => <ul>{dots}</ul>

カスタムなドット(ページネーションの点)のテンプレート作成

asNavFor

ref

undefined

別のスライダーへの参照を提供し、スライダーを同期させる

autoplaySpeed

int

3000

自動スクロール間の遅延時間(ミリ秒単位))

autoplay

bool

false

スライダーの自動再生の有効化/無効化

beforeChange

func

null

スライドが変更される前に実行されるコールバック関数

centerMode

bool

false

現在のスライドを中央に配置

centerPadding

string

‘50px’

中央に配置されているスライドと周囲の要素との間に追加の余白(パディング)を設定

className

string

‘’

内部のスライダー要素に適用するためのCSSクラス名を指定

customPaging

func

i => <button>{i + 1}</button>

スライダーのページングを独自のカスタムテンプレートに置き換える関数

dotsClass

string

'slick-dots’

スライダーのドット(ページングのインジケーター)のためのCSSクラスを指定

dots

bool

Default

スライダーのページング(インジケーター)としてドットを表示/非表示化

draggable

bool

true

スライドのスクロール機能を無効/有効

easing

string

'linear’

アニメーションの進行速度を制御、スライダーのアニメーションがどのように進行するかを制御

fade

bool

Default

スライドの切り替えがフェードインとフェードアウトのアニメーション

focusOnSelect

bool

false

スライドをクリックした際にそのスライドに自動的に移動

infinite

bool

true

スライドの無限にスクロール有効/無効化

initialSlide

int

0

最初に表示するスライドのインデックスを設定

lazyLoad

ondemand/

progressive

null

スライドイメージのコンテンツを読み込む速度

onEdge

func

null

スライドが端にドラッグされたときのイベント

onInit

func

null

コンポーネントの初期化時に実行される処理

onLazyLoad

func

null

スライドが遅延読み込みされた後に実行される処理

onReInit

func

null

コンポーネントが再描画された後に実行される処理

onSwipe

func

null

スライドがスワイプによって変更された後に実行される処理

pauseOn-

DotsHover

bool

false

ナビゲーションドットにカーソルを合わせている間、自動再生を一時停止するかどうかを制御

pauseOnFocus

bool

false

スライドにフォーカスがある際に自動再生有効/無効化

pauseOnHover

bool

true

スライドのトラック上にカーソルがある際に自動再生有効/無効化

responsive

array

{breakpoint,

settings}

null

ブレークポイントごとにカスタマイズするための設定

rows

integer

1

スライド内で表示されるコンテンツの行数を指定

rtl

bool

false

スライダーの表示順設定(trueの場合、逆方向、右から左)

slide

string

'div’

スライダー内の各スライドを包むコンテナの要素タイプ(HTML tags:li,article,section,etc…)

slidesPerRow

int

1

グリッドモードで表示するスライドの数

slidesToScroll

int

1

一度に何枚のスライドをスクロールするかを指定

slidesToShow

int

1

1つのフレーム内に表示するスライドの数を指定

speed

int

500

スライドのアニメーション速度

swipeToSlide

bool

false

ドラッグやスワイプでスライドを切り替える有効/無効化

swipe

bool

true

スワイプによるスライド変更が有効/無効化

touchMove

bool

true

ユーザーのタッチ操作によるスワイプを有効または無効

touchThreshold

int

5

スワイプ操作の認識閾値を設定

useCSS

bool

true

CSSトランジションを有効または無効

useTransform

bool

true

CSSトランスフォームを有効または無効

variableWidth

bool

false

スライダー内のスライドの幅を可変にするかどうかを指定

vertical

bool

false

スライダーを垂直方向に配置するかどうかを指定

メソッド

以下はReact Slickが提供するメソッドの一覧です。

Args

デフォルト値

説明

slickGoTo

index, dontAnimate

null, false

指定したスライドのインデックスに移動するための関数

slickNext

none

none

現在表示されているスライドの次のスライドに移動する

slickPause

none

none

自動再生中のスライダーを一時的に停止する

slickPlay

none

none

一時停止していた自動再生を再開する

slickPrev

none

none

前のスライドに移動する

インストレーション

以下はReact Slickのインストール手順です。

  • パッケージのインストール
# npmを使用する場合
npm install @types/react-slick --save-dev

# yarnを使用する場合
yarn add @types/react-slick --dev
  • CSSのインストール
# npmを使用する場合
npm install slick-carousel --save

# yarnを使用する場合
yarn add slick-carousel

実装

  • インポート

    react-slickライブラリと必要なCSSをインポートします。

    import Slider from 'react-slick';
    import 'slick-carousel/slick/slick.css';
    import 'slick-carousel/slick/slick-theme.css';
    

  • 基本的な記述方法
    const settings = {
        dots: true,
    };
    
    <Slider {...settings}>
       <img src= '../../..' alt="Slide image1"></img>
       {/* ... */}
       <img src= '../../..' alt="Slide image5"></img>
    </Slider>
    

  • 最初にシンプルなSliderを作ってみましょう!

    MainSlider.tsx

    import React,{useState} from 'react';
    import Slider from 'react-slick';
    import 'slick-carousel/slick/slick.css';
    import 'slick-carousel/slick/slick-theme.css';
    import '../styles/mainSlider.css';
    import image00 from '../assets/images/nature00.jpg';
    import image01 from '../assets/images/nature01.jpg';
    import image02 from '../assets/images/nature02.jpg';
    
    const MainSlider = () => {
      const settings = {
        dots: true,
      };
      return (
        <div className = "SliderContainer">
         <h2 className="Title">Welcome to React Slider!</h2>
          <Slider className= "SliderSection" {...settings}>
            <img className= "SlideImage" src= {image00} alt="Slide image1"></img>
            <img className= "SlideImage" src= {image01} alt="Slide image2"></img>
            <img className= "SlideImage" src= {image02} alt="Slide image3"></img>
          </Slider>
         </div>
      );
    };
    
    export default MainSlider;
    

    mainSlider.css

    .SliderContainer{
        width:800px;
        height:560px;
        margin: 20px 10px 0px 50px;
    }
    
    .Title{
        color: #000a80;
        font-size: 32px;
        font-weight: 700;
        text-align: center;
    }
    
    .SliderSection{
        width: inherit;
        height: inherit;
    }
    
    .SlideImage{
        object-fit: cover;
    }
    

    🎬 Watch the Result:

    https://youtu.be/qNkVHS6EQ9g

  • スライドプロパティの実装

    今回はスライドプロパティを使って色々実装してみます。

    スライドプロパティの詳細説明は[設定と構成]を参考してください。

    MainSlider.tsx

    import React,{useState} from 'react';
    import Slider from 'react-slick';
    import 'slick-carousel/slick/slick.css';
    import 'slick-carousel/slick/slick-theme.css';
    import '../styles/mainSlider.css';
    import image00 from '../assets/images/nature00.jpg';
    import image01 from '../assets/images/nature01.jpg';
    import image02 from '../assets/images/nature02.jpg';
    
    const MainSlider = () => {
      const [currentImageName, setCurrentImageName] = useState('Mountain');
      const [textColor, setTextColor] = useState('red');
      // スライドが変更された後に実行
      const handleSlideChange = (index: number) => {
        if(index === 0){
          setCurrentImageName('Mountain');
          setTextColor('red');
        }else if(index === 1){
          setCurrentImageName('Garden');
          setTextColor('blue');
        }else if(index === 2){
          setCurrentImageName('Forest');
          setTextColor('green');
        }
      };
    
      const settings = {
        dots: true, // ナビゲーションドットを表示するかどうか
        infinite: true, // スライドを無限にループさせるかどうか
        slidesToShow: 1, // 1回に表示するスライドの数
        slidesToScroll: 1, // 1回にスクロールするスライドの数
        autoplay: true, // 自動再生を有効にするかどうか
        autoplaySpeed: 3500, // 自動再生時のスライド切り替えの速さ(ミリ秒)
        speed: 1000, // スライドのトランジションアニメーションの速さ(ミリ秒)
        pauseOnHover: false, // ホバー時に自動再生を一時停止するかどうか
        afterChange: (index: number) => {
          handleSlideChange(index); // スライドが変更された後に実行されるコールバック関数
        },
      };
    
      return (
        <div className = "SliderContainer">
         <h2 className="Title">Welcome to React Slider!</h2>
          <Slider className= "SliderSection" {...settings}>
            <img className= "SlideImage" src= {image00} alt="Slide image1"></img>
            <img className= "SlideImage" src= {image01} alt="Slide image2"></img>
            <img className= "SlideImage" src= {image02} alt="Slide image3"></img>
          </Slider>
            <p>
              The current slide is{' '}
             <span style={{ color: textColor, fontSize: "24px", fontWeight: 600 }}>{currentImageName}</span>.
            </p>  
          </div>
      );
    };
    
    export default MainSlider;
    

    mainSlider.css

    .SliderContainer{
        width:800px;
        height:560px;
        margin: 20px 10px 0px 50px;
    }
    
    .Title{
        color: #000a80;
        font-size: 32px;
        font-weight: 700;
        text-align: center;
    }
    
    .SliderSection{
        width: inherit;
        height: inherit;
    }
    
    .SlideImage{
        object-fit: cover;
    }
    
    //ドットの色変更の為
    .slick-dots li button:before {
        color: gray;
    }
    

    🎬 Watch the Result:

    https://youtu.be/U72dqGnyL64

  • カスタムCSSをドットに適用する方法

    dotsClassについて

    dotsClassは、スライダーのドット(ページングのインジケーター)のためのCSSクラスを指定するためのプロパティです。デフォルトでは'slick-dots'というクラスが使われます。

    もし一部のスタイルを変更したい場合、slick-dotsクラスを直接指定してCSSを追加することも可能です。しかし、slick-dotsのスタイルを一切使用せず、カスタムなスタイルを適用したい場合は、settingsオブジェクトの中にdotsClassプロパティを設定します。

    const settings = {
        ...
        dotsClass: "custom-slick-dots", // ドットのカスタムクラス名
        ...
      };
    

    そして、次のようなCSSを追加します。

    .custom-slick-dots {
        bottom: 60px !important;
        position: absolute;
        display: block;
        width: 100%;
        padding: 0;
        margin: 0;
        list-style: none;
        text-align: center;
    }
    
    .custom-slick-dots li {
        position: relative;
        display: inline-block;
        width: 20px;
        height: 20px;
        margin: 0 5px;
        padding: 0;
        cursor: pointer;
    }
    
    .custom-slick-dots li button{
        font-size: 0;
        line-height: 0;
        display: block;
        width: 20px;
        height: 20px;
        padding: 5px;
        cursor: pointer;
        color: transparent;
        border: 0;
        outline: none;
        background: transparent;
    }
    
    .custom-slick-dots li button:before {
        font-family: 'slick';
        font-size: 6px;
        line-height: 20px;
        position: absolute;
        top: 0;
        left: 0;
        width: 20px;
        height: 20px;
        content: '•';
        text-align: center;
        opacity: .25;
        -webkit-font-smoothing: antialiased;
    
        background: #ebeaf0;
        color: #797f94;
        border-radius: 50%;
        transition: 0.3s;
    }
    
    .custom-slick-dots li.slick-active button:before {
        opacity: .75;
        color:green;
    }
    

    🎬 Watch the Result:

    https://youtu.be/hHIRL5z_6S4

DevpediaCode編集部

DevpediaCodeはWeb、AI、Iot、ローコードなどプログラムに関する最新ITテーマの情報を発信するメディアです。

お問合せ下記のURLからお願いします。

https://devpediacode.com/contact