React์์์ CSS
๋ฆฌ์กํธ์์ CSS๋ฅผ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์๋ค.
CSS ํ์ผ์ import ํ๊ฑฐ๋ module๋ก ์ฌ์ฉํ ์๋ ์๊ณ , SASS ๊ฐ์ ์ ์ฒ๋ฆฌ๊ธฐ๋ tailwind ๋ฑ์ ํ๋ ์์ํฌ๋ฅผ ์ด์ฉํ ์๋ ์๋ค.
๊ทธ์ค์์ ์ค๋์ Styled-components์ ๋ํด์ ์ ๋ฆฌํด๋ณด๋ ค ํ๋ค.
Styled-components์ ๋ํด์ ๋ชฐ๋๋ ๋ถ๋ถ์ด ๋ง์๊ณ ,
๋ฌด์๋ณด๋ค ์ฌ์ฉํด๋ณด๋ ์๊ฐ๋ณด๋ค ๋ ํธํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๋ ๊ฒ์ ์๊ฒ ๋์๊ธฐ ๋๋ฌธ์ด๋ค!
Styled-components
Styled-components๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ CSS๋ฅผ ์์ฑํ๋ CSS-in-JS
๋ฐฉ์์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํด์ CSS ์ฝ๋๋ฅผ ๋ง๋ค์ด๋ด์ ์ปดํฌ๋ํธ๋ฅผ ๊พธ๋ฐ ์ ์๋ค.
์ด๋ฐ CSS-in-JS
๋ฐฉ์์ ํจํค์ง๊ฐ Styled-components ๋ฟ์ธ ๊ฒ์ ์๋์ง๋ง,
์์ ๋ถํฐ ํ์ฌ๊น์ง ๋ง์ ๊ฐ๋ฐ์๋ค์ด ์ฌ์ฉ ์ค์ธ ํจํค์ง๋ค.
์ค์ ๋ก ๊ธ๋ก๋ฒํ ๊ธฐ์ ๋ค์ด ๋ง์ด ์ฌ์ฉํ๊ณ ์๊ธฐ๋ ํ๋ค. (๊ณต์ ์ฌ์ดํธ์ ๋ฐ๋ฅด๋ฉด!..)
์๋๋ Styled-components์ ๊ณต์ ์ฌ์ดํธ๋ค. ๊ณต์๋ฌธ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ ๋ฐฉ๋ฒ ์ฐธ๊ณ ๊ฐ๋ฅ!
https://styled-components.com/
์ค์น
npm์ด๋ yarn์ ํตํด์ ํจํค์ง๋ฅผ ์ค์นํ๋ค.
npm install --save styled-components
yarn add styled-components
์ ์ฉํ ํ๋ฌ๊ทธ์ธ
vscode๋ฅผ ์๋ํฐ๋ก ์ฌ์ฉํ๋ค๋ฉด ์ด ํ๋ฌ๊ทธ์ธ์ ๊ผญ ๊น์.. ๐ฅบ
์ด ํ๋ฌ๊ทธ์ธ์ ์กด์ฌ๋ฅผ ์์๋ค๋ฉด ์ง์๋ถํฐ styled-components๋ฅผ ์ค๊ธฐ์ฐจ๊ฒ ์ผ์ ๊ฒ ๊ฐ๋ค.
์ด ํ๋ฌ๊ทธ์ธ์ ๊น์ง ์๋๋ค๋ฉด, ์ผ์ชฝ๊ณผ ๊ฐ์ด ์๋ ์์ฑ๋.. ๋ฌด์๋ ๋ถ๊ฐ๋ฅํ๋ฉฐ ํ ๋ ํ ๋ css๋ฅผ ์์ฑํด์ผ ํ๋ ์ฌํ ์ผ์ด ๋ฐ์ํ๋ค.
ํ๋ฌ๊ทธ์ธ์ ์ค์นํ์๋ง์! ์ค๋ฅธ์ชฝ๊ณผ ๊ฐ์ด css ํ์ผ์์ ์์ฑํ๋ ๊ฒ์ฒ๋ผ css๋ฅผ ์ ๋ คํ๊ฒ ์ธ ์ ์๋ค.
๋ค๋ง css ํ์ผ์์ ์์ฑํ ๋์ emmet ๋จ์ถํค ๊ธฐ์ค์ ์ข ๋ค๋ฅธ ๊ฒ ๊ฐ์ ์์ฝ๋ค. ((ํน์ ๋ง์ถ ์ ์๋ค๋ฉด ์๋ ค์ฃผ์ธ์..))
Styled-components ์ฌ์ฉํ๊ธฐ
Styled-components์ ๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ ๋ฐฉ๋ฒ์, ๊พธ๋ฐ ์ปดํฌ๋ํธ๋ฅผ ๋จผ์ ๋ง๋ ๋ค ๊ทธ ์์ CSS๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ด๋ค.
๋จผ์ ์๋จ์ styled ํค์๋๋ฅผ import ํ๊ณ ,
import styled from 'styled-components';
styled.div
์ฒ๋ผ styled. ํ๊ทธ๋ช
๊ณผ ๊ฐ์ด ๋ง๋ค๊ณ ์ ํ๋ ์ปดํฌ๋ํธ์ htmlํ๊ทธ๋ฅผ ์ง์ ํด์ค๋ค. ์ด๋ค html ํ๊ทธ๋ ๋ค ๊ฐ๋ฅํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐฑํฑ(``) ์์ CSS๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
const InputArea = styled.div`
display: flex;
justify-content: center;
align-items: center;
padding-bottom: 2rem;
`;
์ด๋ ๊ฒ ๋ง๋ ์ปดํฌ๋ํธ๋ฅผ JSX์์ html ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ฏ ์จ์ฃผ๋ฉด ์๋ฃ!
<InputArea>
<InputWrapper>
<Label htmlFor="title">์ ๋ชฉ</Label>
<Input type="text" value={title} placeholder="์ ๋ชฉ" onChange={(e) => {setTitle(e.target.value);}} />
</InputWrapper>
</InputArea>
Styled-components ํ์ฉ
์กฐ๊ฑด๋ถ ์คํ์ผ๋ง ๊ฐ๋ฅ
CSS-in-JS
์ด๊ธฐ ๋๋ฌธ์ if๋ฌธ, switch๋ฌธ, ์ผํญ ์ฐ์ฐ์ ๋ฑ๋ฑ์ ์ด์ฉํด์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์คํ์ผ๋ง์ ํด์ค ์๋ ์๋ค.
const Box = styled.div`
width: 100px;
height: 100px;
border: 1px solid ${(props) => props.borderColor};
`;
์๋์ ๊ฐ์ด props๋ฅผ ์ง์ ํด์ ์กฐ๊ฑด๋ถ ์คํ์ผ๋ง์ ํ ์ ์๋ค.
<Box borderColor="red">๋ฐ์ค</Box>
์์ฑํ styled-component ์์๋ฐ์ ์ฌ์ฌ์ฉ
withComponent('htmlํ๊ทธ')
๋ฅผ ํตํด์ ์์๋ฐ์ผ๋ฉด์ ์๋ก์ด ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ์ ์๋ค.styled(์ปดํฌ๋ํธ ์ด๋ฆ)
๋ง ์์ฑํ๋ฉด ํด๋น ์ปดํฌ๋ํธ ์คํ์ผ์ ์์ ๊ฐ๋ฅ.
const Box = styled.div`
width: 100px;
height: 100px;
`;
const Button = styled(Box.withComponent('button'))`
border: none;
background-color: #aaa;
`;
SCSS์ฒ๋ผ ์ค์ฒฉํด์ ์์ฑํ๊ธฐ
&
์ฐ์ฐ์๋ฅผ ์ด์ฉํด์ ์ค์ฒฉํด์ ์์ฑ์ด ๊ฐ๋ฅํ๋ค. ์๋ ์ฝ๋๋ Input ์ปดํฌ๋ํธ์ด๋ฉด์ `text` ํด๋์ค๋ฅผ ๊ฐ๊ณ ์๋ ๊ฒฝ์ฐ์ ๋ํด ์์ฑํ๋ค.
const Input = styled.input`
width: 200px;
height: 36px;
border: 1px solid #ccc;
border-radius: 4px;
padding: 0 8px;
font-size: 1rem;
&.text {
width: 340px;
}
`;
์ ์ญ ์คํ์ผ๋ง
CSS ์์
์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์์ํ๊ธฐ ์ ์ normailize.css๋ reset.css๋ฅผ ์ ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ,createGlobalStyle
๋ผ๋ ํจ์๋ฅผ ํตํด์ ๋ชจ๋ ์ปดํฌ๋ํธ์ ์ ์ฉํ ์ ์๋ ์คํ์ผ์ ์ง์ ํ ์๋ ์๋ค.
import { createGlobalStyle } from "styled-components";
const GlobalStyle = createGlobalStyle`
*, *::before, *::after {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
line-height: 1.7;
}
`;
export default GlobalStyle;
์ด๋ ๊ฒ ์์ฑํ ์ ์ญ ์คํ์ผ ์ปดํฌ๋ํธ๋ฅผ ์ต์์ ์ปดํฌ๋ํธ์ ์ถ๊ฐํด์ฃผ๋ฉด ๋ชจ๋ ํ์ ์ปดํฌ๋ํธ์ ์ ์ฉ๋๋ค.
import GlobalStyle from "./GlobalStyle";
import BlogPost from "./BlogPost";
function App() {
return (
<>
<GlobalStyle />
<Box>
<Button>๋ฒํผ</Button>
</Box>
</>
);
}
export default App;
์ฐธ๊ณ
https://hymndev.tistory.com/71
https://www.daleseo.com/styled-components-global-style/
'๐ Studying > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] useRef์ ์ฌ์ฉ ์์ (0) | 2023.04.04 |
---|---|
[React] React-thunk ์์๋ณด๊ธฐ (0) | 2022.12.20 |
[React] State์ Props (0) | 2022.12.07 |
[React] PropTypes๋ก props ํ์ ๊ฒ์ฌ (0) | 2022.12.05 |
[React] ๋ฆฌ๋์ค.. ์ ์ฐ์ฃ ? ํ์์ฑ๊ณผ ๊ทธ ๊ตฌ์กฐ์ ๋ํด (0) | 2022.09.29 |
Comment