๐Ÿ‘ค ํ”„๋กœํ•„ UI ๊ตฌ์„ฑํ•˜๊ธฐ โ€“ ์œ ์ € ์ค‘์‹ฌ์˜ ์ •๋ณด ๊ตฌ์กฐ + ์Šคํƒ€์ผ๋ง ๊ณ ๋ฏผ

์กฐ์ค€ํ˜•ยท2025๋…„ 4์›” 2์ผ
0

CHOP!

๋ชฉ๋ก ๋ณด๊ธฐ
8/20
post-thumbnail

์ด๋ฒˆ์—๋Š” ์œ ์ € ํ”„๋กœํ•„ ํ™”๋ฉด์„ ๋งŒ๋“ค์—ˆ๋‹ค. ์ฃผ์š” ๋ชฉํ‘œ๋Š” ๊ฐ„๋‹จํ•˜๋ฉด์„œ๋„ ์ง๊ด€์ ์ธ ์œ ์ € ์ •๋ณด ํ‘œ์‹œ, ๊ทธ๋ฆฌ๊ณ  ์ถ”ํ›„ ํŽธ์ง‘ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋กœ ํ™•์žฅ ๊ฐ€๋Šฅ์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

๊ตฌํ˜„ ๋ฒ”์œ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  • ํ”„๋กœํ•„ ์นด๋“œ ๋ฐ ์•„์ด์ฝ˜ ์˜์—ญ ๊ตฌ์„ฑ

  • ๊ฑฐ๋ž˜ ์ •๋ณด ์š”์•ฝ (ํ›„๊ธฐ, ์žฌ๊ฑฐ๋ž˜ ํฌ๋ง๋ฅ , ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„)

  • ํŽธ์ง‘ ๋ฒ„ํŠผ๊ณผ ํŽ˜์ด์ง€ ์ด๋™ ์ฒ˜๋ฆฌ

  • ๊ฐ„๋‹จํ•œ ๋ฉ”๋‰ด ๊ตฌ์„ฑ (ํŒ๋งค/๊ตฌ๋งค/์ฐœ ๋ฆฌ์ŠคํŠธ)

๐Ÿงฑ ํ”„๋กœํ•„ UI ๊ตฌ์กฐ

๊ตฌ์กฐ๋Š” ํฌ๊ฒŒ ๋‘ ๋ฉ์–ด๋ฆฌ๋กœ ๋‚˜๋ˆด๋‹ค.

  • ์ƒ๋‹จ: ProfileContainer + ProfileIcon โ†’ ์œ ์ € ์ด๋ฆ„ & ๋ฐฐ๊ฒฝ, ์‚ฌ์ง„ ์—…๋กœ๋“œ ๊ธฐ๋Šฅ ํฌํ•จ

  • ํ•˜๋‹จ: TradeStatus โ†’ ๊ฑฐ๋ž˜ ์ •๋ณด ํ‘œ์‹œ / ๋‚˜์˜ ๊ฑฐ๋ž˜ ๋ฉ”๋‰ด (ํŒ๋งค๋‚ด์—ญ, ๊ตฌ๋งค๋‚ด์—ญ, ์ฐœํ•œ๋ชฉ๋ก)

<ProfileContainer showLabel={false} />
<EditProfileButton />
<TradeStatus />
<Divider />
<TitleText>๋‚˜์˜ ๊ฑฐ๋ž˜</TitleText>

๐Ÿ–ผ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์ฒ˜๋ฆฌ

ProfileContainer ์•ˆ์— ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ์šฉ input์„ ์ˆจ๊ธฐ๊ณ , label์„ ํด๋ฆญํ•˜๋ฉด ์—…๋กœ๋“œ๊ฐ€ ๋˜๋„๋ก ๊ตฌ์„ฑํ–ˆ๋‹ค.
์ถ”๊ฐ€๋กœ ProfileIcon๋„ ๋ณ„๋„๋กœ ๊ตฌ์„ฑํ•ด์„œ ํ”„๋กœํ•„ ์‚ฌ์ง„ ์˜์—ญ์„ ๊พธ๋ฉฐ์คฌ๋‹ค.

const Input = styled.input display: none;;

const Label = styled.label position: absolute; top: 3%; right: 2%; background: rgba(0, 0, 0, 0.5); color: white; padding: 1% 2%; border-radius: 0.1rem; cursor: pointer;;

  • ์ด๋ฏธ์ง€ ์ƒํƒœ ๊ด€๋ฆฌ๋Š” useState๋กœ ์ฒ˜๋ฆฌ

โœ๏ธ ํŽธ์ง‘ ๋ฒ„ํŠผ โ†’ ์ˆ˜์ • ํŽ˜์ด์ง€ ์ด๋™

์œ ์ €๊ฐ€ ์ง์ ‘ ํ”„๋กœํ•„์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํŽธ์ง‘ ๋ฒ„ํŠผ์„ ๋งŒ๋“ค๊ณ , ํด๋ฆญ ์‹œ /editprofile๋กœ ๋ผ์šฐํŒ…๋˜๋„๋ก ํ–ˆ๋‹ค.
EditProfileButton.tsx ์•ˆ์—์„œ useNavigate()๋ฅผ ์‚ฌ์šฉํ•ด ๋ผ์šฐํŒ… ์ฒ˜๋ฆฌ.

const handleEditClick = () => {
  navigate("/editprofile")
}

๊ทธ๋ฆฌ๊ณ  edit ์•„์ด์ฝ˜ + ํ…์ŠคํŠธ๋ฅผ ๊ฐ™์ด ๋„ฃ์–ด ์ง๊ด€์ ์œผ๋กœ ๋ณด์ด๋„๋ก ํ–ˆ๋‹ค.

๐Ÿงพ ๊ฑฐ๋ž˜ ์ƒํƒœ ํ‘œ์‹œ + ๋ฉ”๋‰ด ๊ตฌ์„ฑ

๊ฑฐ๋ž˜ ๊ด€๋ จ ์ •๋ณด๋Š” TradeStatus ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฌถ์—ˆ๋‹ค.
๊ฑฐ๋ž˜ ๊ด€๋ จ ์ง€ํ‘œ๋“ค์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ๊ฐ๊ฐ์˜ TextField, TextFieldWithMargin์„ ์ ์ ˆํžˆ ๋‚˜๋ˆ  ์‚ฌ์šฉํ–ˆ๊ณ , ์ดํ›„ ํŒ๋งค๋‚ด์—ญ, ๊ตฌ๋งค๋‚ด์—ญ, ์ฐœํ•œ๋ชฉ๋ก์€ ์ด๋ฏธ์ง€ ๋ฉ”๋‰ด๋กœ ๋‚˜๋ˆ  UI๋ฅผ ๊ตฌ์„ฑํ–ˆ๋‹ค.

<MenuText top="63%">๊ตฌ๋งค๋‚ด์—ญ</MenuText>
<MenuText top="69%">์ฐœํ•œ๋ชฉ๋ก</MenuText>
  • ๊ฐ ๋ฉ”๋‰ด๋Š” ์ขŒ์ธก์— ์ด๋ฏธ์ง€ ์•„์ด์ฝ˜, ์šฐ์ธก์— ํ…์ŠคํŠธ๋กœ ๊ตฌ์„ฑํ•ด ๊ฐ€๋…์„ฑ๊ณผ ์ง๊ด€์„ฑ์„ ๋™์‹œ์— ์žก์•˜๋‹ค.

๐Ÿ’ก ํšŒ๊ณ 

์Šคํƒ€์ผ๋ง ํฌ์ธํŠธ๊ฐ€ ๋งŽ์€ ํ™”๋ฉด์ด๋ผ ์ฒ˜์Œ์—๋Š” ์œ„์น˜ ์žก๋Š” ๊ฒŒ ํž˜๋“ค์—ˆ๋Š”๋ฐ, position: absolute + transform ์กฐํ•ฉ์œผ๋กœ ํ•ด๊ฒฐํ–ˆ๋‹ค.

์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ถ„๋ฆฌํ•ด์„œ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด์—์„œ ํšจ์œจ์ ์ธ ๊ตฌ์กฐ๋กœ ์žก์€ ๊ฒŒ ํŠนํžˆ ๋งˆ์Œ์— ๋“ค์—ˆ๋‹ค.

๋‹ค๋งŒ ์•„์ง ๋ฐ์ดํ„ฐ๊ฐ€ ์ •์  ์ฆ‰, ๋ชฉ์—…์ด๋ผ, ๋‹ค์Œ์—๋Š” ์œ ์ € ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์—์„œ ๋ฐ›์•„์„œ ์ƒํƒœ ๊ด€๋ฆฌ๋„ ํ•จ๊ป˜ ํ•ด๋ณผ ๊ณ„ํš์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๋ฒˆ์— ์ž‘์—…ํ•˜๋ฉด์„œ left: 50%์™€ transform: translateX(-50%) ์กฐํ•ฉ์ด ์™œ ํ•ญ์ƒ ๊ฐ€์šด๋ฐ ์ •๋ ฌ์ด ๋˜๋Š”์ง€ ์›๋ฆฌ๋ฅผ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ฒŒ ๋๋‹ค.

left: 50%๋Š” ๋ถ€๋ชจ ๊ธฐ์ค€ ์ค‘์•™๊นŒ์ง€ ์™ผ์ชฝ ๋ชจ์„œ๋ฆฌ๋ฅผ ๊ฐ€์ ธ๋‹ค ๋†“๊ณ , translate(-50%)๋Š” ์ž๊ธฐ ๋„ˆ๋น„์˜ ์ ˆ๋ฐ˜๋งŒํผ ๋‹ค์‹œ ์™ผ์ชฝ์œผ๋กœ ๋‹น๊ฒจ์˜ค๋Š” ๋ฐฉ์‹์ด๋ผ๋Š” ๊ฑธ ๊นจ๋‹ฌ์•˜๋‹ค.

์ด์ œ๋Š” ๋ฌด์ž‘์ • ์“ฐ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ์™œ ๊ทธ๋Ÿฐ์ง€ ์•Œ๊ณ  ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ๋๋‹ค๋Š” ์ ์—์„œ ์˜๋ฏธ ์žˆ๋Š” ๋ฐฐ์›€์ด์—ˆ๋‹ค.

profile
์ฝ”๋ฆฐ์ด

0๊ฐœ์˜ ๋Œ“๊ธ€