애니메이션 되는 슬라이드 만들기

Project Diary/React + Firebase (Snack ShoppingMall)

애니메이션이 적용된 슬라이드 구현 방법 기록


 

1.MainSlider.js 파일을 생성

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

const MainSliderBlock = styled.div`
  max-width: 1800px;
  margin: auto;
  width: 100vw;
  .slick-track {
    margin-top: 410px;
  }
  .slide {
    height: 50vh;
    line-height: 50vh;
    text-align: center;
    img {
      display: inline-block;
      width: 160px;
      animation: shaking 4.5s infinite ease-in-out forwards;
    }
  }
`;

const MainSlider = () => {
  const sliders = [
    { src: "./assets/image/slide1/slide_img1.png", alt: "과자1" },
    { src: "./assets/image/slide1/slide_img2.png", alt: "과자2" },
    // 추가 이미지들...
  ];

  const options = {
    dots: false,
    autoplay: true,
    autoplaySpeed: 2000,
    slidesToShow: 5,
    slidesToScroll: 1,
    arrows: false,
    centerMode: true,
    centerPadding: "60px",
    infinite: true,
  };

  return (
    <MainSliderBlock>
      <Slider className="slider" {...options}>
        {sliders.map((item, index) => (
          <div className="slide" key={index}>
            <img src={item.src} alt={item.alt} />
          </div>
        ))}
      </Slider>
    </MainSliderBlock>
  );
};

export default MainSlider;

 

 

2. 슬라이더 라이브러리 설정

slick-carousel 라이브러리를 이용해서 슬라이드를 쉽게 구현할 수 있어요.

 

 

3. 슬라이더 옵션 설정

슬라이더 옵션을 설정해서 슬라이더가 어떻게 동작할지 결정해요.

const options = {
  dots: false, // 슬라이더 하단의 도트 여부
  autoplay: true, // 자동 재생 여부
  autoplaySpeed: 2000, // 자동 재생 속도
  slidesToShow: 5, // 보여질 슬라이드 개수
  slidesToScroll: 1, // 스크롤 시 이동할 슬라이드 개수
  arrows: false, // 화살표 여부
  centerMode: true, // 센터 모드 여부
  centerPadding: "60px", // 센터 모드 시 패딩
  infinite: true, // 무한 반복 여부
  responsive: [ // 반응형 설정
    {
      breakpoint: 500,
      settings: {
        slidesToShow: 1,
        centerPadding: "90px",
      },
    },
  ],
};

 

 

4. 애니메이션 및 스타일 적용

각 슬라이드에 애니메이션을 적용해서 좀 더 동적인 느낌을 줄 수 있어요.

import { keyframes } from "styled-components";

// 흔들리는 애니메이션
const shaking = keyframes`
  0%, 100% {
    transform: rotate(0);
    transform-origin: left bottom;
  }

  22% {
    transform: rotate(7.5deg);
    transform-origin: right bottom;
  }

  44% {
    transform: rotate(-7.5deg);
    transform-origin: left bottom;
  }

  66% {
    transform: rotate(3.75deg);
    transform-origin: right bottom;
  }

  77% {
    transform: rotate(-1.875deg);
    transform-origin: left bottom;
  }

  88% {
    transform: rotate(.9375deg);
    transform-origin: right bottom;
  }
`;

 

이 애니메이션을 슬라이드 이미지에 적용해요.

const MainSliderBlock = styled.div`
  max-width: 1800px;
  margin: auto;
  position: relative;
  width: 100vw;
  .slick-track {
    margin-top: 410px;

    .slide {
      height: 50vh;
      line-height: 50vh;
      text-align: center;
      img {
        display: inline-block;
        width: 160px;
        animation: ${shaking} 4.5s infinite ease-in-out forwards;
      }
    }

    .slick-center {
      img {
        width: 240px;
      }
    }
  }
`;

 

 


5. 슬라이드 콘텐츠 추가

슬라이드에 표시될 이미지를 추가하고, 이미지가 링크를 포함하도록 설정할 수 있어요.

const MainSlider = () => {
  const sliders = [
    { src: "./assets/image/slide1/slide_img1.png", alt: "과자1" },
    { src: "./assets/image/slide1/slide_img2.png", alt: "과자2" },
    { src: "./assets/image/slide1/slide_img3.png", alt: "과자3" },
    { src: "./assets/image/slide1/slide_img4.png", alt: "과자4" },
    { src: "./assets/image/slide1/slide_img5.png", alt: "과자5" },
    { src: "./assets/image/slide1/slide_img6.png", alt: "과자7" },
    { src: "./assets/image/slide1/slide_img8.png", alt: "과자8" },
    { src: "./assets/image/slide1/slide_img9.png", alt: "과자9" },
    { src: "./assets/image/slide1/slide_img10.png", alt: "과자10" },
    { src: "./assets/image/slide1/slide_img11.png", alt: "과자11" },
    { src: "./assets/image/slide1/slide_img12.png", alt: "과자12" },
  ];

  return (
    <MainSliderBlock>
      <Slider className="slider" {...options}>
        {sliders.map((item, index) => (
          <div className="slide" key={index}>
            <Link to="/product"><img src={item.src} alt={item.alt} /></Link>
          </div>
        ))}
      </Slider>
    </MainSliderBlock>
  );
};