๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
JavaScript/React

React Slick ์‚ฌ์šฉ๋ฒ•

by ์ฝ”๋”ฉํ•˜๋Š” ๋ถ•์–ด 2021. 11. 16.
๋ฐ˜์‘ํ˜•

๐ŸŒณ React Slick

๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ์—์„œ carousel์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•˜๋„๋ก ๋„์™€์ฃผ๋Š” ๋ชจ๋“ˆ

๐Ÿ‘‰๐Ÿป React Slick ํ™ˆํŽ˜์ด์ง€

๐Ÿ‘‰๐Ÿป ์Šฌ๋ผ์ด๋“œ ์ข…๋ฅ˜

 

 

1. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ํ„ฐ๋ฏธ๋„์— ์ž…๋ ฅํ•ด์„œ ์„ค์น˜ํ•ด์ค€๋‹ค.

$ npm install react-slick --save  
$ npm install slick-carousel --save  

 

2. ๊ทธ๋ฆฌ๊ณ  Slick์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” CSS๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ์˜ ์ฝ”๋“œ๋ฅผ importํ•ด์ค€๋‹ค.

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

 

3. ๊ธฐ๋ณธ ํ˜•ํƒœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

import React, { Component } from "react";
import Slider from "react-slick";

export default class SimpleSlider extends Component {
  render() {
    const settings = {
      dots: true,
      infinite: true,
      speed: 500,
      slidesToShow: 1,
      slidesToScroll: 1
    };
    return (
      <div>
        <h2> Single Item</h2>
        <Slider {...settings}>
          <div>
            <h3>1</h3>
          </div>
          <div>
            <h3>2</h3>
          </div>
          <div>
            <h3>3</h3>
          </div>
          <div>
            <h3>4</h3>
          </div>
          <div>
            <h3>5</h3>
          </div>
          <div>
            <h3>6</h3>
          </div>
        </Slider>
      </div>
    );
  }
}

 

4. ๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

์ผ๋‹จ ๋‚˜๋Š” React ํ•จ์ˆ˜ํ˜•๊ณผ styled-component๋กœ ์‚ฌ์šฉํ–ˆ๋‹ค.

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

function Slide({ sliders }) {
  return (
    <Container>
      <SlideTitle>์ธ๊ธฐ ์„œ๋น„์Šค</SlideTitle>
      <StyledSlider {...settings}>
        {sliders.map(({ name, image }) => {
          return (
            <CardBox>
              <CardImg alt="์ธ๊ธฐ ์„œ๋น„์Šค" src={image} />
              <CardText>{name}</CardText>
            </CardBox>
          );
        })}
      </StyledSlider>
    </Container>
  );
}

export default Slide;

// ์Šฌ๋ผ์ด๋“œ ์„ค์ •
const settings = {
  dots: true,  // ์Šฌ๋ผ์ด๋“œ ๋ฐ‘์— ์  ๋ณด์ด๊ฒŒ
  infinite: true,  // ๋ฌดํ•œ์œผ๋กœ ๋ฐ˜๋ณต
  speed: 500,
  autoplay: true,
  autoplaySpeed: 2000,  // ๋„˜์–ด๊ฐ€๋Š” ์†๋„
  slidesToShow: 4,  // 4์žฅ์”ฉ ๋ณด์ด๊ฒŒ
  slidesToScroll: 1,  // 1์žฅ์”ฉ ๋’ค๋กœ ๋„˜์–ด๊ฐ€๊ฒŒ
  centerMode: true,
  centerPadding: '0px',  // 0px ํ•˜๋ฉด ์Šฌ๋ผ์ด๋“œ ๋์ชฝ ์ด๋ฏธ์ง€๊ฐ€ ์•ˆ์ž˜๋ฆผ
};

const SlideTitle = styled.h2`
  padding: 60px 0px 50px 0px;
  text-align: center;
  font-size: 30px;
  font-weight: bolder;
`;

const Container = styled.div`
  margin-right: 25px;
`;

// ์Šฌ๋ผ์ด๋“œ CSS
const StyledSlider = styled(Slider)`
  .slick-list {
    width: 1600px;
    margin: 0 auto;
  }

  .slick-slide div {
    /* cursor: pointer; */
  }

  .slick-dots {
    bottom: -50px;
    margin-top: 200px;
  }

  .slick-track {
    /* overflow-x: hidden; */
  }
`;

const CardBox = styled.div`
  cursor: pointer;
`;

const CardImg = styled.img`
  width: 380px;
  height: 190px;
`;

const CardText = styled.p`
  padding: 20px;
  font-size: 20px;
  font-weight: bolder;
  text-align: center;
`;



 

๐ŸŒณ ์žฅ๋‹จ์ 

  • ์žฅ์ 
    ๋˜ฅ์†๋„ ์‰ฝ๊ฒŒ ์Šฌ๋ผ์ด๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ. (๋ณธ์ธ ๋˜ฅ์†)
  • ๋‹จ์ 
    ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๊ธฐ๋ณธ CSS๊ฐ€ ์ ์šฉ๋˜์–ด ์žˆ์–ด์„œ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด
const StyledSlider = styled(Slider)`
  .slick-list {
    width: 1600px;
    margin: 0 auto;
  }

  .slick-slide div {
    /* cursor: pointer; */
  }

  .slick-dots {
    bottom: -50px;
    margin-top: 200px;
  }

  .slick-track {
    /* overflow-x: hidden; */
  }
`;

์ด๋ ‡๊ฒŒ CSS๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ๋œฏ์–ด๋ณด๋ฉด์„œ ๊ณ ์ณ์•ผํ•จ. =_= ์ƒ๋‹นํžˆ ๊ท€์ฐฎ์Œ.

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€