본문 바로가기
React/Npm

[NPM] react-slick

by 잉여개발자 2022. 3. 14.

0. 들어가면서

웹사이트를 만들다 보면 필연적으로 만나는 기능 중 하나인 Slide! 

요즘은 워낙 고수분들이 가공하여 배포를 해줘서 npm에서 검색을 하면 웬만한 기능은 사용이 가능하다. 

 

그런데 react-slick이라는 좋은 Slide가 사용에 대해서 조금 불편한 점이 있어 그 부분 정리하는 김에 같이 정리하였다.

물론 내가 Document를 못 찾는 걸 수 있다....

 

1. 공통 

react-slick은 기본적으로 <Slide> 태그 안에서 슬라이드 별 필요한 옵션을 넣어 사용한다. 

 

또 본문에 SlideContainer, SlidePage 같은 태그가 있을 건데, 그건 styled-component를 사용해서 기본적인 디자인을 

넣었다. 

 

추가로 기본적으로 제공하는 css 스타일을 적용하기 위해서 두 가지 css 파일을 import 해야 한다. 

yarn add slick-carousel 

import "slick-carousel/slick/slick.css";
import "slick-carousel/slick/slick-theme.css"; 

최상위 App.js에 추가해도 되고, 아니면 Slide에 import 해주면 된다. 

 

2. SingleSlide

가장 기본적은 Slide이다. 그러므로 자동재생, custom Arrow 같은 옵션을 추가로 설명한다. 

import React from "react";
import Slider from "react-slick";
import { SlideContainer, SlidePage } from "../styles";

const SampleNextArrow = (props) => {
  const { className, style, onClick } = props;
  return (
    <div
      className={className}
      style={{ ...style, display: "block", background: "red" }}
      onClick={onClick}
    />
  );
};

const SamplePrevArrow = (props) => {
  const { className, style, onClick } = props;
  return (
    <div
      className={className}
      style={{ ...style, display: "block", background: "green" }}
      onClick={onClick}
    />
  );
};

const SingleSlide = ({}) => {
  const settings = {
    dots: true,
    infinite: true,
    autoplay: true,
    // 슬라이드 변경 시간
    speed: 2000,
    // 자동 재생 유지 시간
    autoplaySpeed: 2000,
    cssEase: "linear",
    centerMode: true,
    slidesToShow: 1,
    slidesToScroll: 1,
    nextArrow: <SampleNextArrow />,
    prevArrow: <SamplePrevArrow />,
  };

  return (
    <SlideContainer>
      <h1>SingleSlide</h1>

      <Slider {...settings}>
        <SlidePage padding={`50px 0`}>1</SlidePage>
        <SlidePage padding={`50px 0`}>2</SlidePage>
        <SlidePage padding={`50px 0`}>3</SlidePage>
        <SlidePage padding={`50px 0`}>4</SlidePage>
        <SlidePage padding={`50px 0`}>5</SlidePage>
        <SlidePage padding={`50px 0`}>6</SlidePage>
        <SlidePage padding={`50px 0`}>7</SlidePage>
      </Slider>
    </SlideContainer>
  );
};

export default SingleSlide;

 

settings 옵션

- dots : 슬라이드 아래에 dot를 on/off 할 수 있는 옵션

- infinite :  슬라이드가 끝까지 갔을때, 다음을 누를 경우 처음 슬라이드가 나온다. 

- speed : 슬라이드가 변경될 때 걸리는 시간

- autoplay : 자동 재생을 on/off할 수 있는 옵션

- autoplaySpeed : 자동 재생으로 슬라이드가 넘어가는 주기 

- slidesToShow :  한번에 보이는 슬라이드의 개수

- slidesToScroll : 한번 이동할 때 넘어가는 슬라이드 개수 

- nextArrow, prevArrow : 이전, 다음 화살표를 커스텀할 수 있다. 이 부분은 아래에 더 깊게 설명

 

nextArrow, prevArrow 

이전, 다음 화살표를 커스텀할 수 있는 옵션이다. 

const SampleNextArrow = (props) => {
  const { className, style, onClick } = props;
  return (
    <div
      className={className}
      style={{ ...style, display: "block", background: "red" }}
      onClick={onClick}
    />
  );
};

const SamplePrevArrow = (props) => {
  const { className, style, onClick } = props;
  return (
    <div
      className={className}
      style={{ ...style, display: "block", background: "green" }}
      onClick={onClick}
    />
  );
};

react-slick이 props를 통해 className, style, onClick을 받은 다음 원하는 디자인의 화살표를 만들 수 있다. 

 

컴포넌트 형식으로 만든 다음 settings 옵션에 넣어주면 화면에 나온다. 

 

3. MultipleRowSlide

생각보다 많이 사용되는 MultipleRowSlide이다. 

import React from "react";
import Slider from "react-slick";
import { MultiItem, SlideContainer, SlidePage } from "../styles";

const MultipleSlide = () => {
  const settings = {
    className: "center",
    centerMode: true,
    infinite: true,
    centerPadding: "100px",
    slidesToShow: 3,
    speed: 500,
    rows: 2,
    slidesPerRow: 2,
  };

  return (
    <SlideContainer>
      <h1>MultipleRowSlide</h1>

      <Slider {...settings}>
        <SlidePage>
          <MultiItem>1</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>2</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>3</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>4</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>5</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>6</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>7</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>8</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>9</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>10</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>11</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>12</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>13</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>14</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>15</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>16</MultiItem>
        </SlidePage>
      </Slider>
    </SlideContainer>
  );
};

export default MultipleSlide;

settings 옵션

- rows :  몇 줄짜리 슬라이드를 만들지 결정할 수 있다. 

- slidesPerRow : 한 슬라이드에 몇 개를 나타낼지 정할 수 있다. 

=> 만약 rows : 2, slidePerRow : 2 경우 한 슬라이드는 4개의 item으로 구성된다. 

 

4. CenterSlide

슬라이드가 가운데서부터 시작되는 슬라이드!  

import React from "react";
import Slider from "react-slick";
import { MultiItem, SlideContainer, SlidePage } from "../styles";

const CenterSlide = () => {
  const settings = {
    className: "center",
    centerMode: true,
    infinite: true,
    centerPadding: "60px",
    slidesToShow: 3,
    speed: 500,
  };

  return (
    <SlideContainer>
      <h1>CenterSlide</h1>

      <Slider {...settings}>
        <SlidePage>
          <MultiItem>1</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>2</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>3</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>4</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>5</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>6</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>7</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>8</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>9</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>10</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>11</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>12</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>13</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>14</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>15</MultiItem>
        </SlidePage>
        <SlidePage>
          <MultiItem>16</MultiItem>
        </SlidePage>
      </Slider>
    </SlideContainer>
  );
};

export default CenterSlide;

settings 옵션

- centerMode : centerMode를 on/off 할 수 있는 옵션

- centerPadding : centerMode를 할 경우 좌우 여백을 얼마나 줄 것인지 결정
                       ( 이 옵션을 통해 다음, 이전 슬라이드가 부분적으로 보인다. ) 

 

 

특이사항

위 내용만 사용하면 centerMode의 가운데 슬라이드가 강조하는 등의 설정이 안 된다. 

해당 부분은 추가로 css 옵션을 줘야 한다. ( 사실상 이 부분 때문에 정리하였다, 나같이 찾아다니는 사람이 없길... )

export const MultiItem = styled.div`
  color: #e67e22;
  opacity: 1;
  transform: scale(1.04);
`;

export const SlideContainer = styled.div`
  padding: 0 20px;

  /* width 옵션으로 전체 width 값을 지정할 수 있음 */
  /* width: 500px; */

  .center .slick-center ${MultiItem} {
    /* center 모드일때 center에게 강조할 경우 사용 */
    color: #e67e22;
    opacity: 1;
    transform: scale(1.06);
  }

  .center ${MultiItem} {
    /* center 모드일때 center 외 속성에게 사용 */
    opacity: 0.8;
    transition: all 300ms ease;
    transform: scale(0.99);
  }
`;

export const SlidePage = styled.div`
  text-align: center;

  background-color: skyblue;

  padding: ${(props) => props.padding};

  ${MultiItem} {
    /* center 옵션의 경우 MultiTem 속성을 추가로 사용해서 내부 옵션을 추가로 줘야함 */
    background: #00558b;
    color: #fff;
    font-size: 36px;
    line-height: 100px;
    margin: 10px;
    padding: 2%;
    position: relative;
    text-align: center;
  }
`;

styled-component를 사용해서 커스텀했는데, 

  . center .slick-center ${MultiItem} {
    /* center 모드일 때 center에게 강조할 경우 사용 */
    color: #e67e22;
    opacity: 1;
    transform: scale(1.06);
  }

실제 center 슬라이드에게 주고 싶은 경우 넣어주면 된다. 

 

  ${MultiItem} {
    /* center 옵션의 경우 MultiTem 속성을 추가로 사용해서 내부 옵션을 추가로 줘야 함 */
    background: #00558b;
    color: #fff;
    font-size: 36px;
    line-height: 100px;
    margin: 10px;
    padding: 2%;
    position: relative;
    text-align: center;
    opacity: 0.8;
    transition: all 300ms ease;
    transform: scale(0.99);
  }

center 슬라이드 외 다른 슬라이드에게 차별점을 주고 싶을 경우 넣어준다.

5. VariableWidthSlide 

width 값을 자유롭게 변경할 수 있는 슬라이드!

import React from "react";
import Slider from "react-slick";
import { SlideContainer, SlidePage } from "../styles";

const VariableWidthSlide = ({}) => {
  const settings = {
    dots: true,
    infinite: true,
    centerMode: true,
    slidesToScroll: 1,
    variableWidth: true,
  };

  return (
    <SlideContainer>
      <h1>VariableWidthSlide</h1>

      <Slider {...settings}>
        <SlidePage style={{ width: 100 }} padding={`50px 0`}>
          100
        </SlidePage>
        <SlidePage style={{ width: 400 }} padding={`50px 0`}>
          400
        </SlidePage>
        <SlidePage style={{ width: 700 }} padding={`50px 0`}>
          700
        </SlidePage>
        <SlidePage style={{ width: 200 }} padding={`50px 0`}>
          200
        </SlidePage>
        <SlidePage style={{ width: 500 }} padding={`50px 0`}>
          500
        </SlidePage>
        <SlidePage style={{ width: 300 }} padding={`50px 0`}>
          300
        </SlidePage>
        <SlidePage style={{ width: 1000 }} padding={`50px 0`}>
          1000
        </SlidePage>
      </Slider>
    </SlideContainer>
  );
};

export default VariableWidthSlide;

settings 옵션

variableWidth : width 값 자유도를 on/off로 설정할 수 있다.

 

6. VerticalModeSlide 

좌우 슬라이드가 아닌 위아래 슬라이드로 변경한 슬라이드

import React from "react";
import Slider from "react-slick";
import { SlideContainer, SlidePage } from "../styles";

const VerticalModeSlide = ({}) => {
  const settings = {
    dots: true,
    infinite: true,
    cssEase: "linear",

    slidesToShow: 3,
    slidesToScroll: 1,
    vertical: true,
  };

  return (
    <SlideContainer>
      <h1>VerticalModeSlide</h1>

      <Slider {...settings}>
        <SlidePage padding={`50px 0`}>1</SlidePage>
        <SlidePage padding={`50px 0`}>2</SlidePage>
        <SlidePage padding={`50px 0`}>3</SlidePage>
        <SlidePage padding={`50px 0`}>4</SlidePage>
        <SlidePage padding={`50px 0`}>5</SlidePage>
        <SlidePage padding={`50px 0`}>6</SlidePage>
        <SlidePage padding={`50px 0`}>7</SlidePage>
      </Slider>
    </SlideContainer>
  );
};

export default VerticalModeSlide;

settings 옵션

vertical : vertical 모드를 on/off 할 수 있는 옵션

 

7. Gallery Slide 

위에 메인 슬라이드가 있고 아래에 서브 슬라이드가 있는 형식이다. 

 

react slick에서는asNavFor이라는 명칭으로 지정되어있다. 

import React, { useState } from "react";
import Slider from "react-slick";
import { SlideContainer, SlidePage } from "../styles";

const GallerySlide = () => {
  const [mainSlide, setMainSlide] = useState();
  const [subSlide, setSubSlide] = useState();

  return (
    <SlideContainer>
      <h1>GallerySlide</h1>

      <Slider asNavFor={subSlide} ref={(slider) => setMainSlide(slider)}>
        <SlidePage padding={`50px 0`}>1</SlidePage>
        <SlidePage padding={`50px 0`}>2</SlidePage>
        <SlidePage padding={`50px 0`}>3</SlidePage>
        <SlidePage padding={`50px 0`}>4</SlidePage>
        <SlidePage padding={`50px 0`}>5</SlidePage>
        <SlidePage padding={`50px 0`}>6</SlidePage>
        <SlidePage padding={`50px 0`}>7</SlidePage>
      </Slider>

      <Slider
        asNavFor={mainSlide}
        ref={(slider) => setSubSlide(slider)}
        slidesToShow={3}
        focusOnSelect={true}
      >
        <SlidePage padding={`50px 0`}>1</SlidePage>
        <SlidePage padding={`50px 0`}>2</SlidePage>
        <SlidePage padding={`50px 0`}>3</SlidePage>
        <SlidePage padding={`50px 0`}>4</SlidePage>
        <SlidePage padding={`50px 0`}>5</SlidePage>
        <SlidePage padding={`50px 0`}>6</SlidePage>
        <SlidePage padding={`50px 0`}>7</SlidePage>
      </Slider>
    </SlideContainer>
  );
};

export default GallerySlide;

settings 옵션

asNavFor : 각자 바라보고 있는 Slide의 ref를 넣어주면 슬라이드 이동 시 같이 이동된다. 

반응형

'React > Npm' 카테고리의 다른 글

[React] npm 배포 시 문제  (0) 2023.03.26
[NPM] React SNS Login 패키지 만들기  (1) 2022.03.30

댓글