์ด๋ฒ ํ๋ก์ ํธ์์ styled-components๋ฅผ ์ฌ์ฉํ ์ด์ ๋ CSS์ JS๋ฅผ ๊ฒฐํฉํ์ฌ ๋ ํจ์จ์ ์ธ ์ฝ๋ ๊ด๋ฆฌ์ ์ ์ง๋ณด์๋ฅผ ์ด๋ฃจ๊ธฐ ์ํด์์๋ค. ์ฝ๋๊ฐ ์ ์ ์ปค์ง๊ณ ๋ณต์กํด์ง์ ๋ฐ๋ผ ์ปดํฌ๋ํธํ๋ ์คํ์ผ๋ง์ด ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์คํ์ผ๊ณผ ๊ตฌ์กฐ๊ฐ ๋ถ๋ฆฌ๋ ์ ํต์ ์ธ ๋ฐฉ์์์ ๋ฒ์ด๋, ๊ฐ ์ปดํฌ๋ํธ ๋ด์์ ์ง์ ์คํ์ผ์ ๊ด๋ฆฌํ๋ฉด ๋ ์ง๊ด์ ์ด๊ณ ์ ์ง๋ณด์๊ฐ ์ฉ์ดํด์ง๋ค.
๋จผ์ , BottomNav ์ปดํฌ๋ํธ๋ฅผ ์๋ก ๋ค์ด๋ณด์. ๋ค๋น๊ฒ์ด์ ๋ฐ์ ๊ฐ ์์ด์ฝ์ ํ์ฑํ ์ํ์ ๋ฐ๋ผ ๋์ ์คํ์ผ์ ์ ์ฉํ๋ค. ์๋์ ๊ฐ์ ๋ฐฉ์์ผ๋ก styled-components๋ฅผ ํ์ฉํด ๊ฐ ์ปดํฌ๋ํธ์ ์คํ์ผ์ ์ ์ํ๊ณ ์ ์ฉํ๋ค:
import React, { useState } from 'react';
import { Link } from 'react-router-dom';
import styled from 'styled-components';
import home from '../../assets/home.png';
import community from '../../assets/community.png';
import sell from '../../assets/sell.png';
import chatting from '../../assets/chatting.png';
import profile from '../../assets/profile.png';
const Wrapper = styled.nav`
position: fixed;
bottom: 0;
left: 0;
right: 0;
max-height: 5%;
height: 5%;
overflow: hidden;
border-top: 3px solid grey;
padding-top: 5%;
padding-bottom: 2%;
display: flex;
justify-content: space-between;
`;
const NavLink = styled(Link)`
text-align: center;
width: 20%;
height: 30%;
display: flex;
justify-content: center;
align-items: center;
`;
interface NavItemProps {
isActive: boolean;
}
const NavItem = styled.img<NavItemProps>`
width: 30%;
height: auto;
filter: ${({ isActive }) => (isActive ? 'grayscale(0%) brightness(0.4)' : 'grayscale(100%) brightness(1)')};
transition: filter 0.3s;
`;
const BottomNav: React.FC = () => {
const [activeNav, setActiveNav] = useState<number>(1);
return (
<Wrapper>
<NavLink to="/home" onClick={() => setActiveNav(1)}>
<NavItem src={home} isActive={activeNav === 1} />
</NavLink>
<NavLink to="/community" onClick={() => setActiveNav(2)}>
<NavItem src={community} isActive={activeNav === 2} />
</NavLink>
<NavLink to="/sell" onClick={() => setActiveNav(3)}>
<NavItem src={sell} isActive={activeNav === 3} />
</NavLink>
<NavLink to="/chatting" onClick={() => setActiveNav(4)}>
<NavItem src={chatting} isActive={activeNav === 4} />
</NavLink>
<NavLink to="/profile" onClick={() => setActiveNav(5)}>
<NavItem src={profile} isActive={activeNav === 5} />
</NavLink>
</Wrapper>
);
};
export default BottomNav;
styled-components๋ ์ฌ๋ฌ ๊ฐ์ง ์ฅ์ ์ ์ ๊ณตํ๋ค. ํ๋ก์ ํธ ์ ๋ฐ์ ๊ฑธ์ณ ์ด์ ์ ์ต๋ํํ ์ ์์๋ค.
์คํ์ผ๊ณผ ์ปดํฌ๋ํธ๋ฅผ ํ๋๋ก ๋ฌถ๋ ๋ฐฉ์์ ํตํด ์ฝ๋์ ์ง๊ด์ฑ์ด ๋์์ก๋ค. ๊ฐ UI ์ปดํฌ๋ํธ์ ์คํ์ผ์ ํด๋น ์ปดํฌ๋ํธ ํ์ผ์ ์ ์ํ๋ฏ๋ก, ํ ํ์ผ์์ ์คํ์ผ๊ณผ ๋ก์ง์ ๋ชจ๋ ๊ด๋ฆฌํ ์ ์์๋ค. ์ด๋ฅผ ํตํด ์คํ์ผ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์์ ํ ๋ ์ฝ๋์ ๊ฐ๋ ์ฑ์ด ๋์์ก๊ณ , ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์์ก๋ค.
styled-components๋ props๋ฅผ ํตํ ๋์ ์คํ์ผ๋ง์ด ๊ฐ๋ฅํ๋ค. ์๋ฅผ ๋ค์ด, NavItem ์ปดํฌ๋ํธ๋ isActive๋ผ๋ props๋ฅผ ๋ฐ์์, ์์ด์ฝ์ ํ์ฑํ ์ํ์ ๋ฐ๋ผ grayscale๊ณผ brightness๋ฅผ ์กฐ์ ํ๋ค. ์ด๋ฐ ๋ฐฉ์์ผ๋ก ๊ฐ ์ปดํฌ๋ํธ์ ์ํ ๋ณํ์ ๋ฐ๋ผ ์ฆ๊ฐ์ ์ผ๋ก ์คํ์ผ์ ๋ฐ์ํ ์ ์์๋ค.
์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์คํ์ผ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด์ ์ฝ๋ ์ค๋ณต์ ์ต์ํํ๋ค. ์๋ฅผ ๋ค์ด, NavLink์ NavItem ๊ฐ์ ๊ณตํต์ ์ธ ์คํ์ผ์ ํ๋์ ์ปดํฌ๋ํธ๋ก ์ ์ํ์ฌ ๋ค๋ฅธ ๋ค๋น๊ฒ์ด์ ํญ๋ชฉ์๋ ์ฌ์ฌ์ฉํ ์ ์์๋ค. ๋๋ถ์ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง๊ณ , ์คํ์ผ์ ๋ณ๊ฒฝํ ๋ ํ ๊ณณ๋ง ์์ ํ๋ฉด ๋๋ฏ๋ก ์ ์ง๋ณด์๊ฐ ์ฉ์ดํด์ก๋ค.
styled-components๋ ๊ณ ์ ํ ํด๋์ค๋ช ์ ์๋์ผ๋ก ์์ฑํ๋ค. ๋ฐ๋ผ์ CSS ํด๋์ค ๋ค์ด๋ฐ์์ ๋ฐ์ํ ์ ์๋ ์ถฉ๋ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ ์ ์์๊ณ , ๊ฐ ์ปดํฌ๋ํธ์ ์คํ์ผ์ด ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ๊ฒน์น์ง ์๋๋ก ๋ณด์ฅํ๋ค.
์คํ์ผ์ด ์ปดํฌ๋ํธ์ ํจ๊ป ์ ์๋์ด ์๊ธฐ ๋๋ฌธ์, ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๋ณด๊ณ ์คํ์ผ์ ์ฆ์ ํ์ ํ ์ ์๋ค. ์ด๋ ํ์ ํ๊ฒฝ์์ ๊ฐ๋ ์ฑ์ ํฌ๊ฒ ํฅ์์ํค๊ณ , ์ดํด๋๋ฅผ ๋์ด๋ ๋ฐ ๊ธฐ์ฌํ๋ค.
์คํ์ผ ์ฌ์ฌ์ฉ์ฑ: ์ฝ๋ ์ค๋ณต์ ์ค์์ง๋ง, ์์ง ๋ช๋ช ์คํ์ผ์ ์์ํํ์ฌ ์ ์ญ์ ์ผ๋ก ์ฌ์ฌ์ฉํ๋ ๋ถ๋ถ์ด ๋ถ์กฑํ๋ค. ์๋ฅผ ๋ค์ด, ์์ด์ฝ ํฌ๊ธฐ๋ ์์, ๊ธ์ ํฌ๊ธฐ๋ฑ์ ์์๋ก ์ ์ํด๋๋ฉด ๋ ํจ์จ์ ์ผ ๊ฒ์ด๋ค.
์ ์ฒด ํ๋ก์ ํธ์์ styled-components๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ์ฝ๋๊ฐ ํจ์ฌ ๋ ๊ฐ๊ฒฐํ๊ณ ์ ์ง๋ณด์๊ฐ ์ฉ์ดํด์ก๋ค. ์ปดํฌ๋ํธํ๋ ์คํ์ผ๋ง๊ณผ ๋์ ์คํ์ผ ์ ์ฉ ๋๋ถ์ ์ฌ์ฉ์ ๊ฒฝํ๋ ํฅ์๋์์ผ๋ฉฐ, UI ๋ณ๊ฒฝ์ด ์์ ๋๋ง๋ค ๊ฐํธํ๊ฒ ์์ ํ ์ ์์๋ค. ์์ผ๋ก๋ ์ด ๋ฐฉ์์ ํ์ฉํด ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ค์๋ ์ผ๊ด๋๊ฒ ์ ์ฉํ๊ณ , ๋ ํจ์จ์ ์ธ ์ฝ๋๋ฅผ ๋ง๋ค์ด๋๊ฐ ๊ฒ์ด๋ค.