Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

나 개발자 할래요

홈 - 리뷰 캐러셀 구현 본문

개발자 되는 법.../TIL...

홈 - 리뷰 캐러셀 구현

개발_자 2024. 10. 30. 09:49
  • 확장 배열

  • 무한 캐러셀 원리(내가 생각한..)

6개의 review 배열

배열의 마지막 리뷰를 맨 앞에, 그리고 첫 번째와 두 번째 리뷰를 배열 끝에 추가한 확장 배열을 만듦 → 캐러셀이 무한히 돌아가는 것처럼 보이게 하기 위한 트릭

카드가 천천히 이동하며, 위 사진처럼 6, 1, 2번 리뷰 카드가 화면에 보이는 시점에 6, 1, 2번 리뷰 카드로 빠르게 이어져 무한 슬라이딩이 가능하도록 함

 

마음처럼 잘 작동하지 않는 캐러셀 코드

'use client';



import Image from 'next/image';

import { useEffect, useRef, useState } from 'react';



const Carousel = () => {

  const extendedReviewArr= [reviewArr[reviewArr.length - 1], ...reviewArr, reviewArr[0], reviewArr[1]];

  const [currentIndex, setCurrentIndex] = useState(1);



  useEffect(() => {

    const interval = setInterval(() => {

      setCurrentIndex((prevIndex) => (prevIndex + 1) % extendedReviewArr.length);

    }, 2000);



    return () => clearInterval(interval);

  }, []);



  useEffect(() => {

    if (currentIndex === extendedReviewArr.length - 1) {

      setTimeout(() => {

        setCurrentIndex(0);

      }, 500);

    }

  }, [currentIndex, extendedReviewArr.length]);



  const getCarouselStyle = () => {

    return {

      transform: `translateX(-${currentIndex * (100/extendedReviewArr.length)}px)`,

      transition: `${currentIndex === 0 ? 'none' : 'transform 0.5s ease-in-out'}`,

    };

  };



  return (

    <div className='flex w-[375px] h-[328px] overflow-hidden'>

      <div

        className='flex'

        style={getCarouselStyle()}

      >

        {extendedReviewArr.map((review) => {

          return (

            <div

              key={review.id}

              className='mx-[8px]'

            >

              <div className='relative w-[216px] h-[222px] rounded-t-lg overflow-hidden'>

                <Image

                  src={review.image_url}

                  alt='리뷰 이미지'

                  layout='fill'

                  objectFit='cover'

                />

              </div>



              <div className='w-[216px] h-[104px] border-2 rounded-b-lg'>

                <p>{review.user_id}</p>

                <p>{review.content}</p>

              </div>

            </div>

          );

        })}

      </div>

    </div>

  );

};



export default Carousel;

'개발자 되는 법... > TIL...' 카테고리의 다른 글

홈 - 리뷰 캐러셀(개수 및 위치)  (0) 2024.11.01
홈 - 리뷰 캐러셀 (위치)  (0) 2024.10.31
마커 위도 경도 null 값 처리  (0) 2024.10.28
3-4. Auth + MiddleWare  (0) 2024.10.25
3-3. React Hook Form & w Zod  (2) 2024.10.24