์ค์๋ก ์ฌ๋ฌ ํ์ผ์์ ๊ฐ์ ํด๋์ค๋ช
์ ์ด์ฉํด ํด๋์ค๋ช
์ด ๊ฒน์น๊ฒ ๋๋ฉด ์คํ์ผ์ด ์ถฉ๋ํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ ๊ฒฝ์ฐ์ง ์๊ณ ์คํ์ผ์ ์ ์ฉ์ํฌ ์ ์๋ ๋ฐฉ๋ฒ ์ค ํ๋๊ฐ styled-components
์ด๋ค.
๋ชจ๋ ๊ตฌ์ฑ ์์๋ง๋ค ๊ณ ์ ํ ํด๋์ค๋ช
์ ๋๋คํ๊ฒ ์์ฑํด์ฃผ๊ธฐ ๋๋ฌธ์ ํด๋์ค๋ช
์ด ๊ฒน์น ๊ฑฑ์ ์ด ์๋ค.
(+ ํด๋์ค๋ช
์ง๋๋ผ ๊ณ ์ ์ํด๋ ๋๋ค!)
ํ๊ทธ๋ฅผ css๋ก ์ ํ ์ ์๋ค.
ํ์ผ ํ์์ด js ํน์ jsx์ด๋ค.
(์๋ฐ์คํฌ๋ฆฝํธ๋ก ์์ฑํ๋ css์ด๊ธฐ ๋๋ฌธ.)
-> ๋์ค์ ํ๊ฒ์ด ๋ ๊ฒ์ ๋จผ์ ์ ์ธํ๊ธฐ
ex) container ์์ button๊ณผ span์ ๊ดํ style์ด ์์ผ๋ฉด, container๋ฅผ ์ ์ธํ๊ธฐ ์ ์ button๊ณผ span์ ๋จผ์ ์ ์ธํด์ฃผ์ด์ผ ๋์ค์ container์์ button๊ณผ span์ ์ธ ๋ ์ ์ธ์๋๋ค.
yarn add styled-components
ํ์ผํ์์ js ๋ jsx๋ก ์ค์ ํ๋ค.
ํ์ผ๋ช
.styles.jsx
์๋จ์ styled๋ฅผ import ํ๋ค.
import styled from "styled-components";
์์
styled.ํ๊ทธ๋ช '๋ด์ฉ'
๋ฐฑํฑ๊ธฐํธ ์ฌ์ฉ.
ex. styled.buttonmargin:0
import styled from "styled-components";
export const NavigationContainer = styled.div`
height: 70px;
width: 100%;
display: flex;
justify-content: space-between;
margin-bottom: 25px;
`;
์์
styled(ํ๊ทธ์ธ์์)'๋ด์ฉ'
Link
๊ฐ์ ๊ฒ๋ ๊พธ๋ฐ ์ ์๋ค.
.
๋์( )
์ฌ์ฉํ๋ ๊ฒ ์ ์ํ๊ธฐ.
ex. styled(Link)margin:0
import styled from "styled-components";
import { Link } from "react-router-dom"; // ์ฌ์ฉํ๊ธฐ ์ํด import
export const LogoContainer = styled(Link)`
height: 100%;
width: 70px;
padding: 25px;
`;
import { NavigationContainer, LogoContainer} from "./navigation.styles.jsx";
<NavigationContainer>
<LogoContainer to='/'>
<CrwnLogo className="logo" />
</LogoContainer>
<NavigationContainer/>
as = 'ํ๊ทธ๋ช '
as ์์ฑ์ ์ด์ฉํด ํ๊ทธ๋ฅผ ๋ฐ๊ฟ ์ ์๋ค.
import { NavigationContainer } from "./navigation.styles.jsx";
<NavigationContainer as='span'> // div -> span ์ผ๋ก ๋ฐ๊ฟ ์ ์์.
<LogoContainer to='/'>
<CrwnLogo className="logo" />
</LogoContainer>
<NavigationContainer/>
styled(๋ฌผ๋ ค๋ฐ์ ์ปดํฌ๋ํธ)'๋ด์ฉ'
import styled from "styled-components";
export const BaseBtn = styled.button`
min-width: 165px;
width: auto;
height: 50px;
letter-spacing: 0.5px;
line-height: 50px;
padding: 0 35px 0 35px;
`;
export const GoogleSignInBtn = styled(BaseBtn)` // Button ๊ธฐ๋ณธ ์คํ์ผ ๋ฌผ๋ ค๋ฐ๊ธฐ
background-color: #4285f4;
color: white;
&:hover {
background-color: #357ae8;
border: none;
}
`;
svg๋ฅผ importํด์์ ์๊ดํธ ์์ ๋ฃ์ด์ฐ๊ธฐ
styled(svg๋ช )'๋ด์ฉ'
import styled from "styled-components";
import { ReactComponent as ShoppingSvg } from "../../assets/shopping-bag.svg";
export const ShoppingIcon = styled(ShoppingSvg)`
width: 24px;
height: 24px;
`;
props๋ก imageUrl
์ ๋ฌ๋ฐ์.
<div className="background-image" imageUrl={imageUrl} />
background image์ url๋ก ๋ฃ์ด์ค.
import styled from "styled-components";
export const BackgroundImage = styled.div`
width: 100%;
height: 100%;
background-size: cover;
background-position: center;
background-image: ${({ imageUrl }) => `url(${imageUrl})`};
`;
css๋ฅผ ์บก์ํ ํ์ฌ ๋ณ์๋ก ์ฌ์ฉํ ์ ์๋ค.
import { css } from "styled-components";
์์
import styled, { css } from "styled-components";
const subColor = "grey";
const mainColor = "black";
// css ์บก์ํ
const shrinkLabel = css`
top: -14px;
font-size: 12px;
color: ${mainColor};
`;
export const FormInputLabel = styled.label`
color: ${subColor};
font-size: 16px;
font-weight: normal;
position: absolute;
pointer-events: none;
left: 5px;
top: 10px;
transition: 300ms ease all;
${({ shrink }) => shrink && shrinkLabel} // ์ฌ์ฉ
`;
์ด๋ฏธ์ง ์ ์ฉํ๊ธฐ
https://velog.io/@shinwonse/React-styled-components%EC%97%90%EC%84%9C-%EC%9D%B4%EB%AF%B8%EC%A7%80