rigood

[React] ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด ์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋” ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• 2 ๋ณธ๋ฌธ

๐ŸŽจ ํ”„๋ก ํŠธ์—”๋“œ/React

[React] ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด ์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋” ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• 2

rigood 2022. 12. 20. 00:40

์ง€๋‚œ ๊ธ€์—์„œ๋Š” absolute์™€ opacity๋ฅผ ์ด์šฉํ•˜์—ฌ ์Šฌ๋ผ์ด๋”๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” CSS์˜ translateX ์†์„ฑ์„ ์ด์šฉํ•˜์—ฌ ์˜†์œผ๋กœ ์ด๋™ํ•˜๋Š” ์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋”๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

๋จผ์ € ์™„์„ฑ์ƒท์ž…๋‹ˆ๋‹ค.

์ด๋™ ๋ฒ„ํŠผ๊ณผ ํŽ˜์ด์ง€๋„ค์ด์…˜๊นŒ์ง€ ๊ตฌํ˜„ํ•œ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค.

 

๋‹ค๋งŒ ๋ฌธ์ œ๋Š”...

๋งˆ์ง€๋ง‰ ์Šฌ๋ผ์ด๋“œ์—์„œ Next ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ๋งจ ์ฒ˜์Œ ์Šฌ๋ผ์ด๋“œ๋กœ ๊ฑฐ๊พธ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

 

์ฒซ๋ฒˆ์งธ ์Šฌ๋ผ์ด๋“œ์—์„œ Prev ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ๋„ ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ,

์˜ค๋ฅธ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•˜์—ฌ ์ค‘๊ฐ„์— ์žˆ๋Š” ๋ชจ๋“  ์ด๋ฏธ์ง€๋ฅผ ๊ฑฐ์ณ ๋งˆ์ง€๋ง‰ ์Šฌ๋ผ์ด๋“œ์— ๋„๋‹ฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 


translateX๋ฅผ ์ด์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋” ๋งŒ๋“ค๊ธฐ

โ€ป CSS๋Š” styled-components ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

 

0. ๊ตฌํ˜„ ์›๋ฆฌ ํ•œ๋ˆˆ์— ๋ณด๊ธฐ

์ด๋ฏธ์ง€๋ฅผ ์ผ๋ ฌ๋กœ ์ญ‰ ๋‚˜์—ดํ•œ ๋‹ค์Œ

translateX๋ฅผ ํ†ตํ•ด ์ด๋ฏธ์ง€๋ฅผ ์ด๋™์‹œํ‚ค๋Š” ์›๋ฆฌ์ž…๋‹ˆ๋‹ค.

 

์‹ค์ œ๋กœ๋Š” ์ € ํ•‘ํฌ์ƒ‰ ๋ฒ„ํŠผ์ด ์žˆ๋Š” ๊ตฌ๊ฐ„๋งŒ ๋ณด์ด๋Š”๋ฐ

์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด overflow:hidden ์†์„ฑ์„ ์ž ์‹œ ์ง€์›Œ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 

์ฒซ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋Š” ์›๋ž˜ ๊ทธ ์ž๋ฆฌ์—ฌ์„œ ์ด๋™์‹œํ‚ฌ ํ•„์š”๊ฐ€ ์—†์œผ๋‹ˆ๊นŒ translateX(0)

 

๋‘๋ฒˆ์งธ ์ด๋ฏธ์ง€๋Š” ์ € ํ•‘ํฌ์ƒ‰ ๋ฒ„ํŠผ์ด ์žˆ๋Š” ๊ตฌ๊ฐ„์˜ ๋„ˆ๋น„๋งŒํผ ์™ผ์ชฝ์œผ๋กœ ์ด๋™์‹œํ‚ค๋ฉด ๋˜๊ฒ ์ฃ ?

๊ทธ๋ž˜์„œ translateX(-100%)

 

์„ธ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋Š” translateX(-200%)

๋„ค๋ฒˆ์งธ ์ด๋ฏธ์ง€๋Š” translateX(-300%)

์ด๋Ÿฐ์‹์œผ๋กœ ์ด๋ฏธ์ง€ ์ˆœ์„œ์— ๋”ฐ๋ผ ์ด๋™ํญ์„ ๋Š˜๋ ค์„œ, ํ™”๋ฉด์— ๋ณด์ผ ์Šฌ๋ผ์ด๋”๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

 

 

1. useState๋กœ ํ™”๋ฉด์— ๋ณด์—ฌ์งˆ ์Šฌ๋ผ์ด๋“œ ๋ฒˆํ˜ธ ์ง€์ •

function Slider2() {
  const [slideIndex, setSlideIndex] = useState(0);

useState๋กœ slideIndex๋ผ๋Š” state๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

์ฒซ๋ฒˆ์งธ ์Šฌ๋ผ์ด๋“œ๋Š” ์ด๋™ํญ์ด 0์ด๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๊ธฐ๊ฐ’์€ 0์œผ๋กœ ์„ค์ •ํ•ด์ฃผ์„ธ์š”.

 

2.  ์Šฌ๋ผ์ด๋“œ ๋‚˜์—ด, ์ด๋™ ๋ฒ„ํŠผ ์ƒ์„ฑ

return (
    <Container>
      <Arrow direction="prev">โ—€</Arrow>
      <Wrapper slideIndex={slideIndex}>
        {data.map((character) => (
          <Slide key={character.id}>
            <Photo
              src={process.env.PUBLIC_URL + `/img/slider/${character.img}`}
            />
          </Slide>
        ))}
      </Wrapper>
      <Arrow direction="next"}>โ–ถ</Arrow>
    </Container>
  );
}

์Šฌ๋ผ์ด๋“œ์™€ ๋ฒ„ํŠผ์„ ๋‹ด์„ Container ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

Prev, Next ๋ฒ„ํŠผ๋„ ๋งŒ๋“ค์–ด์ฃผ๊ณ ,

Wrapper ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๊ทธ ์•ˆ์— map์„ ํ†ตํ•ด Slide ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‚˜์—ดํ•ด์ฃผ์„ธ์š”.

 

Arrow ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ์—๋Š” ๋ฒ„ํŠผ ๋ฐฉํ–ฅ์„ props๋กœ ์ „๋‹ฌํ•ด์ฃผ์‹œ๊ณ ,

Wrapper ์ปดํฌ๋„ŒํŠธ์—๋Š” slideIndex๋ฅผ props๋กœ ์ „๋‹ฌํ•ด์ฃผ์„ธ์š”.

translateX๋ฅผ ํ†ตํ•ด ์›€์ง์ด๋Š” ๋Œ€์ƒ์ด ๋ฐ”๋กœ Wrapper ์ปดํฌ๋„ŒํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์—

slideIndex๋ฅผ props๋กœ ๋ฐ›์•„ ์›€์ง์ด๋Š” ๊ฑฐ๋ฆฌ๋ฅผ ์กฐ์ ˆํ•ด์ค„๊บผ์—์š”.

 

3. CSS ์†์„ฑ ์ง€์ •

const Container = styled.div`
// ํฌ๊ธฐ ์ง€์ •
  width: 200px;
  height: 200px;
  
// ์œ— ์—ฌ๋ฐฑ, ๊ฐ€์šด๋ฐ ์ •๋ ฌ
  margin: 100px auto;
  
// Container ํฌ๊ธฐ๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๋ถ€๋ถ„ ์ˆจ๊ธฐ๊ธฐ
  overflow: hidden;
  
// position: absolute์ธ Arrow ์ปดํฌ๋„ŒํŠธ ๋ฐฐ์น˜
  position: relative;
`;

const Wrapper = styled.div`
// ๋ถ€๋ชจ ์š”์†Œ์ธ Container ์ปดํฌ๋„ŒํŠธ์˜ ๋†’์ด์— ๋งž์ถ”๊ธฐ
// width๋Š” ์ง€์ •ํ•˜์ง€ ๋ง ๊ฒƒ!
  height: 100%;
  
// flex๋ฅผ ํ†ตํ•ด Slide ์ผ๋ ฌ๋กœ ๋‚˜์—ด
  display: flex;
  
// ์ด๋™ํ•  ๋•Œ ํŠธ๋žœ์ง€์…˜ ์ ์šฉ
  transition: all 0.3s ease-in-out;
  
// props๋กœ ๋„˜๊ฒจ๋ฐ›์€ slideIndex์— ๋”ฐ๋ผ x์ถ• ์ด๋™ํญ ๊ฒฐ์ •
  transform: translateX(${({ slideIndex }) => slideIndex * -100 + "%"});
`;

const Slide = styled.div`
// ๋ถ€๋ชจ ์š”์†Œ์ธ Wrapper์˜ width๊ฐ€ ์ •ํ•ด์ง€์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ
// ์กฐ๋ถ€๋ชจ ์š”์†Œ์ธ Container ์ปดํฌ๋„ŒํŠธ์˜ width์— ๋งž์ถฐ์ง
  width: 100%;
  height: 100%;
  
// ๋ถ€๋ชจ ์š”์†Œ์˜ ๋„ˆ๋น„์— ์ƒ๊ด€์—†์ด ์ž์‹ ์˜ ํฌ๊ธฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ์†์„ฑ
  flex-shrink: 0;
`;

const Photo = styled.img`
  width: 100%;
  height: 100%;
  object-fit: cover;
`;

const Arrow = styled.div`
// Container ์ปดํฌ๋„ŒํŠธ ๊ธฐ์ค€์œผ๋กœ ๋ฐฐ์น˜
  position: absolute;
  top: 0;
  bottom: 0;
  margin: auto 0;
  
// Prev ๋ฒ„ํŠผ์€ left: 0, Next ๋ฒ„ํŠผ์€ right: 0
  left: ${({ direction }) => direction === "prev" && "0px"};
  right: ${({ direction }) => direction === "next" && "0px"};
  
// ํฌ๊ธฐ, ์Šคํƒ€์ผ ์ง€์ •
  width: 36px;
  height: 36px;
  border-radius: 50%;
  background-color: pink;
  cursor: pointer;
  
// ๋‚ด๋ถ€ ๊ฐ€์šด๋ฐ ์ •๋ ฌ
  display: flex;
  justify-content: center;
  align-items: center;

// Prev ๋ฒ„ํŠผ์ด Slide์— ๊ฐ€๋ฆฌ์ง€ ์•Š๋„๋ก z-index ์ง€์ •
  z-index: 1;
`;

Container ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ†ตํ•ด ์Šฌ๋ผ์ด๋”์˜ ํฌ๊ธฐ๋ฅผ ์ •ํ•ด์ค๋‹ˆ๋‹ค.

 

Wrapper ์ปดํฌ๋„ŒํŠธ๋Š” ๊ฐ€๋กœ๋กœ ์ญ‰ ๋‚˜์—ด๋œ Slide๋ฅผ ๊ฐ์‹ธ๋Š” ์š”์†Œ์ด๊ธฐ ๋•Œ๋ฌธ์— width ๊ฐ’์€ ๋”ฐ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

props๋กœ ๋„˜๊ฒจ๋ฐ›์€ slideIndex์— ๋”ฐ๋ผ translateX์˜ ์ด๋™ํญ์„ ์„ค์ •ํ•ด์ค๋‹ˆ๋‹ค.

์ด๋™ ๋ฒ„ํŠผ์„ ํ•œ ๋ฒˆ ํด๋ฆญํ•  ๋•Œ๋งˆ๋‹ค, ๋ถ€๋ชจ ์š”์†Œ์ธ Container ์ปดํฌ๋„ŒํŠธ์˜ width๋งŒํผ ์ด๋™ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—

๋‹จ์œ„๋Š” % ๋กœ ์žก์•„์ค๋‹ˆ๋‹ค. (% ๋‹จ์œ„๋Š” ๋ถ€๋ชจ ์š”์†Œ ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค.)

 

transform: translateX(${({ slideIndex }) => slideIndex * -100 + "%"});

slideIndex๊ฐ€ 0์ด๋ฉด 0% (์ด๋™์•ˆํ•จ)
slideIndex๊ฐ€ 1์ด๋ฉด -100% (x์ถ• ์™ผ์ชฝ์œผ๋กœ ๋ถ€๋ชจ์š”์†Œ width๋งŒํผ ์ด๋™)
slideIndex๊ฐ€ 2์ด๋ฉด -200% (x์ถ• ์™ผ์ชฝ์œผ๋กœ ๋ถ€๋ชจ์š”์†Œ width 2๋ฐฐ๋งŒํผ ์ด๋™)

 

Slide ์ปดํฌ๋„ŒํŠธ์—๋Š” flex-shrink: 0 ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.

์ด ์†์„ฑ์ด ์—†์œผ๋ฉด, ๋ถ€๋ชจ ์š”์†Œ์ธ Wrapper ์ปดํฌ๋„ŒํŠธ width์— ๋งž์ถ”๊ธฐ ์œ„ํ•ด width๊ฐ€ ์ค„์–ด๋“ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

flex-shrink:0 ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ถ€๋ชจ ์š”์†Œ์˜ ๋„ˆ๋น„์— ์ƒ๊ด€์—†์ด ์ž์‹ ์˜ ํฌ๊ธฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

 

4. Prev, Next ๋ฒ„ํŠผ ํด๋ฆญ ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

  const moveToPrevSlide = () => {
    setSlideIndex((prev) => (prev === 0 ? data.length - 1 : prev - 1));
  };

  const moveToNextSlide = () => {
    setSlideIndex((prev) => (prev === data.length - 1 ? 0 : prev + 1));
  };
  
<Arrow direction="prev" onClick={moveToPrevSlide}>โ—€</Arrow>
<Arrow direction="next" onClick={moveToNextSlide}>โ–ถ</Arrow>

Prev ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ

๊ธฐ์กด slideIndex๊ฐ€ 0์ด๋ฉด(์ฒซ๋ฒˆ์งธ ์Šฌ๋ผ์ด๋“œ์ด๋ฉด) slideIndex๋ฅผ data.length -1(๋งˆ์ง€๋ง‰ ์Šฌ๋ผ์ด๋“œ)๋กœ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค.

(slideIndex๊ฐ€ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์ง€๋ง‰ ์Šฌ๋ผ์ด๋“œ์˜ ๋ฒˆํ˜ธ๋Š” ๋ฐฐ์—ด ๊ธธ์ด-1์ด ๋ฉ๋‹ˆ๋‹ค.)

๊ทธ ์™ธ ๊ฒฝ์šฐ์—๋Š” slideIndex๋ฅผ 1์”ฉ ๊ฐ์†Œ์‹œํ‚ต๋‹ˆ๋‹ค.

 

Next ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ

๊ธฐ์กด slideIndex๊ฐ€ data.length-1์ด๋ฉด(๋งˆ์ง€๋ง‰ ์Šฌ๋ผ์ด๋“œ๋ผ๋ฉด) slideIndex๋ฅผ 0์œผ๋กœ(์ฒซ๋ฒˆ์งธ ์Šฌ๋ผ์ด๋“œ)๋กœ ๋ฐ”๊ฟ”์ฃผ๊ณ ,

๊ทธ ์™ธ ๊ฒฝ์šฐ์—๋Š” slideIndex๋ฅผ 1์”ฉ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.

 

Arrow ์ปดํฌ๋„ŒํŠธ์— onClick ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋‹ฌ์•„์ค๋‹ˆ๋‹ค.

 

5. ํŽ˜์ด์ง€๋„ค์ด์…˜ ๊ตฌํ˜„ํ•˜๊ธฐ

const moveDot = (index) => {
    setSlideIndex(index);
  };
 
 <DotContainer>
        {data.map((character, index) => (
          <Dot
            key={character.id}
            className={index === slideIndex ? "active" : null}
            onClick={() => moveDot(index)}
          />
        ))}
 </DotContainer>

DotContainer๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ์•ˆ์— map์„ ํ†ตํ•ด Dot์„ ๋‚˜์—ดํ•ด์ค๋‹ˆ๋‹ค.

map์˜ ๋‘๋ฒˆ์งธ ์ธ์ž์ธ index๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ index์™€ ํ˜„์žฌ slideIndex๊ฐ€ ์ผ์น˜ํ•  ๋•Œ

active๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋ถ€์—ฌํ•ด์ค๋‹ˆ๋‹ค.

 

Dot ํด๋ฆญ ์‹œ index๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ slideIndex๋ฅผ ๋ณ€๊ฒฝํ•ด์ค๋‹ˆ๋‹ค.

Wrapper์— props๋กœ ์ „๋‹ฌ๋œ slideIndex์— ๋”ฐ๋ผ x์ถ• ์ด๋™ํญ์ด ๋‹ฌ๋ผ์ง€๊ณ ,

slideIndex์— ๋งž๋Š” ์ด๋ฏธ์ง€๊ฐ€ ํ™”๋ฉด์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

 

const DotContainer = styled.div`
  position: absolute;
  bottom: 10px;
  left: 0;
  right: 0;
  margin: 0 auto;
  width: 100px;
  display: flex;
  justify-content: space-between;
`;

const Dot = styled.div`
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background-color: pink;
  cursor: pointer;
  &.active {
    background-color: skyblue;
  }

Dot ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” active ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด

ํ˜„์žฌ ํด๋ฆญ๋œ Dot๋งŒ ๋ฐฐ๊ฒฝ์ƒ‰์„ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•ด์ค๋‹ˆ๋‹ค.

 

 

์ „์ฒด ์ฝ”๋“œ

import { useState } from "react";
import styled from "styled-components";
import data from "./data";

function Slider2() {
  const [slideIndex, setSlideIndex] = useState(0);

  const moveToPrevSlide = () => {
    setSlideIndex((prev) => (prev === 0 ? data.length - 1 : prev - 1));
  };

  const moveToNextSlide = () => {
    setSlideIndex((prev) => (prev === data.length - 1 ? 0 : prev + 1));
  };

  const moveDot = (index) => {
    setSlideIndex(index);
  };

  return (
    <Container>
      <Arrow direction="prev" onClick={moveToPrevSlide}>
        โ—€
      </Arrow>
      <Wrapper slideIndex={slideIndex}>
        {data.map((character) => (
          <Slide key={character.id}>
            <Photo
              src={process.env.PUBLIC_URL + `/img/slider/${character.img}`}
            />
          </Slide>
        ))}
      </Wrapper>
      <Arrow direction="next" onClick={moveToNextSlide}>
        โ–ถ
      </Arrow>
      <DotContainer>
        {data.map((character, index) => (
          <Dot
            key={character.id}
            className={index === slideIndex ? "active" : null}
            onClick={() => moveDot(index)}
          />
        ))}
      </DotContainer>
    </Container>
  );
}

export default Slider2;

const Container = styled.div`
  width: 200px;
  height: 200px;
  margin: 100px auto;
  overflow: hidden;
  position: relative;
`;

const Wrapper = styled.div`
  height: 100%;
  display: flex;
  transition: all 0.3s ease-in-out;
  transform: translateX(${({ slideIndex }) => slideIndex * -100 + "%"});
`;

const Slide = styled.div`
  width: 100%;
  height: 100%;
  flex-shrink: 0;
`;

const Photo = styled.img`
  width: 100%;
  height: 100%;
  object-fit: cover;
`;

const Arrow = styled.div`
  position: absolute;
  top: 0;
  bottom: 0;
  margin: auto 0;
  left: ${({ direction }) => direction === "prev" && "0px"};
  right: ${({ direction }) => direction === "next" && "0px"};
  width: 36px;
  height: 36px;
  border-radius: 50%;
  background-color: pink;
  display: flex;
  justify-content: center;
  align-items: center;
  cursor: pointer;
  z-index: 1;
`;

const DotContainer = styled.div`
  position: absolute;
  bottom: 10px;
  left: 0;
  right: 0;
  margin: 0 auto;
  width: 100px;
  display: flex;
  justify-content: space-between;
`;

const Dot = styled.div`
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background-color: pink;
  cursor: pointer;
  &.active {
    background-color: skyblue;
  }
`;
// data.js

const data = [
  {
    id: 1,
    name: "์šฐ์˜์šฐ",
    nickname: "์ฒœ์žฌ ๋ณ€ํ˜ธ์‚ฌ",
    img: "youngwoo.jpg",
  },
  {
    id: 2,
    name: "์ด์ค€ํ˜ธ",
    nickname: "์„ญ์„ญํ•œ๋ฐ์š”",
    img: "junho.jpg",
  },
  {
    id: 3,
    name: "์ •๋ช…์„",
    nickname: "์œ ๋‹ˆ์ฝ˜ ์ƒ์‚ฌ",
    img: "myeongseok.jpg",
  },
  {
    id: 4,
    name: "์ตœ์ˆ˜์—ฐ",
    nickname: "๋ด„๋‚ ์˜ ํ–‡์‚ด",
    img: "suyeon.jpg",
  },
  {
    id: 5,
    name: "๊ถŒ๋ฏผ์šฐ",
    nickname: "๊ถŒ๋ชจ์ˆ ์ˆ˜",
    img: "minwoo.jpg",
  },
];

export default data;

 

Comments