src/pages/EventPage.js ๐ก
import React, { useState } from "react";
import styled from "styled-components";
import { events } from "../data/EventList";
const CardContainer = styled.div`
display: flex;
overflow-x: scroll;
width: 100%;
height: 200px;
cursor: grab;
background-color: #424242;
`;
const Card = styled.div`
height: 100%;
margin: 30px;
display: flex;
justify-content: center;
align-items: center;
font-size: 20px;
transition: transform 0.3s ease;
&:hover {
transform: scale(1.1);
cursor: pointer;
}
`;
const EventCardWrapper = styled.div``;
const EventCardImg = styled.img`
width: 400px;
height: 400px;
`;
const EventPage = () => {
const [isMousePressed, setIsMousePressed] = useState(false);
const [containerScrollLeft, setContainerScrollLeft] = useState(0);
const [startMouseX, setStartMouseX] = useState(0);
const handleMousePress = (e) => {
setIsMousePressed(true);
setStartMouseX(e.pageX - e.currentTarget.offsetLeft);
setContainerScrollLeft(e.currentTarget.scrollLeft);
console.log(e.currentTarget.scrollLeft);
};
const handleMouseMove = (e) => {
if (!isMousePressed) return;
const currentMouseX = e.pageX - e.currentTarget.offsetLeft;
e.currentTarget.scrollLeft =
containerScrollLeft - (currentMouseX - startMouseX);
};
const handleMouseRelease = () => setIsMousePressed(false);
return (
<CardContainer
style={{ height: "1000px" }}
onMouseDown={handleMousePress}
onMouseMove={handleMouseMove}
onMouseUp={handleMouseRelease}
onMouseLeave={handleMouseRelease}
>
{events?.map((event) => (
<Card key={event.id}>
<EventCardWrapper>
<EventCardImg src={event.image} alt={event.title} />
<h3
style={{
color: "rgb(255, 255, 255)",
fontWeight: "bolder",
textAlign: "center",
}}
>
{event.title}
</h3>
<p
style={{
color: "rgb(155, 155, 155)",
fontWeight: "bolder",
textAlign: "center",
}}
>
{event.subtitle}
</p>
</EventCardWrapper>
</Card>
))}
</CardContainer>
);
};
export default EventPage;
src/data/EventList.js ๐ก
import { eventImg } from "../images";
export const events = [
{
id: "1",
image: eventImg.eventImg1,
title: "2023 ์ฌ๋ฆ ์ ๋ฌผ์ธํธ",
subtitle:
"์ผ๋ฆฌ๋ฒ๋ ๊ธฐ๊ฐ, ์ต๋ 7% ํ ์ธ๋ ๊ฐ๊ฒฉ์ผ๋ก ์ด์ ์ ํ ๊ฐ์ฌ์ ๋ง์์ ์ ํ์ธ์!",
},
{
id: "2",
image: eventImg.eventImg2,
title: "ํธ์งํ ๋ฐ๋ฒ ํ ํํฐ ์ด๋ฒคํธ",
subtitle: "์ต๋ 15,000์ ํ ์ธ๋ฐ๊ณ ํธ์งํ ๋ฐ๋ฒ ํ ํํฐ๋ฅผ ์ค๋นํ์ธ์!",
},
{
id: "3",
image: eventImg.eventImg3,
title: "์น๊ตฌ ์ด๋ ์ด๋ฒคํธ",
subtitle: "์ฆ๊ฑฐ์ด ์ผ์์ ๋ณํ '์ด์ ์ '์ ์์คํ ์ฌ๋์๊ฒ ์๋ ค์ฃผ์ธ์!",
},
{
id: "4",
image: eventImg.eventImg4,
title: "์ฑ ์ค์น ์ด๋ฒคํธ",
subtitle: "์ ์ก๊ฐ ์ฑ ์ค์นํ๊ณ ์ด์ ์ ํ ์ผ์์ ๋๋ ค๋ณด์ธ์!",
},
{
id: "5",
image: eventImg.eventImg5,
title: "์ํ ๋ฆฌ๋ทฐ ํํ",
subtitle: "๋ง์กฑํ์ ๋ง์์ ๋ด์ ์ํ ๋ฆฌ๋ทฐ๋ฅผ ์์ฑํด์ฃผ์ธ์.",
},
{
id: "6",
image: eventImg.eventImg6,
title: "์ ์ ํ๋ ๋ฐฐ์ก ํํ",
subtitle: "ํ ๋ฒ ๋ฐฐ์ก๋น๋ก 4ํ ๋ฌด๋ฃ๋ฐฐ์ก",
},
{
id: "7",
image: eventImg.eventImg1,
title: "2023 ์ฌ๋ฆ ์ ๋ฌผ์ธํธ",
subtitle:
"์ผ๋ฆฌ๋ฒ๋ ๊ธฐ๊ฐ, ์ต๋ 7% ํ ์ธ๋ ๊ฐ๊ฒฉ์ผ๋ก ์ด์ ์ ํ ๊ฐ์ฌ์ ๋ง์์ ์ ํ์ธ์!",
},
{
id: "8",
image: eventImg.eventImg2,
title: "ํธ์งํ ๋ฐ๋ฒ ํ ํํฐ ์ด๋ฒคํธ",
subtitle: "์ต๋ 15,000์ ํ ์ธ๋ฐ๊ณ ํธ์งํ ๋ฐ๋ฒ ํ ํํฐ๋ฅผ ์ค๋นํ์ธ์!",
},
{
id: "9",
image: eventImg.eventImg3,
title: "์น๊ตฌ ์ด๋ ์ด๋ฒคํธ",
subtitle: "์ฆ๊ฑฐ์ด ์ผ์์ ๋ณํ '์ด์ ์ '์ ์์คํ ์ฌ๋์๊ฒ ์๋ ค์ฃผ์ธ์!",
},
{
id: "10",
image: eventImg.eventImg4,
title: "์ฑ ์ค์น ์ด๋ฒคํธ",
subtitle: "์ ์ก๊ฐ ์ฑ ์ค์นํ๊ณ ์ด์ ์ ํ ์ผ์์ ๋๋ ค๋ณด์ธ์!",
},
{
id: "11",
image: eventImg.eventImg5,
title: "์ํ ๋ฆฌ๋ทฐ ํํ",
subtitle: "๋ง์กฑํ์ ๋ง์์ ๋ด์ ์ํ ๋ฆฌ๋ทฐ๋ฅผ ์์ฑํด์ฃผ์ธ์.",
},
{
id: "12",
image: eventImg.eventImg6,
title: "์ ์ ํ๋ ๋ฐฐ์ก ํํ",
subtitle: "ํ ๋ฒ ๋ฐฐ์ก๋น๋ก 4ํ ๋ฌด๋ฃ๋ฐฐ์ก",
},
];
src/images/index.js ๐ก
import logo from "./logo.jpeg";
import backgroundImg from "./background.png";
import termsImg from "./terms.jpeg";
import porkImg from "./porkbelly-fresh-list.png";
import chickenImg from "./chickef-cut-list.png";
import porkcutletImg from "./porkcutlet-sirloin-list.png";
import eggImg from "./egg-fresh-list.png";
import milkImg from "./milk-fresh-list.png";
import hanuroundImg from "./baby-hanuround-bmix-list.png";
import carthegardenImg from "./carthegarden.jpeg";
import eventImg1 from "./eventImg1.png";
import eventImg2 from "./eventImg2.png";
import eventImg3 from "./eventImg3.png";
import eventImg4 from "./eventImg4.png";
import eventImg5 from "./eventImg5.png";
import eventImg6 from "./eventImg6.png";
const eventImg = {
eventImg1,
eventImg2,
eventImg3,
eventImg4,
eventImg5,
eventImg6,
};
export {
logo,
backgroundImg,
termsImg,
porkImg,
chickenImg,
porkcutletImg,
eggImg,
milkImg,
hanuroundImg,
carthegardenImg,
eventImg,
};
ํ์ฌ ๋ชจ์ต ๐ก

hover๋๋ฉด ์ฝ๊ฐ ์ปค์ง๋ค.
ํ๊ณ ๐ข
'์ด์๋ ์ดํ๋ ์๋๋ค'๋ผ๋ ํํ์ ๊ณผ๋ํ๊ฐ์ ๊ณผ์ํ๊ฐ๋ฅผ ๋ง์ผ๋ ค๋ ์๋๋ก ์์ฃผ ์ฌ์ฉํ๋ค. '์ด์ ์ ๋จ์ด๋ค'์ด๋ผ๋ ์ฑ ์์๋ ํด๋น ํํ์ด, ์ค์ ์๋ฌด๊ฒ๋ ๋งํ์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ด๋ผ, ๋ฉ์ฉกํ ๋ฌธ์ฅ์ ์ํฌ์ ์ผ๋ก ๋ฌด์๋ฏธํ ๋จ์ด๋ค์ ๋ง๋ถ์ด๋ ๋ฏผ๋ง์ค๋ฌ์ด ๋ง์ฅ๋์ด๋ผ๊ณ ์์ ํ๋ค.
์ฐ๋ฆฌ๋ '์ด์๋ ์ดํ๋ ์๋๋ค'๋ผ๋ ํํ์ ์ฌ์ฉํ ๋, ๊ณผ๋ํ๊ฐ๋๊ธฐ ์ฌ์ด ๋์์ ๊ฐ์น๋ฅผ ํน์ ๊ธฐ์ค์ ์ ๊ณ ์ ํ๋ ์ญํ ์ ์ง์คํ๋ค. ๋ฐ๋ฉด ๊ณผ์ํ๊ฐ๋๋ ๋์์ ์นํธํ๋ ์ญํ ์ ๋ฑํ์ํ๋ ๊ฒฝํฅ์ด ์๋ค.
๋ฌด์๋ฏธํ ๋ง์ฅ๋๊น์ง๋ ์๋๋ผ๊ณ ์๊ฐํ๋ค. ์ค์ค๋ก์ ๋ํ(ํน์ ๋ฌด์์ธ๊ฐ์ ๋ํ) ํ๊ฐ๊ฐ ์ผ๋ฐํด์ง ๋ ๊ณผ์ํ๊ฐ๋ฅผ ๋ง์์ค์ผ๋ก์จ ๋ฉํ์ ์ ์ ์ ์ผ๋ก ์ ์งํด ์ค๋ค. ๋ด ์๊ฐ ๊ทธ ์ด์๋ ์ดํ๋ ์๋๋ค.